学习目标:
- 使用自定义的滤波器对图像进行卷积(2D 卷积)
- 学习使用不同的低通滤波器对图像进行模糊
一、2D卷积
卷积不是很了解的可以看我上一篇博客,与语音信号一样,我们也可以对 2D 图像实施低通滤波(LPF),高通滤波(HPF)等。低通滤波器就是允许低频信号通过,在图像中边缘和噪点都相当于高频部分,所以低通滤波器用于去除噪点、平滑和模糊图像。高通滤波器则反之,用来增强图像边缘,进行锐化处理。
2D卷积其本质上也是一个加权平均的过程,openCV提供cv2.filter2D(src ,deepth,kernel)函数进行2D卷积,其中kernel是我们需要提供的卷积核,卷积核一般为一个奇数级的矩阵,其中所有元素的和为1,deepth一般为-1.
import cv2
import numpy as np
img = cv2.imread('/home/wl/le.jpeg',1)
kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)
while(1):
cv2.imshow('opencv',dst)
k = cv2.waitKey(1)& 0XFF
if k == ord('q'):
break
cv2.imwrite('/home/wl/1.jpg',dst)
cv2.destroyAllWindows()
原图:
卷积图:
二、图像模糊
但其本质上还是在卷积。
(1)平均
Cv2.blur(src ,size)可以用于实现最简单的平均卷积操作,原理和上面2D卷积一样,只需要提供一个size数组,该数组包含卷积核的长度和宽度即可。
import cv2
img = cv2.imread('/home/wl/le.jpeg',1)
dst = cv2.blur(img,(5,5))
while(1):
cv2.imshow('opencv',dst)
k = cv2.waitKey(1)& 0XFF
if k == ord('q'):
break
cv2.imwrite('/home/wl/1.jpg',dst)
cv2.destroyAllWindows()
(2)高斯模糊
现在把卷积核换成高斯核(简单来说,方框不变,将原来每个方框的值是相等的,现在里面的值是符合高斯分布的,方框中心的值最大,其余方框根据距离中心元素的距离递减,构成一个高斯小山包。原来的求平均数现在变成求加权平均数,全就是方框里的值)。实现的函数是 cv2.GaussianBlur(src ,size ,标准差)。我们需要指定高斯核的宽和高(必须是奇数)。以及高斯函数沿 X,Y 方向的标准差。如果我们只指定了 X 方向的的标准差,Y 方向也会取相同值。如果两个标准差都是 0,那么函数会根据核函数的大小自己计算。高斯滤波可以有效的从图像中去除高斯噪音。如果你愿意的话,你也可以使用函数 cv2.getGaussianKernel() 自己构建一个高斯核。
import cv2
img = cv2.imread('/home/wl/le.jpeg',1)
dst = cv2.GaussianBlur(img,(5,5),2)
while(1):
cv2.imshow('opencv',dst)
k = cv2.waitKey(1)& 0XFF
if k == ord('q'):
break
cv2.imwrite('/home/wl/1.jpg',dst)
cv2.destroyAllWindows()
(3)中值模糊
使用cv2.medianBlur(img,size)即可实现中值模糊。
import cv2
img = cv2.imread('/home/wl/le.jpeg',1)
dst = cv2.medianBlur(img,7)
while(1):
cv2.imshow('opencv',dst)
k = cv2.waitKey(1)& 0XFF
if k == ord('q'):
break
cv2.imwrite('/home/wl/1.jpg',dst)
cv2.destroyAllWindows()
(4)双边滤波
使用cv2.bilateralFilter(src ,size,空间标准差,灰度值标准差)可以实现双边滤波。