《OpenCV 轻松入门 面向Python》 学习笔记
图像平滑处理
-
-
- 1. 均值滤波 cv2.blur()
- 2. 方框滤波 cv2.boxFilter()
- 3. 高斯滤波 cv2.GaussianBlur()
- 4. 中值滤波 cv2.medianBlur()
- 5. 双边滤波 cv2.bilateralFiter()
- 6. 2D卷积 cv2.filter2D()
以下所有方法,可处理多通道图像,处理方式为 各个通道独立处理。
1. 均值滤波 cv2.blur()
核size越大,图像失真越严重。
函数原型:
dst_img = cv2.blur(src_img, size, anchor, borderType)
参数:
- dst_img:滤波后得到的结果图像
- src_img:原始图像
- size:滤波核的大小(邻域区域大小),可以有任意通道数量,并能对各个通道独立处理。例如,参数值为(3, 3) 或者 (5, 5)
- anchor:锚点, 默认值为(-1, -1),表示当前计算均值的点位于核的中心点位置。
- borderType:边界样式,该值确定了以何种方式处理边界
通常情况下, 使用均值滤波函数时, 对于锚点(anchor)和 边界样式(borderType),直接采用其默认值即可。因此函数cv2.blur()的一般形式为:dst_img = cv2.blur(src_img, size)
2. 方框滤波 cv2.boxFilter()
方框滤波,可以自由选择是否对均值滤波的结果进行归一化。
- 进行归一化,像素点的结果像素值是邻域像素值之和的平均值。效果和 cv2.blur() 均值滤波一样
- 不进行归一化,像素点的结果像素值是邻域像素值之和。
函数原型:
dst_img = cv2.boxFilter(src_img, ddepth, ksize, anchor, normalize, borderType)
参数:
- dst_img:滤波后得到的结果图像
- src_img:原始图像
- ddepth:结果图像的图像深度,默认值为-1, 表示输出图像与原始图像有相同的图像深度。
- ksize:滤波核的大小(邻域区域大小),可以有任意通道数量,并能对各个通道独立处理。例如,参数值为(3, 3) 或者 (5, 5),表示所选邻域图像的高度和宽度。
- anchor:锚点, 默认值为(-1, -1),表示当前计算均值的点位于核的中心点位置。
- normalize:表示在滤波时是否进行归一化。值为1(默认),代表需要进行归一化,像素点的结果像素值是邻域像素值之和的平均值,效果和 cv2.blur() 均值滤波一样;值为0,代表不需要进行归一化,像素点的结果像素值是邻域像素值之和。
- borderType:边界样式,该值确定了以何种方式处理边界
当normalize =0时,因为不进行归一化处理,因此滤波得到的值很可能超过当前像素值范围的最大值,从而被截断为最大值。这样就会得到一幅纯白色的图像。
3. 高斯滤波 cv2.GaussianBlur()
函数原型:
dst_img = cv2.GaussianBlur(src_img, ksize, sigmaX, sigmaY, borderType)
参数:
- dst_img:滤波后得到的结果图像
- src_img:原始图像
- ksize:滤波核的大小(邻域区域大小),可以有任意通道数量,并能对各个通道独立处理。例如,参数值为(3, 3) 或者 (5, 5),表示所选邻域图像的高度和宽度。
- sigmaX:卷积核在水平方向上(X 轴方向)的标准差,其控制的是权重比例。
- sigmaY:卷积核在垂直方向上(Y 轴方向)的标准差,如果将改值设为0,则只采用sigmaX的值。如果sigmaX,sigmaY的值都为0,则通过ksize.width和 ksize.height计算得到。
- sigmaX = 0.3 x [(ksize.width - 1) x 0.5 -1 ] +0.8
- sigmaY = 0.3 x [(ksize.height - 1) x 0.5 -1 ] +0.8
sigmaX 是必选参数,sigmaY是可选参数
- borderType:边界样式,该值确定了以何种方式处理边界
4. 中值滤波 cv2.medianBlur()
用邻域内所有像素值的中间值来替代当前像素点的像素值。
函数原型:
dst_img = cv2.medianBlur(src_img, ksize)
参数:
- dst_img:滤波后得到的结果图像
- src_img:原始图像
- ksize:滤波核大小
5. 双边滤波 cv2.bilateralFiter()
与当前点色彩相近的像素点(颜色接近的像素点),会被给予较大的权重;与当前点色彩差别较大的像素点(颜色相差较大的像素点),会被给予较小的权重。这样就保护了边缘信息。
函数原型:
dst_img = cv2.bilateralFiter(src_img, d, sigmaColor, sigmaSpace, borderType)
参数:
- dst_img:滤波后得到的结果图像
- src_img:原始图像
- d:滤波时选取的空间距离参数,这里表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数sigmaSpace计算得到。实际应用中,推荐d=5,对于噪声较大的离线滤波,可以选择d=9。
- sigmaColor:滤波处理时选取的颜色差值范围,改值决定了周围哪些像素点能够参与到滤波中来。该值越大就说明周围有越多的像素可以参与到运算中来。
- sigmaSpace:坐标空间中的sigma值。它的值越大,说明有越多的值可以参与到计算中来。,当d>0时,无论sigmaSpace的值如何,d都指定邻域大小;否则,d 与 sigmaSpace的值成正比。
- borderType:边界样式,该值确定了以何种方式处理边界
6. 2D卷积 cv2.filter2D()
用户自定义卷积核进行卷积操作
函数原型:
dst_img = cv2.filter2D(src_img, ddpeth, kernel, anchor, delta, borderType)
参数:
- dst_img:滤波后得到的结果图像
- src_img:原始图像
- ddpeth:结果图像的图像深度,默认值为-1, 表示输出图像与原始图像有相同的图像深度。
- kernel:卷积核,是一个单通道的数组。如果想在处理彩色图像时,让每个通道使用不同的核,必须将彩色图像分解后,使用不同核完成操作。
- anchor:锚点, 默认值为(-1, -1),表示当前计算均值的点位于核的中心点位置。
- delta:修正值,它是可选项,如果该值存在,会在滤波结果上加上该值作为结果图像。
- borderType:边界样式,该值确定了以何种方式处理边界
通常情况下,只指定 src_img, ddpeth, kernel 三个参数,其余的参数使用默认值:
dst_img = cv2.filter2D(src_img, ddpeth, kernel)