1、学习目标

如何使用OpenCV平滑图像或模糊图像OpenCV。

学习不同的形态学操作,如2D卷积(图像滤波)和图像模糊(图像平滑),使用平均,高斯模糊,中值模糊,双边滤波等。

2、使用函数方法

2D卷积 : cv.filter2D()

图像模糊:cv .blur()

高斯模糊:cv.GaussianBlur()

中值模糊:cv.medianBlur()

双边滤波:cv.bilateralFilter()

3、程序

opencv模糊图片变清晰 opencv图像模糊_opencv模糊图片变清晰


结果

opencv模糊图片变清晰 opencv图像模糊_邻域_02


函数讲解:

(1)2D卷积(图像过滤)

该函数实际上计算相关性,而不是卷积:

opencv模糊图片变清晰 opencv图像模糊_权重_03

cv2.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) → dst
 参数:
src        - 输入图像。
dst        - 输出与src相同大小和相同通道数的图像。
ddepth     -所需的目标图像深度;ddepth = -1时,输出图像将具有与源相同的深度。
kernel     - 卷积内核(或称相关内核),单通道浮点矩阵; 如果要将不同的内核应用于不同的通道,请使用split()将图像拆分为单独的颜色平面 ,然后单独处理它们。
anchor     - 内核的锚点,指示内核中过滤点的相对位置; 锚应位于内核中; 默认值(-1,-1)表示锚点位于内核中心。
delta      - 在将过滤像素存储在dst中之前添加到过滤像素的可选值。
borderType - 像素外推方法

函数执行过程实例:

5x5平均滤波器内核可以定义如下:

opencv模糊图片变清晰 opencv图像模糊_邻域_04


对于每个像素,5x5窗口以此像素为中心,将落在此窗口内的所有像素相加,然后将结果除以25。

(这相当于计算该窗口内的像素值平均值)

对图像中的所有像素执行该操作以产生输出滤波图像。

(2)

模糊

低通滤波器

目的:降低图像的变化率

方法:将每个像素替换为该像素周围像素的均值,这样可以平滑并替代那些强度变化明显的区域。

滤波器中每个像素的权重是相同的

该函数使用内核平滑图像:

opencv模糊图片变清晰 opencv图像模糊_卷积_05

cv2.blur(src, ksize[, dst[, anchor[, borderType]]]) → dst

src        - 输入图像; 它可以有任意数量的通道,这些通道是独立处理的,
             但深度应该是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
dst        - 输出与src相同大小和类型的图像。
ksize      - 模糊内核大小。
anchor     - 默认值Point(-1,-1)表示锚点位于内核中心。
borderType - 用于外推图像外部像素的边框模式。

(3)
高斯模糊
目的:对一个像素的周围像素给予更多的重视
方法:用分配权重来重新计算这些周围点的值,可以通过高斯函数的权重方案来解决

像素的权重与其距中心像素的距离成比例

该函数将源图像与指定的高斯内核进行卷积

cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) → dst
src        - 输入图像; 图像可以有任意数量的通道,这些通道是独立处理的,
             但深度应该是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
dst        - 输出与src相同大小和类型的图像。
ksize      - 高斯内核大小。 ksize.width 和 ksize.height 可以不同,但它们都必须是正数和奇数。或者,它们可以为零,然后根据sigma *计算 。
sigmaX     - X方向的高斯核标准偏差。
sigmaY     - Y方向的高斯核标准差; 如果 sigmaY 为零,则将其设置为等于 sigmaX,如果两个sigma均为零,则分别从ksize.width 和 ksize.height计算  ;  sigmaX和sigmaY。
borderType - 像素外推方法

我们应该指定内核的宽度和高度,它应该是正数和奇数。我们还应该分别指定X和Y方向的标准偏差,sigmaX和sigmaY。如果仅指定了sigmaX,则sigmaY等于sigmaX。如果两者都为零,则根据内核大小计算它们。高斯滤波在从图像中去除高斯噪声方面非常有效。
(4)
中值滤波

计算内核窗口下所有像素的中值,并用该中值替换中心像素。

中心元素总是被图像中的某个像素值替换。这有效地降低了噪音。内核大小必须是正奇数。

对于消除椒盐现象很有用

使用带

opencv模糊图片变清晰 opencv图像模糊_邻域_06

孔径的中值滤波器平滑图像

cv2.medianBlur(src, ksize[, dst]) → dst
src   - 输入1通道,3通道或4通道图像; 
        当 ksize 为3或5时,图像深度应为CV_8U,CV_16U或CV_32F,
        对于较大的光圈尺寸,它只能是CV_8U。
dst   - 与src具有相同大小和类型的目标数组。
ksize - 孔径线性尺寸; 它必须是奇数且大于1,例如:3,5,7 ......

(5)
双边滤波

cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])→ dst
参数:

src         - 源8位或浮点,1通道或3通道图像。
dst         - 与src具有相同大小和类型的目标映像。
d           - 过滤期间使用的每个像素邻域的直径。如果它是非正数,则从sigmaSpace计算。
sigmaColor  - 在颜色空间中过滤sigma。参数的值越大意味着像素邻域内的更远的颜色(参见sigmaSpace)将混合在一起,从而产生更大的半等颜色区域。
sigmaSpace  - 在坐标空间中过滤sigma。较大的参数值意味着只要它们的颜色足够接近,更远的像素就会相互影响 。当d> 0时,无论sigmaSpace如何,它都指定邻域大小。否则,d与sigmaSpace成比例。

Sigma值     :为简单起见,您可以将2 sigma值设置为相同。如果它们很小(<10),过滤器将没有太大的影响,而如果它们很大(> 150),它们将具有非常强烈的效果,使图像看起来“卡通”。

滤波器大小   :大滤波器(d> 5)非常慢,因此建议对实时应用使用d = 5,对于需要大量噪声滤波的离线应用,可能需要d = 9。

bilateralFilter可以很好地减少不需要的噪声,同时保持边缘相当清晰。但是,与大多数过滤器相比,它非常慢。