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

为什么aforge.net在fft自相关的情况下提供不同的输出?

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

    请参见相关问题。

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

    输出似乎不像预期的那样:

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

    源代码

    public分部类form1:form
    {
    公共窗体()
    {
    初始化组件();
    
    位图图像=(bitmap)bitmap.fromfile(@“standardimage\\lena.png”);
    bitmap conv=新位图(image.width,image.height,image.pixelformat);
    
    composimage cimage=composimage.frombitmap(图像);
    cimage.forwardFourierTransform();
    
    composimage ckernel=位图中的composimage.frombitmap(图像);
    cimage.forwardFourierTransform();
    
    复杂性图像保护=复杂性图像。来自位图(conv);
    cavout.forwardFourierTransform();
    
    对于(int y=0;y<cimage.height;y++)
    {
    对于(int x=0;x<cimage.width;x++)
    {
    cavout.data[x,y]=cimage.data[x,y]*ckernel.data[x,y];
    }
    }
    
    cavout.backwardFourierTransform();
    
    bitmap bbbb=cavout.tobitmap();
    
    图片框1.image=bbbb;
    
    }
    }
    < /代码> <框架。输出应符合以下要求:

    enter image description here

    产出似乎没有达到预期:

    为什么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;
    
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Amir Ehsani    6 年前

    主要问题是

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

    这将解决您在生成的图像中提到的问题,但是如果您想要获得类似于右下角图像的图像,则需要进行一些规范化以增加像素的强度。


    更新: 右下角的图像实际上是一个傅立叶图像,所以我认为我们应该去掉BFF。

    //convOut.BackwardFourierTransform();
    

        2
  •  0
  •   Dr.Haimovitz    6 年前

    好像你没有用过高斯核, 无论如何,该库有一种与高斯卷积的方法:

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

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