Я сделал один и тот же код на MATLAB и Python, но ifft2 возвращает разные значения?
Я пытался реализовать гомоморфный фильтр в частотной области как на MATLAB, так и на Python, используя OpenCV2 и NumPy, код MATLAB дает ожидаемый ответ, а Python - нет, получающееся изображение очень странное. Я проверил все переменные и пришел к выводу, единственное, что есть разница, это IFFT. На MATLAB результаты могут быть применены к exp
Функция и возвращает отфильтрованное исходное изображение ожидаемого, но значения Python ifft
очень разные. Я случайно видел другие посты с похожими проблемами, но не получил удовлетворительного ответа (возможно, я просто плохо искал тоже...). Код MATLAB
function [ img_r ] = homomorphic( img, D0, n )
[N, M] = size(img);
img_bk = double(img);
img_bk = log(img_bk+1);
img_freq = fftshift(fft2(img_bk));
magA = uint8(10*log(1+abs(img_freq)));
cu = M/2;
cv = N/2;
Hf = zeros(N,M);
for v = 1:N
dv = v - cv;
for u = 1:M
du = u - cu;
D = sqrt(du*du + dv*dv);
num = 1;
if D > 0
den = 1+((D0/D)^(2*n));
else
den = 0; %to replace +inf
end
if den ~= 0
H = num/den;
else
H = 0;
end
img_freq(v,u) = H*img_freq(v,u);
end
end
magB = uint8(10*log(1+abs(img_freq)));
img_r = (ifft2(ifftshift(img_freq)));
img_r = exp(img_r);
img_r = uint8(img_r);
и код Python (может быть несколько ошибок, но в целом работает)
import numpy as np
import cv2
def homomorphic(img, D0, n=2):
[N,M] = img.shape
img_bk = np.log(1 + np.float64(img))
img_freq = np.fft.fftshift(np.fft.fft2(img_bk))
cu = M/2.0
cv = N/2.0
for v in range(N):
dv = v - cv
for u in range(M):
du = u - cu
D = np.sqrt(du*du + dv*dv)
if D != 0:
a = 1.0 + (D0/D)**(2*n)
H = 1/a
else:
print D
H = 0
img_freq[v][u] = H*img_freq[v][u]
img_r = np.abs(np.fft.ifft2(np.fft.ifftshift(img_freq)))
eimg = np.exp(img_r)
eimg = np.uint8(eimg)
return eimg
Я действительно не понимаю, почему результаты такие разные? У кого-нибудь есть идеи?