携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情
空间域图像增强
图像在其采集或传递过程中常会受到各种噪声的影响,这会导致其中包含的重要信息很难被读取和识别。例如,不均匀的光照会使图像灰度过于集中,摄像头的数模转换电路所产生的噪声会使图像质量降低,图像显示设备的局限性会造成图像显示颜色减少,等等。因此,在对图像进行分析处理之前,必须对图像进行增强,使其更适合人或机器进一步分析处理。
图像常被各种随机噪声污染,如椒盐(salt&pepper)噪声、脉冲噪声、高斯噪声等。椒盐噪声会导致图像中有随机出现的黑点或白点;脉冲噪声则使图像中只含有随机的白点(正脉冲噪声)或黑点(负脉冲噪声);与前两者不同,高斯噪声则会使图像含有强度服从高斯正态分布的噪声。在正式对图像进行识别并做出决策前,需要滤除各种噪声并突出需要识别的各种特征。图像的邻域增强,就是在空间域对其进行高通或低通滤波,以消除其中的噪声、锐化图像的轮廓,沿某一方向锐化目标的边缘等。
1 均值滤波
均值滤波是指用当前像素点周围 N×N 个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点,即可完成整幅图像的均值滤波。
函数原型:
cv2.blur(src,ksize,anchor,borderType)
- 第一个参数 src 为需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理。
- 第二个参数 ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度。
- 第三个参数 anchor 是锚点,其默认值是(-1,-1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
- 第四个参数 borderType 是边界样式,该值决定了以何种方式处理边界,一般情况下不需要考虑该值的取值,直接采用默认值即可。
#encoding:utf-8
import numpy as np
import cv2
image = cv2.imread("/work/opencv/people3.png")
#均值滤波
blurred = np.hstack([cv2.blur(image,(3,3)),
cv2.blur(image,(5,5)),
cv2.blur(image,(7,7))
])
cv2.imshow("Gaussian",blurred)
cv2.waitKey(0)
2 方框滤波
OpenCV 还提供了方框滤波方式,与均值滤波的不同在于,方框滤波不会计算像素均值。在均值滤波中,滤波结果的像素值是任意一个点的邻域平均值,等于各邻域像素值之和除以邻域面积。而在方框滤波中,可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是邻域像素值之和的平均值,还是邻域像素值之和。
函数原型:
cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)
- 第一个参数 src 为需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理。
- 第二个参数 ddepth 是处理结果图像的图像深度,一般使用 -1 表示与原始图像使用相同的图像深度。
- 第三个参数 ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度。
- 第四个参数 anchor,其默认值是(-1,-1),表示当前计算均值的点位于核的中心点位置。
- 第五个参数 normalize 表示在滤波时是否进行归一化。
- 第六个参数 borderType 是边界样式,该值决定了以何种方式处理边界。
#encoding:utf-8
import numpy as np
import cv2
image = cv2.imread("/work/opencv/people3.png")
#方框滤波
blurred = np.hstack([cv2.boxFilter(image,-1,(3,3)),
cv2.boxFilter(image,-1,(5,5)),
cv2.boxFilter(image,-1,(7,7))
])
cv2.imshow("Gaussian",blurred)
cv2.waitKey(0)
3 高斯滤波
在高斯滤波中,会将中心点的权重值加大,远离中心点的权重值减小,在此基础上计算邻域内各个像素值不同权重的和。
函数原型:
cv.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
- 第一个参数 src 为需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理。
- 第二个参数 ksize 为滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。
- 第三个参数 sigmaX 是卷积核在水平方向上(X 轴方向)的标准差,其控制的是权重比例。
- 后两个参数为 None。
在实际使用中,高斯滤波使用的可能是不同大小的卷积核。例如,图 17 中分别是 3×3、5×5、7×7 大小的卷积核。在高斯滤波中,核的宽度和高度可以不相同,但是它们都必须是奇数。
#encoding:utf-8
import numpy as np
import cv2
image = cv2.imread("/work/opencv/people3.png")
#高斯滤波
blurred = np.hstack([cv2.GaussianBlur(image,(3,3),0), //卷积核宽度为3
cv2.GaussianBlur(image,(5,5),0), //卷积核宽度为5
cv2.GaussianBlur(image,(7,7),0) //卷积核宽度为7
])
cv2.imshow("Gaussian",blurred)
cv2.waitKey(0)
4 中值滤波
中值滤波与前面介绍的滤波方式不同,不再采用加权求均值的方式计算滤波结果。它用邻域内所有像素值的中间值来替代当前像素点的像素值。
中值滤波会取当前像素点及其周围临近像素点(一共有奇数个像素点)的像素值,将这些像素值排序,然后将位于中间位置的像素值作为当前像素点的像素值。
函数原型:
cv2.medianBlur(src,ksize)
- 第一个参数 src 为需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理。
- 第二个参数 ksize 为滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。
import numpy as np
import cv2
image = cv2.imread("/work/opencv/people3.png")
cv2.imshow("Original",image)
cv2.waitKey(0)
#中值滤波
blurred = np.hstack([cv2.medianBlur(image,3),
cv2.medianBlur(image,5),
cv2.medianBlur(image,7)
])
cv2.imshow("Median",blurred)
cv2.waitKey(0)