目录
概述
低通滤波(LPF)可以去除图像噪音,模糊图像。高通滤波(HPF)可以找到图像的边缘。接下来我么探讨图像模糊即低通滤波的相关知识。图像模糊其实定义一个卷积核,与图进行卷积运算,去除图像中的高频部分,例如:噪音,边界,所以边界也会被模糊一点,当然,也有一些模糊技术不会模糊掉边界。
平均滤波器
使用3*3的归一化卷积核与图像进行卷积操作,用卷积框区域所有像素的平均值来代替中心元素。y用到了cv2.blur()或cv2.boxFilter()函数。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('../data/image/6.png')
#使用5*5的归一化卷积框
blur1 = cv2.blur(img,(5,5))
#第二个参数表示输出图像深度,-1表示输出图像深度与输入图像相同
blur2 = cv2.boxFilter(img,-1,(5,5),normalize=True)
plt.subplot(131),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(blur1),plt.title('Blurred1')
plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(blur2),plt.title('Blurred2')
plt.xticks([]), plt.yticks([])
plt.show()
高斯模糊
将卷积核换成高斯核,即卷积核中的值符合高斯分布(卷积核中心的值最大,其余值根据距离中心元素的距离递减)。用到的函数是cv2.GrussianBlur()。我们只需要指定卷积核的大小即可,函数可以设置参数自动计算高斯核的值。
第一个参数表示输入图像
第二个参数表示卷积核的大小
第三个参数表示高斯核的X方向的标准差,例子中的0,表示根据卷积核的大小来计算高斯函数的标准差。
注:如果只设置了X方向的值,Y方向的值默认等于X方向的值。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('../data/image/6.png')
blur = cv2.GaussianBlur(img,(5,5),0)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blurred1')
plt.xticks([]), plt.yticks([])
plt.show()
中值模糊
用卷积核对应像素的中值代替中心像素的值,这个滤波器经常用来去除椒盐噪声。前面的滤波器是用计算出的新值取代中心像素的值,而中值滤波是用中心像素周围的值来取代。用到的函数是cv2.medianBlur()。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('../data/image/11.png')
blur = cv2.medianBlur(img,5)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blurred1')
plt.xticks([]), plt.yticks([])
plt.show()
双边滤波
双边滤波能在保持边界清晰的情况下有效的去除噪音,但是这种操作与其他滤波器相比比较慢。双边滤波器在同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函数确保只有临近区域的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算。所以这种方法会确保边界不会被模糊掉。用到的函数是cv2.bilateralFilter()。
第一个参数表示输入图像
第二个参数表示邻域直径
第三个参数表示空间高斯函数标准差
第四个参数表示灰度值相似行高斯函数标准差
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('../data/image/12.png')
blur = cv2.bilateralFilter(img,9,75,75)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blurred1')
plt.xticks([]), plt.yticks([])
plt.show()
这里的空间高斯函数和灰度相似性高斯函数还不能理解,目前这一个知识没有在项目中用到,在后期项目实战部分,如果有遇到再来补充。