线性滤波因其是线性计算,所以容易构造,但却是一种平庸的方法,实现的效果也是很平庸。要想实现蒂花之秀,就要不走寻常路,所以小林祭出非线性滤波。
非线性滤波在OpenCV中主要有中值滤波和双边滤波,他们相比线性滤波,在去除噪点方面更胜一筹。
一、中值滤波
中值滤波的基本思想是,将待处理像素点的邻域像素值由小到大排列,然后取其中值作为待处理像素的像素值。
如何我们将核的大小设置为3,中值滤波就会对核中的9个数字进行排序,然后将中心点的像素值换成中值,如下图所示:
- 相比均值滤波的优点:均值滤波,由于是加权平均,输出像素值易受噪点影响,而中值滤波只是简单的像素值排列取中值,处于极端的噪点几乎会被无视掉。
- 相比均值滤波的缺点:效率比均值滤波 慢多啦。
- 函数原型:
dst = cv2.medianBlur(src, ksize[, dst])
- src:通道数需为1、3或4个通道;当ksize取3或5时,图像数据类型可以为CV_8U、CV_16U或CV_32F;当ksize大于5时,图像数据类型只能为CV_8U。
- ksize:核的大小,需为大于1的奇数。
二、双边滤波
- 优点:相比高斯滤波能更好的保护边缘信息不受模糊的影响
- 缺点:正是由于他的优点,使得他不能很好地滤除边缘区域地噪点,且耗时长
函数原型:
dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
- src:8位或浮点型,1或3通道
- d:滤波时的邻域半径,若为负值,则由参数sigmaSpace确定
- sigmaColor:颜色空间滤波器的sigma值。值越大,就表明该像素邻域内有更宽广的颜色会被混合到一起,产生较大的半相等颜色区域
- sigmaSpace:坐标空间中滤波器的sigma值。值越大,意味着越远的像素会相互影响,从而使更大的区域和足够相似的颜色。当d大于0,d指定了邻域大小且与sigmaSpace无关。否则,d正比于sigmaSpace。
![](https://i-blog.csdnimg.cn/blog_migrate/442ad22fbe8e0eb7eb5b5b995d709234.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a3df7b74be6ce85796b91d4c93ebc281.png)
![](https://i-blog.csdnimg.cn/blog_migrate/58864a37a2b1d7b65c1d25467f93d410.png)
img = imread("D:\\cv_study\\随机练\\lena.jpg");
medianBlur(img, m0, 17);
boxFilter(img, m1, img.depth(), Size(17, 17));
中值的效果比均值好,双边对边缘信息保留的很好。