1

我一直在尝试使用 OpenCV2 和 NumPy 在 MATLAB 和 Python 上实现频域同态滤波器,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

我真的不明白,为什么结果如此不同?有人有什么主意吗?

4

0 回答 0