时间:2022-06-19 10:25:13 | 栏目:C代码 | 点击:次
图像平滑是一种实用的数字图像处理技术,一个较好的平滑处理方法既能消除图像噪声,又不使图像边缘轮廓和线条变模糊。
归一化方框滤波器是很简单的滤波器,输出像素值是核窗口内像素值的均值,如果使用归一化处理,方框滤波就是均值滤波,实际上均值滤波是方框滤波归一化后的特殊情况。均值不能很好的保护细节。
opencv提供了blur函数来实现均值滤波,函数声明如下:
void blur(InputArray src, OutputArray dst, Size ksize, Point anchor = Point(-1, -1), int borderType = BORDER_DEFAULT); src 输入图像 dst 输出图像 Ksize 内核的大小 anchor 锚点 默认值Point(-1, - 1)表示锚位于内核中心。 bordertype 边界像素模式
#include<iostream> #include<opencv.hpp> using namespace std; using namespace cv; int main() { Mat img1, img2; img1 = imread("猫1.jpg"); imshow("原图", img1); blur(img1, img2, Size(20, 20)); imshow("线性滤波", img2); waitKey(0); }
效果如下:
高斯滤波是一种线性平滑滤波,对于除去高斯噪声有很好的效果,高斯滤波是对输入数组的每个点与输入的高斯滤波模板执行卷积计算,然后精这些结果一块组成滤波后的输出数组,具体操作是,用一个模板(或者卷积,掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值,去代替模板中心像素点的值。
opencv提供了GaussianBlur函数来实现均值滤波,函数声明如下:
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY = 0, int borderType = BORDER_DEFAULT); src 输入图像 dst 输出图像 ksize 高斯核大小 他们必须是奇数 sigmax x方向上是高斯核标准差 sigmay y方向上是高斯核标准差 bordertype 边界像素模式
int main() { Mat img1, img2; img1 = imread("猫1.jpg"); imshow("原图", img1); GaussianBlur(img1, img2, Size(35, 35),0); imshow("高斯滤波", img2); waitKey(0); }
效果图:
中值滤波是用像素点领域灰度值的中值来代替该像素点的灰度值,也就是说用一片区域的中间值来代替所有值,可以去除最大值和最小值 ,它的优点是对去除斑点噪声和椒盐噪声很有用,缺点是中值滤波时间是均值滤波的5倍以上
opencv提供了medianBlur函数来实现均值滤波,函数声明如下:
void medianBlur(InputArray src, OutputArray dst, int ksize); src 输入 dst 输出 Ksize 孔径线性尺寸 它必须是奇数且大于1
int main() { Mat img1, img2; img1 = imread("猫1.jpg"); imshow("原图", img1); medianBlur(img1, img2,9); imshow("中值滤波", img2); waitKey(0); }
效果如下:
之前所说的滤波器都是为了平滑图像,问题是有些时候这些滤波器不仅削弱了噪声,连带着吧边缘也磨掉了,为了避免这样的情形(至少在一定程度上),我们可以使用双边滤波,它是一种非线性滤波器,它可以达到边缘,降噪平滑的效果,也是采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度。双边滤波与高斯滤波相比,对于图像的边缘信息能够更好的保存
opencv提供了bilateralFilter函数来实现均值滤波,函数声明如下:
void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType = BORDER_DEFAULT); src 输入 dst 输出 d 滤波时所用的每个像素邻域的直径 sigmaColor 在颜色空间中过滤。 sigmaSpace 在坐标空间中过滤 borderType 边界像素模式
int main() { Mat img1, img2; img1 = imread("猫1.jpg"); imshow("原图", img1); bilateralFilter(img1, img2, 30,30,30); imshow("双边滤波", img2); waitKey(0); }
效果如下: