空间域图像增强

297 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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)

在这里插入图片描述