图像中经常会出现噪声,这些噪声在频域角度看来属于高频部分,使用低通滤波器可以去除噪声点
1.2D卷积
2D卷积其本质上也是一个加权平均的过程,openCV提供cv2.filter2D(src ,deepth,kernel)函数进行2D卷积,其中kernel是我们需要提供的卷积核,deepth一般为-1.
卷积核的工作原理:
卷积核一般为一个奇数级的矩阵,其中所有元素的和为1,假设卷积核A在图像上滑动,与卷积核对应的像素阵列为B,A和B的对应元素相乘然后相加,用相加之后的结果替代B最中间的像素值。
屏幕剪辑的捕获时间:2018/4/9 14:29
例如:
使用一个5x5的平均滤波器卷积核,
对图像进行卷积,其实际意义为,将图像中每个5x5的阵列中的25个像素值取平均数,作为最中间像素点的像素值。
代码如下:
img = cv2.imread("logo.png")
kernel =np.ones((5,5),np.float32)/25 #(产生卷积核)
dst = cv2.filter2D(img,-1,kernel)
屏幕剪辑的捕获时间:2018/4/9 14:35
2.图像模糊
对于图像模糊,open cv会提供专门的几个函数去完成,但其本质上还是在卷积
(1)平均
Cv2.blur(src ,size)可以用于实现最简单的平均卷积操作,原理和上面2D卷积一样,只需要提供一个size数组,该数组包含卷积核的长度和宽度即可
例如:
img =cv2.imread("logo.png")
dst= cv2.blur(img ,(5,5))
屏幕剪辑的捕获时间:2018/4/9 14:53
(2)高斯模糊
高斯模糊和平均模糊的不同之处在于,高斯模糊的卷积核里的数值是满足高斯分布,平均模糊只是简单的求个平均值,而高斯模糊是在求加权平均。
使用cv2.GaussianBlur(src ,size ,标准差)既可以实现高斯模糊,size为卷积核的长和宽,标准差是卷积核中心值到周围值的标准差
例如:
img =cv2.imread("logo.png")
dst =cv2.GaussianBlur(img,(5,5),2)
屏幕剪辑的捕获时间:2018/4/9 14:59
(3)中值模糊
中值模糊非常简单,其使用卷积核对应的像素阵列的中值去代替卷积核最中心位置像素的像素值,注意,此处的中值是统计意义上的中值,要先对像素阵列中的值进行排序再取的中值
使用cv2.medianBlur(img,size)即可实现中值模糊,中值模糊可用于去除噪点
例如:
img = cv2.imread("logo.png")
dst = cv2.medianBlur(img,7)
屏幕剪辑的捕获时间: 2018/4/9 15:10
(4)双边滤波
使用高斯模糊等方式,只考虑了像素的空间关系,但不会考虑像素之间的大小关系,其结果有可能
会导致图像边缘失真,而双边滤波则会考虑像素的大小关系,双边滤波同时使用了空间高斯权重
以及灰度值的相似性权重,所以使用双边滤波则可以较好的保留图像边缘
使用cv2.bilateralFilter(src ,size,空间标准差,灰度值标准差)可以实现双边滤波
例如:
img= cv2.imread("logo.png")
dst= cv2.bilateralFilter(img,5,50,50)
屏幕剪辑的捕获时间:2018/4/9 15:16
可以看出使用双边滤波后,图像的边缘依然比较清楚,相对之前简单模糊要清楚不少