一、平滑空间滤波器
平滑滤波器用于模糊处理和降低噪声。模糊处理经常用于预处理任务中。通过线性滤波和非线性滤波模糊处理,可以降低噪声。
1. 平滑线性滤波器(均值滤波器)
平滑线性空间滤波器的输出(响应)是包含在滤波器模板邻域内的像素的简单平均值。这些滤波器有时也称为均值滤波器。
令
表示中心在点
处、大小为
的矩形子图像窗口(邻域)的一组坐标。
① 算术均值滤波器
一副
图像经过一个
(
和
是奇数)的算术均值滤波器的过程可由下式给出:
经过一个
(
和
是奇数)的加权均值滤波器的过程可由下式给出:
② 几何均值滤波器
③ 谐波均值滤波器
谐波均值滤波器对于盐粒噪声效果较好,但不适用于胡椒噪声。它善于处理像高斯噪声那样的其他噪声。
④ 逆谐波均值滤波器
其中
称为滤波器的阶数。当
值为正时,该滤波器消除胡椒噪声;当
值为负时,该滤波器消除盐粒噪声。
2. 统计排序(平滑非线性)滤波器
统计排序滤波器是一种非线性空间滤波器,这种滤波器的响应以滤波器包围的图像区域中所包含的像素排序为基础,然后使用统计排序结果决定的值代替中心像素的值。
① 中值滤波器
中值滤波器使用一个像素邻域中的中值代替图像中的值,表达式如下:
中值滤波器的应用非常普遍,因为对于某些类型的随机噪声,它们能提供良好的去噪能力,且与相同尺寸的线性平滑滤波器相比,引起的模糊更少。
② 最大值和最小值滤波器
最大值和最小值滤波器分别使用一个像素邻域中的最大值和最小值代替图像中的值。
最大值滤波器对于发现图像中的最亮点非常有用,表达式如下:
最小值滤波器对于发现图像中的最暗点非常有用,表达式如下:
③ 中点滤波器
中点滤波器简单地计算一个像素邻域中的最大值和最小值之间的中点,即:
这种滤波器结合了统计排序和求平均,最适用于处理随机分布的噪声,如高斯噪声或均匀噪声。
二、锐化空间滤波器
1. 基础
锐化处理的主要目的是突出灰度的过渡部分。在逻辑上,我们得出锐化处理可由空间微分来实现。基本上,微分算子的响应强度与图像在用算子操作的这一点的突变程度成正比,这样,图像微分会增强边缘和其他突变(如噪声),削弱灰度变化缓慢的区域。
一维函数
的一阶微分的基本定义是差值:
二阶微分定义为如下差分:
从下图可以看出微分在图像边缘的变化情况:
2. 拉普拉斯(Laplacian)算子
Laplacian算子使用二阶微分锐化图像。
一个二维图像函数
的拉普拉斯算子定义为:
因为任意阶微分都是线性操作,所以拉普拉斯变换也是一个线性算子。为了以离散形式描述这一公式,在
方向上,有
在
方向上,有
所以,满足这三个公式的两个变量的离散拉普拉斯算子是
这个公式可以用图1(a)的滤波模板来实现。
使用拉普拉斯算子将产生暗色背景中叠加有浅灰色边线和突变点的图像。将原图像和拉普拉斯图像叠加在一起的简单方法,可以复原背景特性并保持拉普拉斯锐化处理的效果。公式如下:
式中,
和
分别为输入图像和锐化后的图像,如果使用图1(a)或(b)的拉普拉斯滤波器,则常数
;如果使用图1(c)或(d)的拉普拉斯滤波器,则常数
(因为锐化的是输入图像的亮度区域,即使用(1)式后为负的像素点)。
3. 罗伯特交叉梯度(Roberts)算子
Roberts算子使用一阶微分锐化图像。Roberts提出两个定义使用交叉查分:
模板如下图所示:
4. Sobel算子
Sobel算子使用一阶微分锐化图像。使用以
为中心的
邻域对
和
的近似如下式所示:
模板如下图所示:
三、彩色图像的平滑和锐化
1. 彩色图像平滑
在彩色图像中,我们使用RGB的分量代替灰度标量值。我们将该向量的分量视为几幅标量图像,这些标量图像可通过传统的灰度级邻域处理,单独地平滑原RGB图像的每个平面来得到。
邻域平均平滑可以在每个彩色平面的基础上执行。
2. 彩色图像锐化
在RGB彩色系统中,可以通过分别计算每幅分量图像的拉普拉斯变换来计算全彩色图像的拉普拉斯变换。
四、代码实现(Python+OpenCV)
均值滤波器:cv2.blur()
中值滤波器:cv2.medianBlur()
卷积运算:cv2.filter2D()
图片相加运算:cv2.add()
1. 去除盐粒噪声(图像产生随机白色像素点)
import cv2
img = cv2.imread('盐粒噪声.jpg')
# 算术均值滤波器
img1 = cv2.blur(img, (3,3))
# 谐波均值滤波器
img2 = 1/cv2.blur(1/(img+1E-10), (3,3)) # 加1E-10防止除0操作
# 中值滤波器
img3 = cv2.medianBlur(img, 3)
cv2.imwrite('img1.jpg',img1)
cv2.imwrite('img2.jpg',img2)
cv2.imwrite('img3.jpg',img3)
2. 去除胡椒噪声(图像产生随机黑色像素点)
import cv2
img = cv2.imread('胡椒噪声.jpg')
# 算术均值滤波器
img1 = cv2.blur(img, (3,3))
# 谐波均值滤波器
img2 = 1/cv2.blur(1/(img+1E-10), (3,3)) # 加1E-10防止除0操作
# 中值滤波器
img3 = cv2.medianBlur(img, 3)
cv2.imwrite('img1.jpg',img1)
cv2.imwrite('img2.jpg',img2)
cv2.imwrite('img3.jpg',img3)
3. 去除椒盐噪声(图像产生随机黑白像素点)
import cv2
img = cv2.imread('椒盐噪声.jpg')
# 算术均值滤波器
img1 = cv2.blur(img, (3,3))
# 谐波均值滤波器
img2 = 1/cv2.blur(1/(img+1E-10), (3,3)) # 加1E-10防止除0操作
# 中值滤波器
img3 = cv2.medianBlur(img, 3)
cv2.imwrite('img1.jpg',img1)
cv2.imwrite('img2.jpg',img2)
cv2.imwrite('img3.jpg',img3)
4. 去除高斯噪声
import cv2
img = cv2.imread('高斯噪声.jpg')
# 算术均值滤波器
img1 = cv2.blur(img, (3,3))
# 谐波均值滤波器
img2 = 1/cv2.blur(1/(img+1E-10), (3,3)) # 加1E-10防止除0操作
# 中值滤波器
img3 = cv2.medianBlur(img, 3)
cv2.imwrite('img1.jpg',img1)
cv2.imwrite('img2.jpg',img2)
cv2.imwrite('img3.jpg',img3)
5. Laplacian算子锐化图像
import cv2
import numpy as np
kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, -1]])
img = cv2.imread('原图.jpg', 0)
edge_img = cv2.filter2D(img, -1, kernel)
output_img = cv2.add(img, edge_img)
cv2.imwrite('edge_img.jpg', edge_img)
cv2.imwrite('output_img.jpg', output_img)
以上全部内容参考书籍如下:
冈萨雷斯《数字图像处理(第三版)》