局部预处理可以分为二种,一种是平滑,一种是梯度算子。本文主要记录平滑。
平滑的目的在于抑制噪声或者其他小的波动,这等同于在傅里叶变换域抑制高频部分。但是平滑也会模糊所有的带有重要信息的明显边缘。故而具备保持边缘作用的平滑方法得到了更多关注。常见的有基于二维离散卷积的高斯平滑、均值平滑、基于统计学习方法的中值平滑,具备保持边缘的双边滤波、导向滤波等。
OpenCV提供函数cv2.filter2D()可以让我们对衣服图像进行卷积操作。下面是一个5×5的平均滤波器核:
代码如下:
import cv2
import numpy as np
img = cv2.imread('D:/codes/shan.jpg')
kernel = np.ones((5,5),np.float32)/25
#when ddepth=-1, the output image will have the same depth as the source.
dst = cv2.filter2D(img,-1,kernel)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
这是由一个归一化卷积框完成的。他只是用卷积框覆盖区域所有像素的平均值来代替中心元素。可以使用函数 cv2.blur() 和 cv2.boxFilter() 来完这个任务。下面是一个3×3的归一化卷积框:
代码如下:
#平均
import cv2
img = cv2.imread('D:/codes/shan.jpg')
blur = cv2.blur(img,(5,5))
cv2.imshow('blur', blur)
cv2.waitKey()
cv2.destroyAllWindows()
现在把卷积核换成高斯核(简单来说,方框不变,将原来每个方框的值是相等的,现在里面的值是符合高斯分布的,方框中心的值最大,其余方框根据距离中心元素的距离递减,构成一个高斯小山包。原来的求平均数现在变成求加权平均数,全就是方框里的值)。即求高斯滤波器是求中心点邻近区域像素的高斯加权平均值。实现的函数是 cv2.GaussianBlur()。我们需要指定高斯核的宽和高(必须是奇数)。
使用高斯模糊,上面代码应改写为:
#0 是指根据窗口大小( 5,5)来计算高斯函数标准差
blur = cv2.GaussianBlur(img,(5,5),0)
当然,如果愿意,可以用cv2.getGaussianKernel() 构建一个高斯核。
类似于卷积,也是一种领域计算,讲邻域中的像素点按灰度值进行计算,然后选择该组中值作为输出的灰度值。这个滤波器经常用来去除椒盐噪声。前面的滤波器都是用计算得到的一个新值来取代中心像素的值,而中值滤波是用中心像素周围(也可以使他本身)的值来取代他。他能有效的去除噪声。邻域的大小也应该是一个奇数。
可将如上代码改为:
median = cv2.medianBlur(img,5)
中值滤波最重要的能力是去除椒盐噪声。
高斯滤波器是求中心点邻近区域像素的高斯加权平均值。这种高斯滤波器只考虑像素之间的空间关系,而不会考虑像素值之间的关系(像素的相似度)。所以这种方法不会考虑一个像素是否位于边界。因此边界也会别模糊掉,而这正不是我们想要。
双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函数确保只有邻近区域的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算。所以这种方法会确保边界不会被模糊掉,因为边界处的灰度值变化比较大。
将上面代码改为:
blur = cv2.bilateralFilter(img,9,75,75)
还是有点不一样,图像纹理变模糊,但边界还在。
要通过Python+OpenCV的API实现联合双边滤波,就必须在Python安装contrib模块,实现OpenCV图像扩展功能。它的安装命令是pip install opencv-contrib-python
。当然如果你也可以下载后再进行安装。这里有个网址Python扩展模块大全。在这个网站你可以下载你所需要的模块。
联合双边滤波的接口:
网址为:OpenCV3.0联合双边滤波
当然你可以通过这个网站跳到其他API接口上。目前博主没有使用过这个函数,后续会补充上。
同上联合双边滤波,网址:导向滤波