Jasterwisdom 2019-06-27
与一维信号一样,图像也可以使用各种低通滤波器(LPF),高通滤波器(HPF)等进行滤波.LPF有助于消除噪声,模糊图像等.HPF滤波器有助于找到边缘图片.
cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
:将内核与图像进行卷积
对图像进行平均过滤。 一个5x5的平均滤波器内核可以定义如下:
$$K=\frac{1}{25} \left[ \begin{matrix} 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \end{matrix} \right] $$
将此内核保持在像素上方,添加该内核下方的所有25个像素,取其平均值并用新的平均值替换中心像素.
代码:
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread('img.jpg') kernel = np.ones((5,5),np.float32)/25 dst = cv2.filter2D(img,-1,kernel) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(dst),plt.title('Averaging') plt.xticks([]), plt.yticks([]) plt.show()
通过将图像与低通滤波器内核卷积来实现图像模糊.它有助于消除噪音.它实际上从图像中去除了高频内容(例如:噪声,边缘).因此在此操作中边缘会模糊一点.(有模糊的技术,也不会模糊边缘).OpenCV主要提供四种模糊技术.
过将图像与标准化的盒式过滤器进行卷积来完成的。它只取内核区域下所有像素的平均值并替换中心元素。这是由函数cv2.blur()
或cv2.boxFilter()
完成的,3x3标准化的盒式过滤器如下所示:
$$K=\frac{1}{9} \left[ \begin{matrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{matrix} \right] $$
NOTE:
如果不想使用规范化的框过滤器,请使用cv2.boxFilter()
.将参数normalize = False传递给函数.
使用5x5大小的内核进行图像平滑:
代码:
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread('img.jpg') blur = cv2.blur(img,(5,5)) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(blur),plt.title('Blurred') plt.xticks([]), plt.yticks([]) plt.show()
cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])
cv2.getGaussianKernel()
创建高斯内核代码:
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread('img.jpg') 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('Blurred') plt.xticks([]), plt.yticks([]) plt.show()
cv2.medianBlur(src, ksize[, dst])
:内核区域下所有像素的中值,并用该中值替换中心元素.对图像中的椒盐噪声非常有效.其内核大小应为正整数
代码
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread('img7.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('Blurred') plt.xticks([]), plt.yticks([]) plt.show()
cv2.bilateralFilter()
在降低噪音方面非常有效,同时保持边缘清晰,但与其他过滤器相比,操作速度较慢.
NOTE:
代码:
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread('img.jpg') 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('Blurred') plt.xticks([]), plt.yticks([]) plt.show()