滤波器
- 方框滤波——boxFilter
- 均值滤波——blur
- 高斯滤波——GaussianBlur
- 中值滤波——medianBlur
线性滤波器
线性滤波器经常用于剔除输入信号中不想要的频率或者从许多频率中选择一个想要的频率。常见的有:低通、高通、带通、带阻、全通、陷波
每个信号的输出值是一些输入像素的加权和
- 方框滤波——boxFilter
- 均值滤波——blur (归一化后的方框滤波)
- 高斯滤波——GaussianBlur
非线性滤波器
- 中值滤波——medianBlur
在处理类似于椒盐噪声这种散粒噪声时,使用中值滤波有时可以达到更好的效果
优势: 在均值滤波中,由于噪声成分被放入平均计算中,所以输出受到了噪声的影响。但是在中值滤波器中,由于噪声成分很难选上,所以几乎不会受影响。
劣势: 中值滤波花费的时间是均值滤波的5倍以上。
代码演示
#include <opencv2/opencv.hpp>
#include <iostream>
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<uchar>(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<Vec3b>(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)
- 均值
- 高斯滤波
- 中值滤波效果图
可以看到,线性滤波器(均值、高斯)处理之后图中仍可以看到“斑点”,而中值滤波则完美的达到“磨皮”效果,由此得出在处理椒盐噪声是应选择中值滤波。