模糊处理(上)--均值模糊和中值模糊(opencv学习记录--3)
Posted 九柳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模糊处理(上)--均值模糊和中值模糊(opencv学习记录--3)相关的知识,希望对你有一定的参考价值。
0.前言
图像模糊,原理上利用了数学上的卷积。虽然但是,我觉得就我学到的四个模糊方式,暂且不需要用卷积来解释。但是也是可以先去了解一下用卷积来解释的模糊处理。多学点东西准没坏处吖。(其实我也没完全弄懂这玩意,而且一起写起来可能会很冗长,等我慢慢搞明白再水写一篇吧)
但是说起模糊处理,我们先来理解啥是模糊吧。
1.什么是模糊?
模糊,我觉得近视特别是像我这种有高度近视的同学应该很熟悉,当你摘下眼镜之后,你会觉得世界都变成了一片,此时我们无法察觉物体的各个细节以及不同物体之间的边界。或者没有近视的同学,可以用自己手机拍一张失焦的照片。也可以参考下面这个图
那么反应在计算机里面,什么是模糊呢?
我们知道图片是由像素构成的,也就是像素的多少和像素值来取决于图片呈现给我们观感。
我们在不改变像素的多少的前提下,通过知道相邻的像素值相差的更多的时候,我们便会觉得这个图片显示的更为分明,也就是说,
如果把相邻的像素点的值变得更为相近,那么是不是我们就会对应的丢失更多细节和边缘?也就会达到了模糊的效果。
然后我们看opencv提供的几种模糊的实现
2.均值模糊
1.原理
假设我们现在有一个图片是6*6的像素,然后我们把每一个点的像素值改为他周围的像素值和他本身的像素值的均值,最后的出来的便是经过均值模糊生成的图片。而我们确定的每一次处理的大小便是一个3*3的像素矩阵。
用矩阵来表示:
其实最后均值模糊的意思就是:
你先确定一个size(像素矩阵的大小),然后把图像的每一个像素都按照这个size去取自己和周围像素的均值然后赋给自己。size越大,也就是越大范围内的像素点的值都会更加相似,也就是说图像更加的模糊。(当然函数决定也可以不赋给自己)
ps:在均值滤波中所乘的全为1的矩阵如果用卷积来理解,便被称为卷积核。只是这个矩阵倒过来后仍然为原矩阵,高斯滤波所乘的高斯函数倒过来其实应该也是他自己,所有没用用卷积来解释,反而感觉会更加迷茫,不明白为什么模糊一定要用到卷积。
我觉得更好的说法是,模糊可以用卷积去解释,而图像处理其他很多也可以用卷积去解释
2.API
blur(Mat src, Mat dst, Size(xradius, yradius), Point(-1,-1));
src是你要处理的图像
dst是你处理完后的图像
Size()就是每一次处理的像素矩阵的大小
Point(-1,-1)就是默认将最后的平均值赋给中间像素
3.案例
这里通过滑轨调节size的大小你可以看一下这个效果(ps:size的x,y值不能拖到0!!!!)
int main(int argc, char** argv)
string path = "elment/xjj.jpg";
Mat img = imread(path);
Mat img2 = Mat::zeros(img.size(),img.type());
Size size(7, 7);
imshow("img", img);
int x = 1, y = 1;
namedWindow("Trackbars", (640, 200));//新建了一个窗口--轨迹栏
createTrackbar("x", "Trackbars", &x, 200);
createTrackbar("y", "Trackbars", &y, 200);
while (1)
size.height = x;
size.width = y;
GaussianBlur(img,img2,size,0,0);
imshow("img", img2);
waitKey(10);
return 0;
2.中值模糊
1.原理
如果你理解了均值函数的定义,那这个你可以直接从字面意思去理解
就是将size()的那个矩阵里面的所有像素的中值赋值给中间像素
2.API
medianBlur(Mat src, Mat dest, ksize)
注意一下ksize,这是一个int,也就是x和y要相等,并且ksize必须是奇数。
3.作用
可以用来消除椒盐噪声
椒盐噪声就是在图像上随机出现黑色白色的像素。
原理:因为椒盐噪声即黑色或者白色的像素点的值是很大的,所以他本身肯定不会是中值,然后被中值替代
3.水了,就这样~
饿了,先去吃饭,之后再总结一下高斯模糊和双边模糊。。。
以上是关于模糊处理(上)--均值模糊和中值模糊(opencv学习记录--3)的主要内容,如果未能解决你的问题,请参考以下文章