图像平滑和锐化

[TOC]

图像平滑

空间域

均值滤波

用来降噪,但也会使图像模糊,效果常常不理想,但使最基本的处理方法

介绍时常说时 3x3 不含中间的周围 8 个和的平均值,不过在实际应用中常常把中间的算上。

一般都是模板内的值都相等,都为 $1/n^2$ ,也可以把周围的取值稍作变换,例如让离中心的更远的四个角上的取值更小,离中心点更近的取值更大。

下方代码并没有处理边缘部分。

1
2
3
4
5
6
7
8
9
10
11
12
function out = imJunzhiFilter(I, n) % n*n 的均值滤波
    %h = fspecial('average', n);
    %out = imfilter(I,h,'corr','replicate'); % 库函数
    [M, N] = size(I); out = I;
    for i=1:M-n+1
        for j=1:N-n+1
            temp = I(i:i+n-1, j:j+n-1);
            out(i,j) = mean(temp(:));
        end
    end
    out = uint8(out);
end

中值滤波

能较好的保留图像的边缘信息,对椒盐噪声处理效果极好,但对其他某些噪声的处理效果可能会不太理想。有较多的点、线、尖顶角的细节结构,不用中值滤波。

一般直接取模板内的中间值即可。

改进版:

  1. 对窗内的每行像素按降序排序,得到最大值、中间值和最小值。
  2. 把三行的最小值即第三列相比较,取其中的最大值。
  3. 把三行的最大值即第一列相比较,取其中的最小值。
  4. 把三行的中间值即第二列相比较,再取一次中间值。
  5. 把前面的到的三个值再做一次排序,获得的中值即该窗口的中值。

下面是一般的版本,代码没有处理边缘部分。

1
2
3
4
5
6
7
8
9
10
11
function out = imMedFilter(I, n) % n*n 的中值滤波
    % out = medfilt2(I,[n,n]); % 系统函数
    [M, N] = size(I);
    out = I;
    for i=1:M-n+1
        for j=1:N-n+1
            temp = I(i:i+n-1, j:j+n-1);
            out(i,j) = median(temp(:));
        end
    end
end

频域

把频域低通滤波器的操作分成了两小步,先设置滤波器,再应用,第二步可以通用。

1
2
3
4
function out = imfrefilt(I, ff) % 频域滤波
    out = ifft2(ifftshift(fftshift(fft2(I)).*ff));
    out = out / max(out(:));
end

### 理想低通滤波(FLPF)

TIM截图20191205193141 \(\begin{array}{l}{H(u, v)=\left\{\begin{array}{ll}{1} & {D(u, v) \leq D_{0}} \\ {0} & {D(u, v)>D_{0}}\end{array}\right.} \\ {D(u, v)=\sqrt{u^{2}+v^{2}}}\end{array}\) 由于方波函数经过傅里叶变换后是取样函数 $Sa$ ,取值有正有负,根据其函数图像特性,处理后的图像会有较明显的模糊和振铃现象。

1
2
3
4
5
6
7
8
9
10
11
function out = imidealFLPF(I, freq) % 生成理想低通滤波算子
    [M,N] = size(I);
    out = ones(M,N);
    for i=1:M
        for j=1:N
            if( sqrt((i-M/2)^2+(j-N/2)^2)>freq )
                out(i,j) = 0;
            end
        end
    end
end

Butterworth低通滤波(BLPF)

1575545367954 \(\begin{align*} H(u, v)&=\frac{1}{1+\left[D(u, v) / D_{0}\right]^{2 n}}\\ \qquad D(u, v)&=\sqrt{u^{2}+v^{2}} \end{align*}\) $D_0$ 为 $H(u,v)$ 下降到 $1/2$ 时的频率值,为截止频率。

1
2
3
4
5
6
7
8
9
function out = imidealBLPF(I, D0, n) % 生成Butterworth低通滤波算子
    [M,N] = size(I);
    out = ones(M,N);
    for i=1:M
        for j=1:N
            out(i,j) = 1/(1+sqrt((i-M/2)^2+(j-N/2)^2)/D0)^n;
        end
    end
end

指数低通滤波(ELPF)

图片1 \(H(u, v)=e^{\frac{-D^{2}(u, v)}{2 D_{0}^{2}}}\)

1
2
3
4
5
6
7
8
9
function out = imidealELPF(I, D0) 
    [M,N] = size(I);
    out = ones(M,N);
    for i=1:M
        for j=1:N
            out(i,j) = exp(-sqrt((i-M/2)^2+(j-N/2)^2)/(2*D0^2));
        end
    end
end

图像锐化

锐化和平滑相当于两种相反的操作,平滑相当于做积分,锐化相当于做微分。同样分为空间域和频域两种处理方式。

空间域

空间域有多种边缘检测算子,下面列举几个常见的。

梯度运算

两个方向分别跑一次 \(\begin{align*} G_x &= f(i+1, j)-f(i,j) \quad \quad G_x = \begin{bmatrix} -1&1 \end{bmatrix} \\ G_y &= f(i, j+1)-f(i,j) \quad \quad G_y = \begin{bmatrix} -1\\ 1 \end{bmatrix} \end{align*}\)

Roberts算子

水平相减变成对角相减 \(G_x = f(i+1, j+1)-f(i,j) \quad \quad G_x = \begin{bmatrix} -1&0 \\ 0&1 \end{bmatrix} \\ G_y = f(i, j+1)-f(i+1,j) \quad \quad G_y = \begin{bmatrix} 0&-1 \\ 1&0 \end{bmatrix}\)

Prewwit 算子

因为中间的0,对噪声有一定的抑制 \(\begin{align*} S_x &= \begin{bmatrix} 1&0&-1 \\ 1&0&-1 \\ 1&0&-1 \end{bmatrix} \\ S_y &= \begin{bmatrix} -1&-1&-1 \\ 0&0&0 \\ 1&1&1 \end{bmatrix} \end{align*}\)

Sobel算子

最常用,也有抑制噪声作用 \(\begin{align*} S_x &= \begin{bmatrix} 1&0&-1 \\ 2&0&-2 \\ 1&0&-1 \end{bmatrix} \\ S_y &= \begin{bmatrix} -1&-2&-1 \\ 0&0&0 \\ 1&2&1 \end{bmatrix} \end{align*}\)

Isptropic算子

Sobel算子的进一步优化 \(\begin{align*} S_x &= \begin{bmatrix} 1&0&-1 \\ \sqrt{2}&0&-\sqrt{2} \\ 1&0&-1 \end{bmatrix} \\ S_y &= \begin{bmatrix} -1&-\sqrt{2}&-1 \\ 0&0&0 \\ 1&\sqrt{2}&1 \end{bmatrix} \end{align*}\)

Laplace算子

二阶微分算子,是一个标量。 \(g(x,y) = f(x,y) + \triangledown^2f(x,y) \\ \triangledown^2f(x,y) = \begin{bmatrix} 0 & 1 & 0 \\ 1 &-4 & 1 \\ 0 & 1 & 0 \end{bmatrix}\)

频域

和平滑操作相反,$高通滤波函数 = 1 - 低通滤波函数$

同样有 FHPF、BHPF、EHPF​ 等高通滤波函数,不再一一详细介绍。

# 使用单$作为行内数学公式分界符