中值滤波
中值滤波是比较常用的一种图像平滑处理方法。
其基本思路是通过滤波器遍历图像,取滤波器区域像素值中值为新的像素值。
表示为数学表达式如下:
![53bb215ee86a2569b9439b6624bf1145.png](https://i-blog.csdnimg.cn/blog_migrate/89d4d71bfdddc91bb2ecc146231ebc03.png)
其中,f(x,y)和g(x,y)分别是原图像和处理后图像,
(x,y),(s,t)均为像素点坐标。
如果是(3*3)的模板,就是对这3*3个像素点的值进行排序,(x,y)取值为排序之后的中值。
可以用opencv自带的函数medianBlur()实现中值滤波,代码如下:
![b4719bdaf52971476343a8e504ecd493.png](https://i-blog.csdnimg.cn/blog_migrate/615ed299d6e062843aecc1ef96c6914c.png)
其运行结果如下,左图为加了噪声的原图,右图为中值滤波后的图。
![a0d3851c33dd62b90c55e0e3fa692d87.png](https://i-blog.csdnimg.cn/blog_migrate/322fa4ea70e9ddbf161ea266e4bd5d06.png)
从上图可看出,中值滤波可以有效地消除噪声,并且相对于均值滤波,它能够更好地保护边缘信息,图像的视觉效果更好。
当然,也可以逐像素点对图像进行运算,来求得中值并进行赋值,代码如下图所示:
![e40ba794dcf9d39bde2e435e50b672bd.png](https://i-blog.csdnimg.cn/blog_migrate/7ae9daebd949cb8123d5dd8269e96787.png)
代码中用到了自定义的函数如下:
![48bf88881b19e81da2aad3fa04009427.png](https://i-blog.csdnimg.cn/blog_migrate/7889683037ca5614e62872d659c2b866.png)
其中
paixu()是对序列a进行从大到小的排序,median()是求序列a的中值,twotoone()是将列表从二维降到一维,这三个自定义的函数的目的都是为了求中值。
可能有更好的办法,只是我没有找到python或者numpy中自带的求中值的函数,只能自己写了。
其运行结果如下:
![41a70202fce5132b44b48d5d665749ce.png](https://i-blog.csdnimg.cn/blog_migrate/4b007ab203927c755b2bd5611d74ebad.png)