如何在 Matlab 中实现同态滤波器?
How can I implement a Homomorphic filter in Matlab?
我已经从 here 获取源代码并尝试修改它以满足我的需要。但是,过滤器没有按预期工作。我无法在我的代码中找到问题。
我修改后的代码有什么问题?
预期输出
实际输出
源代码
main.m
clc
close all
clear all
d=10;
order=2;
im=double(imread('tun.png'));
subplot(121)
imshow(im./255);
[r, c]=size(im);
j = homofil(im,d,order);
imshow(j);
homofil.m
function output = homofil(I, d, n)
I = double(I);
H = butter_hp_kernel(I, d, n);
alphaL = .0999;
aplhaH = 1.01;
H = ((aplhaH-alphaL).*H)+alphaL;
H = 1-H;
im_l = log2(1+I);
im_f = fft2(im_l);
im_nf = H.*im_f;
im_n = abs(ifft2(im_nf));
output = exp(im_n);
butter_hp_kernel.m
function k = butter_hp_kernel(I, Dh, n)
Height = size(I,1);
Width = size(I,2);
[u, v] = meshgrid( ...
-floor(Width/2) :floor(Width-1)/2, ...
-floor(Height/2): floor(Height-1)/2 ...
);
k = butter_hp_f(u, v, Dh, n);
function f = butter_hp_f(u, v, Dh, n)
uv = u.^2+v.^2;
Duv = sqrt(uv);
frac = Dh./Duv;
%denom = frac.^(2*n);
A=0.414; denom = A.*(frac.^(2*n));
f = 1./(1.+denom);
输入图像
我有更详细的解释,Whosebug 进入维护,但我不能post。所以这里是单行解释。
你的 j 范围是错误的:[1, 1.08] 所以它显示为白色。
执行 imshow(j, [])
或将 j 转换为 mat2gray
我已经从 here 获取源代码并尝试修改它以满足我的需要。但是,过滤器没有按预期工作。我无法在我的代码中找到问题。
我修改后的代码有什么问题?
预期输出
实际输出
源代码
main.m
clc
close all
clear all
d=10;
order=2;
im=double(imread('tun.png'));
subplot(121)
imshow(im./255);
[r, c]=size(im);
j = homofil(im,d,order);
imshow(j);
homofil.m
function output = homofil(I, d, n)
I = double(I);
H = butter_hp_kernel(I, d, n);
alphaL = .0999;
aplhaH = 1.01;
H = ((aplhaH-alphaL).*H)+alphaL;
H = 1-H;
im_l = log2(1+I);
im_f = fft2(im_l);
im_nf = H.*im_f;
im_n = abs(ifft2(im_nf));
output = exp(im_n);
butter_hp_kernel.m
function k = butter_hp_kernel(I, Dh, n)
Height = size(I,1);
Width = size(I,2);
[u, v] = meshgrid( ...
-floor(Width/2) :floor(Width-1)/2, ...
-floor(Height/2): floor(Height-1)/2 ...
);
k = butter_hp_f(u, v, Dh, n);
function f = butter_hp_f(u, v, Dh, n)
uv = u.^2+v.^2;
Duv = sqrt(uv);
frac = Dh./Duv;
%denom = frac.^(2*n);
A=0.414; denom = A.*(frac.^(2*n));
f = 1./(1.+denom);
输入图像
我有更详细的解释,Whosebug 进入维护,但我不能post。所以这里是单行解释。
你的 j 范围是错误的:[1, 1.08] 所以它显示为白色。
执行 imshow(j, [])
或将 j 转换为 mat2gray