为什么 AForge.net 在 FFT 自相关的情况下给出不同的输出?

Why is AForge.net giving a different output in case of FFT Auto-correlation?

看到这个

我想使用 AForge.net 框架获得相同的结果。输出应匹配以下内容:

输出似乎没有按预期出现:

为什么 AForge.net 中的输出不同?

源代码

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        Bitmap image = (Bitmap)Bitmap.FromFile(@"StandardImage\lena.png");
        Bitmap conv = new Bitmap(image.Width, image.Height, image.PixelFormat);

        ComplexImage cImage = ComplexImage.FromBitmap(image);
        cImage.ForwardFourierTransform();

        ComplexImage cKernel = ComplexImage.FromBitmap(image);
        cImage.ForwardFourierTransform();

        ComplexImage convOut = ComplexImage.FromBitmap(conv);
        convOut.ForwardFourierTransform();

        for (int y = 0; y < cImage.Height; y++)
        {
            for (int x = 0; x < cImage.Width; x++)
            {
                convOut.Data[x, y] = cImage.Data[x, y] * cKernel.Data[x, y];
            }
        }

        convOut.BackwardFourierTransform();

        Bitmap bbbb = convOut.ToBitmap();

        pictureBox1.Image = bbbb;

    }
}

你似乎没有在 Aforge 中使用高斯内核, 不管怎样,图书馆有一个与高斯卷积的方法:

int w=4,h=11;
GaussianBlur filter = new GaussianBlur( w, h );
// apply the filter
filter.ApplyInPlace( image );

试试吧,输出应该和其他的一样。

主要问题是

    ComplexImage cKernel = ComplexImage.FromBitmap(image);
    //cImage.ForwardFourierTransform(); //<--- This line should be FFT of cKernel
    cKernel.ForwardFourierTransform();

这将解决您在结果图像中提到的问题,但如果您想要获得与右下角图像相似的图像,您需要进行一些归一化以增加像素强度。


更新: 右下角的图像实际上是傅里叶图像,所以我认为我们应该删除 BFF。

//convOut.BackwardFourierTransform();