1、原理的简单描述
a)黄色的是掩模也就是算子,灰色的是原图。然后看一下像素操作过程:(黄色)算子的9个像素(包括中心红色那个)和(灰色)原图对应位置的像素相乘之和的平均值重新赋给原图中心红色那个像素的过程。 然后掩模按照设定的步长向后移动重复上述过程。
b)会发现用3*3大小的掩模处理图像,原图边缘会有一个像素处理不了,如果用5*5大小的掩模处理图像,原图边缘会有两个像素处理不到。处理手段一般是采用padding填充方法。
2、几种滤波的主要区别
均值滤波就是将卷积核和图像对应位置相乘的结果取平均值赋给中心锚点的过程
中值滤波就是卷积核锚点对应的像素值用周边的元素的排序的中间值替代的过程,能很好地保护边缘信息
高斯滤波就是将卷积核按照高斯分布变成一定的权重值,最后将权重值和像素值相乘结果的和来替代锚点像素值的过程,按照高斯滤波的意思,离锚点越远的地方权重分配越低(离正态分布中心点越远)
1、均值滤波
blur(Mat src,Mat dst,Size(),Point(-1,-1))
一般Point(-1,-1)不改动,它表示中心像素的位置
2、高斯模糊
参考详细介绍:https://blog.csdn.net/weixin_41042404/article/details/81608178
GaussianBlur(Mat src,Mat dst,Size(),sigmax,sigmay)
其中Size(x,y),x,y必须是整数而且是奇数
sigmaX和sigmaY分别为高斯滤波在横线和竖向的滤波系数.详细参考:https://blog.csdn.net/vblittleboy/article/details/9187447
1、均值模糊
实现代码:
#include
#include
using namespace std;
using namespace cv;
int main(int argv, char** argc)
{
Mat src, dst_1,dst_2,dst_3;
src = imread("../../../lena.jpg");
if (!src.data) {
printf("could not load image...");
return -1;
}
char input_title[] = "input_image";
//char output_title[] = "output_image";
imshow(input_title, src);
//Size(1,15)设置纵向模糊,Size(15,1)设置横向模糊,可以自行调试
blur(src, dst_1, Size(15, 15), Point(-1, -1));
blur(src, dst_2, Size(15, 1), Point(-1, -1));
blur(src, dst_3, Size(1, 15), Point(-1, -1));
imshow("纵横模糊", dst_1);
imshow("横向模糊", dst_2);
imshow("纵向模糊", dst_3);
waitKey(0);
return 0;
}
输出结果:
2、高斯模糊
实现代码:
#include
#include
using namespace std;
using namespace cv;
int main(int argv, char** argc)
{
Mat src, dst_blur,dst_gaussion;
src = imread("../../../lena.jpg");
if (!src.data) {
printf("could not load image...");
return -1;
}
char input_title[] = "input_image";
//char output_title[] = "output_image";
imshow(input_title, src);
//均值模糊
blur(src, dst_blur, Size(11, 11), Point(-1, -1));
imshow("dst_blur", dst_blur);
//高斯模糊
GaussianBlur(src, dst_gaussion, Size(11, 11), 11, 11);
imshow("dst_gaussion", dst_gaussion);
waitKey(0);
return 0;
}
输出结果:
然而并不能看出太大区别[捂脸]... .. .