2D卷积(图像过滤)
2D卷积是一种对图像进行滤波的方法,一般来说,卷积操作可以实现平滑、锐化、边缘检测等不同的图像处理效果,具体取决于卷积核的设计。
在OpenCV中,可以使用cv2.filter2D函数将一个内核与图像进行卷积。
可以使用各种低通滤波器(LPF),高通滤波器(HPF)等对图像进行滤波。
LPF有助于消除噪声,使图像模糊等。HPF滤波器有助于在图像中找到边缘。
# 定义5x5平均滤波器内核
kernel = np.ones((5, 5), np.float32) / 25
# 进行卷积操作
filtered_img = cv2.filter2D(img, -1, kernel)
其中参数-1表示输出图像与输入图像具有相同的深度。
模糊后的图像:
图像模糊(图像平滑)
均值模糊
均值模糊(Mean Blur):使用一个归一化的卷积核来对图像进行平均滤波,将每个像素周围的像素值取平均。这种模糊技术可以有效地减少高频噪声,但可能会导致图像失去细节。
cv2.blur(src, ksize[, dst[, anchor[, borderType]]])
cv2.boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]])
- cv2.blur(src, ksize[, dst[, anchor[, borderType]]]):使用一个归一化的卷积核对图像进行平均滤波,并返回结果图像。ksize参数指定了卷积核的大小,anchor参数表示锚点的位置,borderType参数指定了边界像素的处理方式。
- cv2.boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]]):使用一个非归一化的卷积核对图像进行平均滤波,并返回结果图像。ddepth参数表示输出图像的深度,ksize参数指定了卷积核的大小,anchor参数表示锚点的位置,normalize参数表示是否对卷积核进行归一化,borderType参数指定了边界像素的处理方式。
如果不想使用标准化的框式过滤器,请使用cv.boxFilter()。将参数 normalize = False 传递给函数。
高斯模糊
高斯模糊和均值模糊是两种常用的图像模糊技术,它们在平滑图像的过程中有一些区别。
核函数的不同:
- 高斯模糊使用高斯函数作为核函数,该函数以中心点为最高点,逐渐减小至边缘,并形成一个连续的曲线。高斯函数在空间域和频率域都是平滑的。
- 均值模糊使用均匀权重的矩形函数作为核函数,即将卷积核的每个像素的权重设置为相等值。
模糊效果的不同:
- 高斯模糊产生的效果比较自然,可以减小图像中各像素之间的差异,同时能够保留更多的细节信息。
- 均值模糊会对图像进行整体的平均处理,可能导致图像的细节丢失,特别是在处理噪声时,可能会产生较差的去噪效果。
处理速度的不同:
- 由于高斯模糊使用了连续的高斯函数,计算复杂度较高,因此相对而言,高斯模糊的处理速度可能较慢。
- 均值模糊使用简单的均匀权重的核函数,计算复杂度较低,因此处理速度可能更快。
使用 cv2.GaussianBlur() 函数实现高斯模糊,使用函数 cv.getGaussianKernel() 创建高斯内核
cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])
具体参数说明如下:
- src:输入图像。
- ksize:卷积核的大小。它可以是一个二维的奇数值矩阵,如(3, 3)、(5, 5),表示高斯核的尺寸。
- sigmaX:X方向上的高斯核标准差。
- dst(可选):输出结果图像,与输入图像具有相同的大小和数据类型。
- sigmaY(可选):Y方向上的高斯核标准差,如果未指定,则默认与sigmaX相等。
- borderType(可选):边界像素的处理方式。
使用cv2.GaussianBlur()函数可以对图像进行高斯模糊处理,并根据给定的标准差(sigmaX和sigmaY)调整模糊效果的程度。较大的标准差将导致更大程度的模糊。
中值模糊
OpenCV中的cv.medianBlur()函数,它用于进行中值模糊处理。中值模糊是一种常用的图像滤波算法,用于去除椒盐噪声。
blur = cv.medianBlur(src, ksize)
该函数接受两个参数:
- src是输入图像。
- ksize表示中值模糊的内核大小,即内核的宽度和高度。这里要求ksize为正奇数整数,例如1、3、5等。较大的ksize会产生更强烈的模糊效果。
双边模糊
OpenCV中的cv.bilateralFilter()函数,它是一种能够同时去噪并保持边缘清晰锐利的滤波器。相较于其他滤波器而言,cv.bilateralFilter()的速度较慢。
传统的高斯滤波器仅考虑像素周围的邻域,并计算其高斯加权平均值。高斯滤波器仅是空间函数,即仅考虑附近像素,而不关注像素之间的差异。这导致了边缘模糊,这并不是我们所期望的结果。
而双边滤波器在空间中也采用高斯滤波器,在像素差异方面增加了一个高斯函数作为补充。空间高斯函数确保只有附近像素被模糊,而强度差的高斯函数确保只有与中心像素相似的像素被模糊。由于边缘处像素强度变化较大,因此可以保留边缘。
filtered_image = cv.bilateralFilter(src, d, sigma_color, sigma_space)
该函数接受四个参数:
- src是输入图像。
- d是过滤器的直径,也称为领域直径。它决定了在空间中有多少像素被考虑在内。
- sigma_color是颜色空间的标准差,该参数影响对颜色相似度的权重。较大的值将导致更多的颜色被视为相似,从而增加模糊范围。
- sigma_space是空间域的标准差,该参数影响对空间相似度的权重。较大的值将导致更多的像素被视为相似,从而增加模糊范围。
四种模糊的对比
- 均值滤波器:
- 应用场景:主要用于去除图像中的高频噪声,例如椒盐噪声或高斯噪声。
- 原理:将像素点周围邻域内的像素值取平均值,从而实现去噪。
- 效果:能够有效消除噪声,但在滤波过程中会造成图像模糊。
- 中值滤波器:
- 应用场景:适用于去除图像中的椒盐噪声或脉冲噪声。
- 原理:将像素点周围邻域内的像素值排序,并取中间值作为滤波结果。
- 效果:能够有效去除噪声,同时相对于均值滤波器来说,中值滤波器能够更好地保持图像细节。
- 高斯滤波器:
- 应用场景:广泛应用于图像模糊、降噪和平滑处理。
- 原理:通过对像素点周围邻域内的像素进行加权平均,使得离中心像素距离近的像素具有更大的权重。
- 效果:能够有效平滑图像,消除噪声,同时相对于均值滤波器来说,高斯滤波器能够更好地保持图像细节。
- 双边滤波器:
- 应用场景:适用于同时去噪和保持边缘清晰锐利的情况,特别是在保留边缘细节方面具有优势。
- 原理:结合空间域和像素强度的高斯滤波,通过同时考虑像素之间的空间距离和像素值差异来进行滤波。
- 效果:能够较好地去除噪声,同时保持图像的边缘锐利。