在实际业务中经常会需要对图片做平滑处理,如模糊,锐化等方便获取到更多图片特征信息,OpenCV共提供了13种函数,本章节介绍以下5种:
1.blur
2.boxFilter
3.sqrtBoxFilter
4.medianBlur
5.GaussianBlur
1.函数 blur (均值滤波)
定义:
void blur( InputArray src, OutputArray dst, Size ksize, Point anchor = Point(-1,-1), int borderType = BORDER_DEFAULT );
def blur(src, ksize, dst=None, anchor=None, borderType=None)
参数:
src:输入图像
dst:输出图像
ksize:滤波器的大小,越大模糊越厉害
anchor:滤波器的中心,通常采用默认值
borderType:边界类型,通常采用默认值
作用:图像模糊,也称为均值滤波,可以用于图片模糊效果如毛玻璃,也可以用于部分场景下图片边框填充,如锐利边框补充
使用案例
#python code
img=cv2.imread("xxx.jpg")
blur_image=cv2.blur(img,(2,2))
merge = np.hstack((img, blur_image))
plt.figure("blur_image")
plt.title("blur_image")
plt.imshow(merge)
plt.show()
#C++ code
#include
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src = imread("xxx.jpg", 1);
Mat dst;
Size size(11, 11);
blur(src, dst, size);
namedWindow("src", 0);
imshow("src", src);
namedWindow("dst", 0);
imshow("dst", dst);
waitKey(0);
return 0;
}
2.函数 boxFilter (盒子滤波,与均值滤波类似)
定义:
void boxFilter( InputArray src, OutputArray dst, int ddepth,Size ksize, Point anchor = Point(-1,-1),bool normalize = true,int borderType = BORDER_DEFAULT );
def boxFilter(src, ddepth, ksize, dst=None, anchor=None, normalize=None, borderType=None)
参数:
src:输入图像
dst:输出图像
ddepth:输出图像的数据类型
ksize:滤波器的大小
anchor:滤波器的中心,通常采用默认值
normalize:是否归一化
borderType:边界类型,通常采用默认值
作用:盒子滤波,与均值滤波类似,个人感觉模糊效果比均值更好
使用案例
#python code
img=cv2.imread("demo.jpg")
box_blur_image = cv2.boxFilter(img,cv2.CV_8U,(2,2))
merge = np.hstack((img, box_blur_image))
plt.figure("box_blur_image")
plt.title("box_blur_image")
plt.imshow(merge)
plt.show()
#C++ code
#include
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src = imread("demo.jpg", 1);
Mat dst;
Size size(11, 11);
boxFilter(src, dst,src.depth(), size);
namedWindow("src", 0);
imshow("src", src);
namedWindow("dst", 0);
imshow("dst", dst);
waitKey(0);
return 0;
}
3.函数 sqrtBoxFilter (归一化平方和盒子滤波)
定义:
void sqrBoxFilter( InputArray src, OutputArray dst, int ddepth,Size ksize, Point anchor = Point(-1, -1), bool normalize = true, int borderType = BORDER_DEFAULT );
def sqrBoxFilter(src, ddepth, ksize, dst=None, anchor=None, normalize=None, borderType=None)
参数:
src:输入图像
dst:输出图像
ddepth:输出图像的数据类型
ksize:滤波器的大小
anchor:滤波器的中心,通常采用默认值
normalize:是否归一化
borderType:边界类型,通常采用默认值
作用:归一化平方和盒子滤波,与均值滤波类似。
使用案例
#python code
img=cv2.imread("xxx.jpg")
sq_blur_image = cv2.sqrBoxFilter(img,cv2.CV_8U,(2,2))
merge = np.hstack((img, sq_blur_image))
plt.figure("sq_blur_image")
plt.title("sq_blur_image")
plt.imshow(merge)
plt.show()
#C++ code
#include
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src = imread("xxx.jpg", 0);
Mat dst;
Size size(20, 20);
sqrBoxFilter(src, dst, -1, size);
normalize(dst, dst, 0, 255, NORM_MINMAX);
convertScaleAbs(dst, dst);
namedWindow("src", 0);
imshow("src", src);
namedWindow("dst", 0);
imshow("dst", dst);
waitKey(0);
return 0;
}
根据效果图不难看出归一化滤波更能突出暗部特征
4.函数 medianBlur (中值滤波)
定义:
void medianBlur( InputArray src, OutputArray dst, int ksize );
参数:
src:输入图像
dst:输出图像
ksize:滤波器的大小,注意该值必须是单数1/3/5/7/…
作用:中值滤波,平滑图片,去除图片噪点
使用案例
#python code
img=cv2.imread("xxx.jpg")
medianBlur = cv2.medianBlur(img,5)
merge = np.hstack((img, medianBlur))
plt.figure("blur_image")
plt.title("blur_image")
plt.imshow(merge)
plt.show()
#C++ code
#include
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src = imread("xxx.jpg", 1);
Mat dst;
medianBlur(src, dst, 5);
namedWindow("src", 0);
imshow("src", src);
namedWindow("dst", 0);
imshow("dst", dst);
waitKey(0);
return 0;
}
5.函数GaussianBlur (图片高斯模糊)
定义:
void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY = 0, int borderType = BORDER_DEFAULT );
def GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
参数:
src:输入图像
dst:输出图像
ksize:滤波器的大小,【注意该值只能是单数】
sigmaX: X方向的高斯核标准偏差
sigmaY: Y方向的高斯核标准偏差
borderType:边界类型,通常采用默认值
作用:高斯滤波,调整滤波器的大小和 X Y方向标准差可以得到不同效果的模糊,与blur效果相似
#python code
img=cv2.imread("xxx.jpg")
GaussianBlur = cv2.GaussianBlur(img,(5,5),1,11)
merge = np.hstack((img, GaussianBlur))
plt.figure("GaussianBlur")
plt.title("GaussianBlur")
plt.imshow(merge)
plt.show()
#C++ code
#include
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src = imread("xxx.jpg", 1);
Mat dst;
Size size(5, 5);
GaussianBlur(src, dst,size,1.2,0);
namedWindow("src", 0);
imshow("src", src);
namedWindow("dst", 0);
imshow("dst", dst);
waitKey(0);
return 0;
}