巴特沃斯滤波器和同态滤波

巴特沃斯滤波器和同态滤波

一、一阶Butterworth低通滤波器频域滤波

1.算法描述

(1)先对空域图像乘上(-1)^(x+y),使得图像变换到频域后的低频部分集中在图像正中央。

(2)然后进行快速傅里叶变换转至频域,此时真正的低频部分围绕在(height/2, width/2)周围,

(3)用一阶BLPF滤掉这个范围以外的高频成分,

(4)然后傅里叶反变换回空域并取实部,

(5)再次乘上(-1)^(x+y)反中心变换,得到的图像就是滤波后的图像了。

(6)上述步骤中,也可以不乘(-1)^(x+y)进行中心变换,不过要正确意识到,不进行中心变换的频域图像的中心是高频部分,这时要把四角以外的部分滤掉。可以用(min(x,height-x),min(y,width-y))这样的坐标作为当前H(i,j)的坐标,这样就会更多地滤掉中心处的高频部分。

(7)在空域上,滤波后的空域图像会减少高频噪声,但D0的大小选择也决定了图像本身的高频成分丢失情况,D0取得越小,图像丢失的细节越多。

(8)在频域上,进行过中心变换的频域图像的中心是低频部分,内容会被保留。越往外的高频部分就越会被过滤掉,这样滤波后,频域图像内容基本就集中在中心附近了。

2.Matlab代码

(1)函数BLPF(一阶Butterworth低通滤波):

BLPF.m

function H = BLPF( D0, height, width )
    for i = 1 : height
        x = i - (height / 2);
        for j = 1 : width
            y = j - (width / 2);
            H(i, j) = 1 / (1 + (x ^ 2 + y ^ 2) / (D0 ^ 2));
        end
    end
end

(2)函数Centralize(中心变换):

Centralize.m

function mat = Centralize( mat )
    [height, width] = size(mat);
    for i = 1 : height
        for j = 1 : width
            if mod(i + j, 2) == 1
                mat(i, j) = -mat(i, j);
            end
        end
    end
end

(3)调用函数的脚本Task1:

Task1.m

img = imread('barb.png');
[height, width] = size(img);

% subplot(2, 2, 1);
% imshow(img);
figure();

f = double(img);
f = Centralize(f);
F = fft2(f);

D0 = 10;
H = BLPF(D0, height, width);
g = real(ifft2(H .* F));
g = Centralize(g);
subplot(2,2,1);
imshow(uint8(g));
title('D0 = 10');

D0 = 20;
H = BLPF(D0, height, width);
g = real(ifft2(H .* F));
g = Centralize(g);
subplot(2,2,2);
imshow(uint8(g));
title('D0 = 20');

D0 = 40;
H = BLPF(D0, height, width);
g = real(ifft2(H .* F));
g = Centralize(g);
subplot(2,2,3);
imshow(uint8(g));
title('D0 = 40');

D0 = 80;
H = BLPF(D0, height, width);
g = real(ifft2(H .* F));
g = Centralize(g);
subplot(2,2,4);
imshow(uint8(g));
title('D0 = 80');

3.处理结果

下图为使用一阶Butterworth低通滤波器频域滤波,且D0分别为10、20、40、80时的效果图对比,可以看到,随着D0的增大,滤波后的图像也变得更清晰,因为更少的高频成分被滤去。

在空域上,滤波后的空域图像会减少高频噪声,但D0的大小选择也决定了图像本身的高频成分丢失情况,D0取得越小,图像丢失的细节越多。

在频域上,进行过中心变换的频域图像的中心是低频部分,内容会被保留。越往外的高频部分就越会被过滤掉,这样滤波后,频域图像内容基本就集中在中心附近了。

这里写图片描述

二、同态滤波来增强图像

1.算法描述

(1)先将空域图像取对数,

(2)然后进行快速傅里叶变换转至频域。

(3)将频域图像和频域滤波函数相乘。

滤波函数公式:H(i, j) = (gamma_H - gamma_L) * (1 - exp(-c * ((x ^ 2 + y ^ 2) / D0 ^ 2))) + gamma_L。这一步的D0由自己多次尝试,确定大约500至1000的效果不错,区间内差异不大,故用1000。

(4)傅里叶反变换回空域。

(5)空域再取指数,然后取实部,得到滤波后的图像。

2.Matlab代码

(1)函数HomomorphicFiltering(同态滤波):

HomomorphicFiltering.m

function H = HomomorphicFiltering( gamma_H, gamma_L, c, D0, height, width )
    for i = 1 : height
        x = i - (height / 2);
        for j = 1 : width
            y = j - (width / 2);
            H(i, j) = (gamma_H - gamma_L) * (1 - exp(-c * ((x ^ 2 + y ^ 2) / D0 ^ 2))) + gamma_L;
        end
    end
end

(2)函数BHPF(一阶Butterworth高通滤波):

BHPF.m

function H = BHPF( D0, height, width )
    for i = 1 : height
        x = i - (height / 2);
        for j = 1 : width
            y = j - (width / 2);
            H(i, j) = 1 / (1 + (D0 ^ 2) / (x ^ 2 + y ^ 2));
        end
    end
end

(3)函数Expand(拉伸像素值):

Expand.m

function new_img = Expand( img ) 
    [height, width] = size(img);
    max_pixel = max(max(img));
    min_pixel = min(min(img));
    for i = 1 : height
        for j = 1 : width
            new_img(i, j) = 255 * (img(i, j) - min_pixel) / (max_pixel - min_pixel);
        end
    end
    new_img = uint8(new_img);
end

(4)调用函数的脚本Task2:

Task2.m

img = imread('office.jpg');
img = rgb2gray(img);
[height, width] = size(img);
figure();
subplot(2, 2, 1);
imshow(img);
title('Raw Image');

gamma_H = 2;
gamma_L = 0.25;
c = 1;
D0 = 1000;
f = double(img);
f = log(f + 1);
F = fft2(f);
H = HomomorphicFiltering(gamma_H, gamma_L, c, D0, height, width);
g = ifft2(H .* F);
g = exp(g);
g = real(g);
new_img = Expand(g);
subplot(2,2,2);
imshow(new_img);
title('Homomorphic Filtered Image(D0 = 1000)');

f = double(img);
f = Centralize(f);
F = fft2(f);
D0 = 1;
H = BHPF(D0, height, width);
g = real(ifft2(H .* F));
g = Centralize(g);
subplot(2,2,3);
imshow(uint8(g));
title('BHPF with D0 = 1');

3.处理结果

下图为分别使用同态滤波和一阶Butterworth高通滤波器进行滤波与原图的对比。可以看到同态滤波后图像的亮度变得均衡,原来黑暗处的物体也能较清晰地显示。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/jacknights/article/details/79438849