(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)在频域上,进行过中心变换的频域图像的中心是低频部分,内容会被保留。越往外的高频部分就越会被过滤掉,这样滤波后,频域图像内容基本就集中在中心附近了。
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
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
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');
下图为使用一阶Butterworth低通滤波器频域滤波,且D0分别为10、20、40、80时的效果图对比,可以看到,随着D0的增大,滤波后的图像也变得更清晰,因为更少的高频成分被滤去。
在空域上,滤波后的空域图像会减少高频噪声,但D0的大小选择也决定了图像本身的高频成分丢失情况,D0取得越小,图像丢失的细节越多。
在频域上,进行过中心变换的频域图像的中心是低频部分,内容会被保留。越往外的高频部分就越会被过滤掉,这样滤波后,频域图像内容基本就集中在中心附近了。
(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)空域再取指数,然后取实部,得到滤波后的图像。
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
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
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
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');
下图为分别使用同态滤波和一阶Butterworth高通滤波器进行滤波与原图的对比。可以看到同态滤波后图像的亮度变得均衡,原来黑暗处的物体也能较清晰地显示。