目标

学习:

  • 使用各种低通滤镜模糊图像

  • 将自定义过滤器应用于图像(2D 卷积)

2D 卷积 ( 图像过滤 )

与一维信号一样,图像也可以使用各种低通滤波器 (LPF)、高通滤波器 (HPF) 等进行过滤。LPF 有助于去除噪声、模糊图像等。HPF 滤波器有助于在图像中查找边缘。

OpenCV 提供了一个函数 cv.filter2D() 来对内核和图像进行卷积。例如,我们将尝试对图像进行平均过滤器。5x5 平均滤波器内核将如下所示:

K=125[1111111111111111111111111]

操作是这样的:将此内核保持在像素上方,将该内核下方的所有 25 个像素相加,取平均值,并将中心像素替换为新的平均值。对于图像中的所有像素,此操作将继续进行。尝试以下代码并检查结果:

将 numpy 导入为 NP
将 CV2 导入为 CV
从 matplotlib 导入 Pyplot as PLT

img = cv.imread('opencv_logo.png')
assert img 不是 None,“无法读取文件,请使用 os.path.exists() 检查”

内核 = np.ones((5,5),np.float32)/25
dst = cv.filter2D(img,-1,内核)

plt.subplot(121),plt.imshow(img),plt.title('原始')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title('平均')
plt.xticks([]), plt.yticks([])
plt.show()

结果:

图像

图像模糊(图像平滑)

图像模糊是通过使用低通滤波器内核对图像进行卷积来实现的。它对于去除噪声很有用。它实际上会从图像中去除高频内容(例如:噪声、边缘)。因此,在此操作中,边缘会稍微模糊(也有一些模糊技术不会模糊边缘)。OpenCV 提供了四种主要类型的模糊技术。

1. 平均

这是通过使用标准化框过滤器对图像进行卷积来完成的。它只是取内核区域下所有像素的平均值,并替换中心元素。这是通过函数 cv.blur()cv.boxFilter() 完成的。查看 docs 以获取有关内核的更多详细信息。我们应该指定内核的宽度和高度。3x3 标准化的框筛选器如下所示:

K=19[111111111]

注意 如果您不想使用规范化的框过滤器,请使用 cv.boxFilter()。将参数 normalize=False 传递给函数。

查看下面的 5x5 内核示例演示:

将 CV2 导入为 CV
将 numpy 导入为 NP
从 matplotlib 导入 Pyplot as PLT
img = cv.imread('opencv-logo-white.png')
assert img 不是 None,“无法读取文件,请使用 os.path.exists() 检查”
blur = cv.blur(img,(5,5))
plt.subplot(121),plt.imshow(img),plt.title('原始')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(模糊),plt.title('模糊')
plt.xticks([]), plt.yticks([])
plt.show()

结果:

图像

2. 高斯模糊

在此方法中,使用高斯核而不是盒式滤波器。这是通过函数 cv.GaussianBlur() 完成的。我们应该指定内核的宽度和高度,应该是正数和奇数。我们还应该指定 X 和 Y 方向的标准差,分别是 sigmaX 和 sigmaY。如果仅指定 sigmaX,则 sigmaY 与 sigmaX 相同。如果两者都以零表示,则根据内核大小计算它们。高斯模糊在从图像中去除高斯杂色方面非常有效。

如果需要,您可以使用函数 cv.getGaussianKernel() 创建一个高斯内核。

上面的代码可以修改为高斯模糊:

模糊 = cv.GaussianBlur(img,(5,5),0)

结果:

图像

3. 中间模糊

在这里,函数 cv.medianBlur() 获取内核区域下所有像素的中位数,并将中心元素替换为此中值。这对于图像中的椒盐杂色非常有效。有趣的是,在上面的过滤器中,中心元素是一个新计算的值,它可能是图像中的像素值或新值。但在中间模糊中,中心元素总是被图像中的某个像素值替换。它有效地降低了噪音。其内核大小应为正奇数。

在这个演示中,我在原始图像中添加了 50% 的杂色,并应用了中间模糊。检查结果:

中位数 = cv.medianBlur(img,5)

结果:

图像

4. 双边过滤

cv.bilateralFilter() 在保持边缘锐利的同时,在去除噪声方面非常有效。但与其他过滤器相比,操作速度较慢。我们已经看到,高斯滤波器对像素周围的邻域进行测量,并找到其高斯加权平均值。此高斯滤波器是单独的空间函数,即在过滤时考虑附近的像素。它不考虑像素是否具有几乎相同的强度。它不考虑像素是否为边缘像素。所以它也模糊了边缘,这是我们不想做的。

双边滤波在空间中也采用高斯滤波器,但多采用一个高斯滤波器,它是像素差的函数。空间的高斯函数确保仅考虑附近的像素进行模糊处理,而强度差的高斯函数确保仅考虑与中心像素具有相似强度的像素进行模糊处理。因此,它会保留边缘,因为边缘处的像素将具有较大的强度变化。

以下示例显示了双边过滤器的用法(有关参数的详细信息,请访问文档)。

blur = cv.bilateralFilter(img,9,75,75)

结果:

图像

请注意,表面上的纹理已消失,但边缘仍保留。

其他资源

  1. 有关双边筛选的详细信息

原文地址:OpenCV:平滑图像