OpenCV平滑图像

目标

学会:

  • 用各种低通滤波器模糊图像
  • 将自定义滤波器应用于图像(2D卷积)

二维卷积(图像滤波)

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

OpenCV提供了一个功能cv2.filter2D()将内核与图像相转换。作为一个例子,我们将尝试对图像进行平均滤波。5x5平均过滤器内核如下所示:

K =  \frac{1}{25} \begin{bmatrix} 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{bmatrix}

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

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()

结果:

图像模糊(图像平滑)

图像模糊是通过将图像与低通滤波核进行卷积来实现的.它对消除噪音很有用。它实际上去除了图像中的高频内容(例如:噪声、边缘)。所以在这个操作中边缘被模糊了一点。OpenCV主要提供四种模糊技术。

1.均值

这是通过转换图像与规范化的盒子过滤器。它只需取内核区域下所有像素的平均值,并替换中心元素。这是由函数完成的。cv2.blur()cv2.boxFilter()。有关内核的更多细节,请查看文档。我们应该指定内核的宽度和高度。3x3规格化框过滤器如下所示:

K =  \frac{1}{9} \begin{bmatrix} 1 & 1 & 1  \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix}

注:如果不想使用规范化框筛选器,请使用cv2.boxFilter()。传递论点正常化=假为了这个功能。

使用5x5大小的内核查看下面的示例演示:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('opencv_logo.png')

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()

结果:

2.高斯模糊

在这种情况下,用高斯核代替了盒滤波器。它完成了这个功能,cv2.GaussianBlur()。我们应该指定内核的宽度和高度,它应该是正的和奇数的。我们还应分别指定X和Y方向、SigmaX和SigmaY的标准差。如果只指定SigmaX,则SigmaY与SigmaX相同。如果两者都作为零给出,则根据内核大小计算它们。高斯模糊对图像中的高斯噪声有很好的去除效果。

如果你愿意的话,你可以用这个函数创建一个高斯核,cv2.getGaussianKernel().

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

blur = cv2.GaussianBlur(img,(5,5),0)

结果:

3.中间模糊

在这里,功能cv2.medianBlur()取内核区域下所有像素的中值,并将中心元素替换为此中值。这是非常有效的抗盐和胡椒噪音的图像。有趣的是,在上面的过滤器中,中心元素是一个新计算的值,它可以是图像中的像素值,也可以是新值。但是在中值模糊中,中心元素总是被图像中的某个像素值所代替。有效地降低了噪声。它的内核大小应该是一个正数整数。

在这个演示中,我添加了50%的噪声到我们的原始图像和应用中值模糊。检查结果:

median = cv2.medianBlur(img,5)

结果:

4.双边滤波

cv2.bilateralFilter()在保持边缘锐利的同时,在去除噪音方面是非常有效的。但与其他过滤器相比,操作要慢一些。我们已经看到高斯滤波器将像素周围的一个邻域取出来,并求出它的高斯加权平均值。这种高斯滤波器是空间的函数,即在滤波时要考虑附近的像素。它不考虑像素是否具有几乎相同的亮度。它不考虑像素是否是边缘像素。因此,它也模糊了边缘,这是我们不想做的。

双侧滤波器在空间上也采用高斯滤波器,但另一个高斯滤波器是像素差函数。空间高斯函数确定模糊只考虑邻近像素,而强度差的高斯函数只考虑与中心像素相似的像素进行模糊处理。因此,它保留了边缘,因为边缘的像素会有很大的强度变化。

下面的示例显示使用双边筛选器。

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

结果:

Bilateral Filtering

看,表面的纹理已经消失了,但是边缘仍然保留着。

猜你喜欢

转载自blog.csdn.net/rongpeisheng666/article/details/81607600