2D 卷积(图像滤波)
对于一维信号,还可以使用各种低通滤波器(LPF)、高通滤波器(HPF)等对图像进行过滤。LPF有助于消除噪声或模糊图像。hpf过滤器有助于在图像中查找边缘。
opencv提供了一个函数 cv2.filter2d() ,用于将内核与图像卷积起来。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('opencv_logo.png')
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()
image.png
图像模糊(图像平滑)
图像模糊是通过将图像与低通滤波核卷积来实现的。它对消除噪音很有用。它实际上会从图像中删除高频内容(例如:噪声、边缘),从而在应用此过滤器时导致边缘模糊。OpenCV主要提供四种模糊技术。
均值滤波器
这是通过将图像与标准化的框过滤器卷积来完成的。它只需要取内核区域下所有像素的平均值,并用这个平均值替换中心元素。这是通过函数 cv2.blur() 或 cv2.boxFilter() 完成的。
如果不想使用规范化的框过滤器,请使用 cv2.box filter() 并将参数normalize=false 传递给函数。
img = cv2.imread('opencv_logo.png')
blur = cv2.blur(img,(5,5))
image.png
高斯滤波器
在这种方法中,使用高斯核代替由等滤波系数组成的盒形滤波器。它是通过函数 cv2.GaussianBlur() 完成的。我们应该指定内核的宽度和高度,它应该是正数和奇数。我们还应该在 x 和 y 方向分别指定标准偏差 sigmaX 和 sigmaY。如果只指定 sigmaX,sigmaY 将被视为等于 sigmaX。如果两者都是 0,则根据内核大小计算。高斯滤波对于去除图像中的高斯噪声是非常有效的。
如果需要,可以使用函数 cv2.getGaussiankernel() 创建高斯内核。
blur = cv2.GaussianBlur(img,(5,5),0)
image.png
中值滤波器
在这里,函数 cv2.medianBlur() 计算内核窗口下所有像素的中值,中央像素将替换为该中值。这对消除盐和胡椒的噪音非常有效。需要注意的一件有趣的事情是,在高斯和盒式滤波器中,中心元素的过滤值可以是原始图像中可能不存在的值。然而,中值滤波并非如此,因为中心元素总是被图像中的一些像素值所取代。这可以有效地降低噪音。内核大小必须是正奇数。
在这个演示中,我们在原始图像中添加50%的噪声,并使用中值滤波器。
median = cv2.medianBlur(img,5)
image.png
双边滤波器
双边滤波器 cv2.bilateralFilter() 在保持边缘的同时对噪声去除非常有效。但与其他过滤器相比,操作速度较慢。我们已经看到高斯滤波器取像素周围的A邻域,并找到其高斯加权平均值。该高斯滤波器是一个空间函数,即在滤波时考虑相邻像素。它不考虑像素是否具有几乎相同的强度值,也不考虑像素是否位于边缘。其结果是高斯滤波器倾向于模糊边缘,这是不可取的。
和传统的影像平滑化算法不同,双边滤波器除了使用像素之间几何上的靠近程度之外,还多考虑了像素之间的光度色彩差异, 使得双边滤波器能够有效的将影像上的噪声去除,同时保存影像上的边缘资信息。
blur = cv2.bilateralFilter(img, 9, 75, 75)
image.png
网友评论