图像处理——滤波器的比较

滤波器

  • 方框滤波——boxFilter
  • 均值滤波——blur
  • 高斯滤波——GaussianBlur
  • 中值滤波——medianBlur

线性滤波器

线性滤波器经常用于剔除输入信号中不想要的频率或者从许多频率中选择一个想要的频率。常见的有:低通、高通、带通、带阻、全通、陷波
每个信号的输出值是一些输入像素的加权和

  • 方框滤波——boxFilter
  • 均值滤波——blur (归一化后的方框滤波)
  • 高斯滤波——GaussianBlur

非线性滤波器

  • 中值滤波——medianBlur
    在处理类似于椒盐噪声这种散粒噪声时,使用中值滤波有时可以达到更好的效果
    优势: 在均值滤波中,由于噪声成分被放入平均计算中,所以输出受到了噪声的影响。但是在中值滤波器中,由于噪声成分很难选上,所以几乎不会受影响。
    劣势: 中值滤波花费的时间是均值滤波的5倍以上。

代码演示

#include 
#include 
using namespace cv;
using namespace std;

int main()
{
	Mat src = imread("G:/picture/cs.jpg");
	if (src.empty())
	{
		cout << "could not load image..." << endl;
	}
	Mat roi;
	//修改图像大小
	resize(src, roi, Size(300, 300));
	//遍历每个像素,用at()函数为随机选取的像素点赋一个随机值
	for (int i = 0; i < roi.rows; i++)
	{
		for (int j = 0; j < roi.cols; j++)
		{
			//当导入的时灰度图
			if (roi.channels() == 1)
			{
				if (rand() % roi.cols == j)
				{
					roi.at(i, j) = rand() % 255;  //模上255是为了将随机值限定在(0,255)内
				}	
			}
			//当导入彩色图
			else if (roi.channels() == 3)
			{
				if (rand() % roi.cols == j)
				{
					Vec3b p;
					p[0] = rand() % 255; 
					p[1] = rand() % 255;
					p[2] = rand() % 255;
					roi.at(i, j) = p;
				}
			}
		}
	}
	Mat median,gaussian,avgblur;
	blur(roi, avgblur, Size(3, 3));//均值
	GaussianBlur(roi, gaussian,Size(3,3),0,0);//高斯
	medianBlur(roi, median, 3);//中值
	imshow("roi",roi);
	imshow("blur", avgblur);
	imshow("Gaussian", gaussian);
	imshow("medianBlur", median);
	waitKey(100000);
	return 0;
}
	

输出结果

  • 椒盐噪声图(roi)
    图像处理——滤波器的比较_第1张图片
  • 均值
    图像处理——滤波器的比较_第2张图片
  • 高斯滤波
    图像处理——滤波器的比较_第3张图片
  • 中值滤波效果图
    图像处理——滤波器的比较_第4张图片
    可以看到,线性滤波器(均值、高斯)处理之后图中仍可以看到“斑点”,而中值滤波则完美的达到“磨皮”效果,由此得出在处理椒盐噪声是应选择中值滤波。

你可能感兴趣的:(OpenCV)