代码之家  ›  专栏  ›  技术社区  ›  user366312

同态图像滤波源代码不起作用

  •  1
  • user366312  · 技术社区  · 7 年前

    看一看 this link .

    enter image description here

    public struct COMPLEX
    {
        public double real, imag;
        public Complex(double x, double y)
        {
            real = x;
            imag = y;
        }
        public float Magnitude()
        {
            return ((float)Math.Sqrt(real * real + imag * imag));
        }
        public float Phase()
        {            
             return ((float)Math.Atan(imag / real));
        }
    }
    
    public static COMPLEX[,] ApplyFilterHMMFreqDomain(COMPLEX[,] FFTData, 
                  float rH, float rL, float Sigma, float Slope)
    {
        COMPLEX[,] Output = new COMPLEX[FFTData.GetLength(0), FFTData.GetLength(1)];
        int i, j, W, H;
    
        W = FFTData.GetLength(0);
        H = FFTData.GetLength(1);
    
        double Weight;
        //Taking FFT of Gaussian HPF
        double[,] GaussianHPF = 
          GenerateGaussianKernelHPF(FFTData.GetLength(0), Sigma, Slope, out Weight);
    
        //Variables for FFT of Gaussian Filter
        COMPLEX[,] GaussianHPFFFT;
    
    
        for (i = 0; i <= GaussianHPF.GetLength(0) - 1; i++)
            for (j = 0; j <= GaussianHPF.GetLength(1) - 1; j++)
            {
                GaussianHPF[i, j] = GaussianHPF[i, j];// / Weight;
            }
    
        FFT GaussianFFTObject = new FFT(GaussianHPF);
        GaussianFFTObject.ForwardFFT(GaussianHPF);
        //Shifting FFT for Filtering
        GaussianFFTObject.FFTShift();
    
    
        GaussianHPFFFT = GaussianFFTObject.FFTShifted;
        for (i = 0; i <= GaussianHPF.GetLength(0) - 1; i++)
            for (j = 0; j <= GaussianHPF.GetLength(1) - 1; j++)
            {
                GaussianHPFFFT[i, j].real = (rH - rL) * GaussianHPFFFT[i, j].real + rL;
                GaussianHPFFFT[i, j].imag = (rH - rL) * GaussianHPFFFT[i, j].imag + rL;
            }
    
        // Applying Filter on the FFT of the Log Image by Multiplying in Frequency Domain
        Output = MultiplyFFTMatrices(GaussianHPFFFT, FFTData);
    
        return Output;
    }
    

    经过详细的实验,我发现下面这段源代码没有任何影响,或者说影响很小:

    for (i = 0; i <= GaussianHPF.GetLength(0) - 1; i++)
        for (j = 0; j <= GaussianHPF.GetLength(1) - 1; j++)
        {
            GaussianHPFFFT[i, j].real = (rH - rL) * GaussianHPFFFT[i, j].real + rL;
            GaussianHPFFFT[i, j].imag = (rH - rL) * GaussianHPFFFT[i, j].imag + rL;
        }
    

    有人能解释一下为什么这部分代码不重要吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Cris Luengo    7 年前

    这段代码对频域的每个值应用相同的线性转换。这相当于对空间域中的每个像素应用相同的变换(傅里叶变换是线性的)

    线性变换和卷积通勤,因为卷积是频域中的乘法,所以很容易看出,您可以在那里清楚地交换这两个操作。

    因此,您要将此常量线性变换应用于滤波器的输出。如果通过将值线性缩放到输出范围来显示输出,则将撤消此转换的任何效果。

    我的猜测是,它的存在将输出的空间域图像缩放到一个有意义的范围。