模糊操作是为了给图像预处理时候降低噪声的干扰,Smooth和Blur是图像处理中最简单和常用的操作之一。使用Smooth/Blur操作的背后就是数学的卷积计算。
假设有6*6的图像像素点矩阵
卷积过程:6*6上面是个3*3的窗口,从左到右,从上到下的移动,黄色的每个矩阵上的值与对应下面图像上的像素值进行相乘并求和,然后取平均值赋给中心红色图像上的像素值作为卷及处理后的新像素值。平移时每次移动一个像素值。
3*3的卷积核会造成图像最边缘的一行无法处理,OpenCV中有相应的处理方法,最常见的是通过差值进行计算,向外部扩展需要的像素。
归一化盒子滤波(均值滤波)
CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
Size ksize, Point anchor = Point(-1,-1),
int borderType = BORDER_DEFAULT );
参数src:输入待模糊的图像
参数dst:输出模糊后的图像
参数ksize:卷积核大小
参数anchor:卷积核中心的位置,缺省值Point(-1,-1)表示卷积核的正中心。
blur(src, dst, Size(3, 3), Point(-1, -1));
blur(src, dst, Size(1, 10), Point(-1, -1));
高斯滤波
CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
double sigmaX, double sigmaY = 0,
int borderType = BORDER_DEFAULT );
参数src:输入待模糊的图像
参数dst:输出模糊后的图像
参数ksize:卷积核大小
参数sigmaX:调节高斯分布X的标准差
参数sigmaY:调节高斯分布Y的标准差
其中Size(x,y),x,y必须是正数且是奇数
GaussianBlur(src, Gaussian, Size(3, 3), 11, 11);
中值滤波
中值滤波是一种统计排序的滤波器,对椒盐噪声有很好的抑制作用。
3*3邻域像素排序如下:
115,119,120,123,124,125,126,127,150
中指等于:124
均值等于:125.33
将124赋值给图中像素值为150的图像的位置。
CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );
参数src:输入待模糊的图像
参数dst:输出模糊后的图像
参数ksize:卷积核大小
medianBlur(src, dst, 3);
双边滤波:
均值滤波克服边缘信息的丢失缺陷。原因是均值滤波是基于平均权重。
高斯滤波虽然克服了部分该缺陷,但仍无法避免,因为没有考虑像素值的不同。
高斯双边滤波是边缘保留的滤波方法,避免了边缘信息丢失,保留图像轮廓不变。
输入图片,对图片进行高斯滤波的同时,判断其邻域内是否有灰度值梯度较大的部分,滤波只在平滑部分进行,不在存在较大梯度的部分进行。
CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace,
int borderType = BORDER_DEFAULT );
参数src:输入待模糊的图像
参数dst:输出模糊后的图像
参数d:计算邻域的半径,半径以内的像素将被用来滤波,如果使用使用-1,则根据参数sigmaSpace来计算
参数sigmaColor:决定差值多少以内的像素会被计算
参数sigmaSpace:只要像素之间的颜色比较接近,则像素之间相互影响的范围就越广。当参数d>=0时,该参数无效,其余时候,d与sigmaSpace成正比。
bilateralFilter(src, dst, 15, 100, 3);
GaussianBlur(src, Gaussian, Size(15, 15), 3, 3);
双边滤波+图像锐化:
bilateralFilter(src, dst, 15, 100, 3);
Mat kernel = (Mat_(3, 3) << 0, -1, 0,
-1, 5, -1,
0, -1, 0);
filter2D(dst, resultImg, -1, kernel, Point(-1, -1), 0);