本节所用图片素材共享于原始图片,提取码 523o
数字图形处理过程中引入噪声可分为两类,一类是由于经过系统引起的噪声,一类是由于干扰引起的加性噪声,当仅考虑加性噪声时,含有噪声的图像可表示:
g ( x , y ) = f ( x , y ) + η ( x , y ) (1) g(x, y)=f(x, y)+\eta(x,y) \tag{1} g(x,y)=f(x,y)+η(x,y)(1)
和DFT形式:
G ( u , v ) = F ( u , v ) + N ( u , v ) (2) G(u,v) = F(u, v) + N(u,v) \tag {2} G(u,v)=F(u,v)+N(u,v)(2)
对于这种形式的噪声,主要考虑空间域滤波。
均值滤波器
为描述方便,后文中用 S x y S_{xy} Sxy表示 f ( x , y ) f(x,y) f(x,y)周围 m × n m \times n m×n邻域内的点的坐标的集合,那么,那么 ( s , t ) (s,t) (s,t)就表示该邻域内某一点的坐标, g ( s , t ) g(s,t) g(s,t)就表示该邻域内某一点的灰度值
-
算数均值滤波器
算数均值滤波是通过计算点 f ( x , y ) f(x,y) f(x,y)周围大小为 m × n m \times n m×n的邻域中像素灰度的算数平均值来完成的,即:
f ^ ( x , y ) = 1 m n ∑ ( s , t ) ∈ S x y g ( s , t ) (3) \hat f(x,y) = \frac{1}{mn} \sum_{(s,t) \in S_{xy}}g(s,t) \tag{3} f^(x,y)=mn1(s,t)∈Sxy∑g(s,t)(3)
显然,该滤波器可以通过如下方式实现:filter = ones(m, n) / (m*n); g = imfilter(f, filter, 'replicate');
不过,为了减少双精度浮点数计算的舍入误差,一般将将系数 1 m n \frac{1}{mn} mn1放在最后计算:
filter = ones(m, n); g = imfilter(f, filter, 'replicate') / (m * n);
当然,图像处理工具箱中也提供了算数均值滤波器的实现:
filter = fspecial('average', [m, n]); g = imfilter(f, filter, 'replicate');
实际中使用哪种都是可以的
-
几何均值滤波器
几何均值滤波是通过计算点 f ( x , y ) f(x,y) f(x,y)周围大小为 m × n m \times n m×n的邻域中像素灰度的几何平均值来完成的,即:
f ^ ( x , y ) = [ ∏ ( s , t ) ∈ S x y g ( s , t ) ] 1 m n (4) \hat f(x,y) =\left [ \prod_{(s,t) \in S_{xy}}g(s,t) \right ]^{\frac{1}{mn}} \tag{4} f^(x,y)=⎣⎡(s,t)∈Sxy∏g(s,t)⎦⎤mn1(4)
几何均值滤波器与算数均值滤波器相比,丢失的图像细节更少。
matlab中提供了计算几何均值的函数geomean(),故几何均值滤波可通过如下代码实现:g = colfilt(f, [m, n], 'sliding', @geomean);
如下图(a)是一块8比特X射线图,图(b)显示了被均值为0,方差为400的加性高斯噪声污染的结果,图(c)和图(d)显示了使用大小为3x3的算数均值滤波和几何均值滤波的结果,显然这两种滤波器都衰减了噪声,几何均值滤波与算数均值滤波相比,图像模糊程度更小(注意例如图(c)和图(d)顶部连接片)。
本节所用完整代码如下
f = imread('Fig0507(a)(ckt-board-orig).tif');
figure
subplot(1, 2, 1);
imshow(f);
title('(a)原始图像');
f_with_noise = imread('Fig0507(b)(ckt-board-gauss-var-400).tif');
subplot(1, 2, 2);
imshow(f_with_noise);
title('(b)被均值为0,方差为400的加行高斯噪声污染的图像');
g_mean = colfilt(f_with_noise, [3, 3], 'sliding', @mean) / (3 * 3);
figure
subplot(1, 2, 1);
imshow(g_mean, [ ]);
title('(c)算数平均值滤波');
% 注意, geomean使用了进行了取对数加快运算,因此为了防止丢失精度和
% log0的出现,要将原图转为double类型并加上eps(matlab所能表示的最小的数)
g_geomean = colfilt(double(f_with_noise) + eps, [3, 3], 'sliding', @geomean);
subplot(1, 2, 2);
imshow(g_geomean, [ ]);
title('(d)几何平均值滤波');
-
谐波均值滤波器
谐波滤波器由如下式子给出:
f ^ ( x , y ) = m n ∑ ( s , t ) ∈ S x y 1 g ( s , t ) (5) \hat f(x,y) =\frac {mn}{\sum_{(s, t) \in S_{xy}} \frac {1}{g(s,t)}} \tag{5} f^(x,y)=∑(s,t)∈Sxyg(s,t)1mn(5)
谐波均值滤波器对于盐粒噪声(白点)效果较好,但不适用于胡椒噪声(暗点),也善于处理像高斯噪声那样的其他噪声 -
逆谐波均值滤波器
逆谐波均值滤波器由如下式子给出
f ^ ( x , y ) = ∑ ( s , t ) ∈ S x y g ( s , t ) Q + 1 ∑ ( s , t ) ∈ S x y g ( s , t ) Q (6) \hat f(x,y) =\frac {\sum_{(s, t) \in S_{xy}} g(s,t)^{Q+1} }{\sum_{(s, t) \in S_{xy}} g(s,t)^Q} \tag{6} f^(x,y)=∑(s,t)∈Sxyg(s,t)Q∑(s,t)∈Sxyg(s,t)Q+1(6)
其中Q为滤波器的阶数,这种滤波器适合消除椒盐噪声,当Q为正时,消除胡椒噪声;当Q为负时,消除盐粒噪声。当Q=0时,(6)式简化为一个算数均值滤波器,当Q = -1时,(6)简化为一个谐波均值滤波器。
根据逆谐波均值滤波器的定义,逆谐波均值滤波器可通过如下代码实现:
这里分母在计算完成后要加上eps防止分母为0的情形出现。g = imfilter(f .^ (Q + 1), ones(m,n), 'replicate') ./ (imfilter(f .^ (Q), ones(m,n), 'replicate') + eps);
下图(a)和(c )显示了一幅被概率为0.1的胡椒噪声(a)和盐粒噪声(c )污染的图像,图(b)是对图(a)使用Q=1.5的逆谐波均值滤波器滤波的结果,图(d)是对图(c )使用Q = -1.5的逆谐波均值滤波器滤波的结果,可以看到在正确选择Q后,胡椒噪声与盐粒噪声均被消除。另外,逆谐波均值滤波器不能同时处理椒盐噪声,换言之,如果使用正Q处理盐粒噪声或负Q处理胡椒噪声,则会产生不可预估的后果,如图(e)(f)是使用Q=-1.5处理图(a)和Q=1.5处理图(c )的结果,显然,这两个都没有完成去噪的任务。
本节所用的完整代码如下