问题描述:
比较均值滤波、中值滤波、高斯滤波在不同窗口尺寸下,对于不同噪音(椒盐噪音、高斯噪音)的抑制效果。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src1, src2, dst1, dst2, gblur1, gblur2, mblur1, mblur2;
src1 = imread("E:\\picture\\1-1g.jpg");
src2 = imread("E:\\picture\\1-2j.jpg");
if (!src2.data || !src1.data)
{
printf("could not load image...\n");
return -1;
}
imshow("高斯噪声原图", src1);//原图显示
imshow("椒盐噪声原图", src2);//原图显示
//均值滤波操作
//src:输入图像
//dst:输出图像
//Size里面都要奇数,正数。内核内数值分别表示宽,高。
//Point(-1,-1):表示锚点,一般取-1,表示锚点在核中心。
blur(src1, dst1, Size(5, 5), Point(-1, -1));
blur(src2, dst2, Size(5, 5), Point(-1, -1));
imshow("高斯噪声-均值滤波", dst1);
imshow("椒盐噪声-均值滤波", dst2);
//高斯滤波操作
//src:输入图像
//gblur:输出图像
//Size里面都要奇数,正数。内核内数值分别表示宽,高。
//x方向方差
//Y方向方差
GaussianBlur(src1, gblur1, Size(15, 15), 11, 11);//高斯滤波
GaussianBlur(src2, gblur2, Size(15, 15), 11, 11);//高斯滤波
imshow("高斯噪声-高斯滤波", gblur1);
imshow("椒盐噪声-高斯滤波", gblur2);
//中值滤波操作
//src:输入图像
//mblur::输出图像
//模板宽度,为奇数
medianBlur(src1, mblur1, 3);
medianBlur(src2, mblur2, 3);
imshow("高斯噪声-中值滤波", mblur1);
imshow("椒盐噪声-中值滤波", mblur2);
waitKey(0);
return 0;
}
通过得到的结果,可以发现均值滤波、中值滤波、高斯滤波,对于不同噪音(椒盐噪音、高斯噪音)的抑制效果是不同的:
1、均值滤波直观地理解就是用相邻元素灰度值的平均值代替该元素的灰度值,所以它不能很好地保护细节。
2、高斯滤波一般针对的是高斯噪声,能够很好的抑制图像输入时随机引入的噪声,将像素点跟邻域像素看作是一种高斯分布的关系,它的操作是将图像和一个高斯核进行卷积操作。
3、中值滤波将窗口函数里面的所有像素进行排序取得中位数来代表该窗口中心的像素值,对椒盐噪声和脉冲噪声的抑制效果特别好。
结论:从滤波的结果可以看出各种滤波算法对图像的作用非常不同,有些变化非常大,有些甚至跟原图一样。在实际应用时,应根据噪声的特点、期望的图像和边缘特征等来选择合适的滤波器,这样才能发挥图像滤波的最大优点。