同态图像过滤器源代码无效

时间:2018-08-04 20:24:07

标签: c# image-processing

看看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 个答案:

答案 0 :(得分:2)

该代码段将相同的线性变换应用于频域的每个值。这等效于对空间域中的每个像素应用相同的变换(傅立叶变换是线性的)

由于卷积是频域中的乘法,因此很容易看到线性变换和卷积换向,您可以在那里清楚地交换这两个运算。

因此,您正在将此恒定的线性变换应用于滤波器的输出。如果通过将值线性缩放到输出范围来显示输出,则将撤消此转换的任何影响。

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