同态滤波

公式

H ( u , v ) = ( γ H − γ L ) [ 1 − e − c [ D 2 ( u , v ) / D 0 2 ] ] − γ L H(u, v) = ({\gamma}_{H} - {\gamma}_{L})[1 - e^{-c[D^{2}(u, v)/D^{2}_{0}]}] -{\gamma}_{L} H(u,v)=(γHγL)[1ec[D2(u,v)/D02]]γL

其中, γ H {\gamma}_{H} γH的值为, γ L {\gamma}_{L} γL的值为
D(u, v)的定义如下:
D ( u , v ) = [ ( u − M 2 ) 2 + ( v − N 2 ) 2 ] 1 2 D(u, v) = [(u - \frac{M}{2})^2 + (v - \frac{N}{2})^2]^{\frac{1}{2}} D(u,v)=[(u2M)2+(v2N)2]21
即在频率域中的点距离中心的距离。(通过对空域做中心变换后,我们在经过快速傅里叶变换之后得到的图像的中心将会是 ( M 2 , N 2 ) (\frac{M}{2}, \frac{N}{2}) (2M,2N),中心变换操作可以通过和 ( − 1 ) x + y (-1)^{x + y} (1)x+y做相关得到,可以通过傅里叶变换的平移性得到)

MATLAB 步骤

(1)将图像的灰度值取自然对数,将入射分量和反射分量变成相加的形式,这样就可以利用傅里叶变化的线性特征变换到频域进行图像处理

% Homomophic filtering
[YUV] = imread('office.jpg','jpg');
[height, width, channel] = size(f);
U = YUV(1:height, 1:width, 2);
V = YUV(1:height, 1:width, 3);
f = YUV(1:height, 1:width, 1);
%limit frequency
D0 = 1;
% uint8 to double
f = im2double(f);
% ln
for x = 1:height
    for y = 1:width
        f(x, y) = log(f(x, y) + 1);
    end
end

(2)进行DFT变换

% discrete fourier transfer
F = zeros(height, width);
temp = zeros(height, width);
for y = 1:width
    for u = 1:height
        sum = 0;
        for x = 1:height
            sum = sum + exp(-1j * 2 * pi * u * x / height) * f(x, y);
        end
        temp(u, y) = sum;
    end
end
for u = 1:height
    for v = 1:width
        sum = 0;
        for y = 1:width
            sum = sum + exp(-1j * 2 * pi * v * y / width) * temp(u, y);
        end
        F(u, v) = sum;
    end
end

(3)进行同态滤波

% generate Homomophic filtering kernel
kernel = zeros(height, width);
for u = 1:height
    for v = 1:width
        D = sqrt((u - height / 2)^2 + (v - width / 2)^2);
        % 同态滤波
        kernel(u, v) = 1.75 * (1 - exp(-D^2 / D0^2)) + 0.25;
        % Butterworth 高通滤波
        %kernel(u, v) = 1 / (1 - (D0 / D)^2);
    end
end
imwrite(kernel, 'kernel_.png', 'png');
F = F.*kernel;

(4)进行IDFT变换

% Inverse DFT
% Inverse discrete fourier transfer
temp = zeros(height, width);
for y = 1:width
    for u = 1:height
        sum = 0;
        for x = 1:height
            sum = sum + exp(1j * 2 * pi * u * x / height) * F(x, y);
        end
        temp(u, y) = sum;
    end
end
for u = 1:height
    for v = 1:width
        sum = 0;
        for y = 1:width
            sum = sum + exp(1j * 2 * pi * v * y / width) * temp(u, y);
        end
        cent(u, v) = sum / (width * height);
    end
end

(5)进行幂运算,基数为自然系数

% exp
for u = 1:height
    for v = 1:width
        f(u, v) = exp(f(u, v)) - 1;
    end
end

滤波效果

同态滤波_第1张图片

你可能感兴趣的:(数字图像处理)