【问题标题】:Filtering on Fourier image and then taking its Inverse fourier to get the image对傅里叶图像进行滤波,然后取其逆傅里叶得到图像
【发布时间】:2014-12-14 23:16:56
【问题描述】:
       // Fourier transform of Image<Bgr,byte> orig object.
       // output is matrix<float> with 2 channels.

        private Matrix<float> fourier()
    {
        Image<Gray, float> image = orig.Convert<Gray, float>();
        IntPtr complexImage = CvInvoke.cvCreateImage(image.Size,Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_32F, 2);

        CvInvoke.cvSetZero(complexImage);  // Initialize all elements to Zero
        CvInvoke.cvSetImageCOI(complexImage, 1);
        CvInvoke.cvCopy(image, complexImage, IntPtr.Zero);
        CvInvoke.cvSetImageCOI(complexImage, 0);

        Matrix<float> dft = new Matrix<float>(image.Rows, image.Cols, 2);
        CvInvoke.cvDFT(complexImage, dft, Emgu.CV.CvEnum.CV_DXT.CV_DXT_FORWARD, 0);

        //The Real part of the Fourier Transform
        Matrix<float> outReal = new Matrix<float>(image.Size);
        //The imaginary part of the Fourier Transform
        Matrix<float> outIm = new Matrix<float>(image.Size);
        CvInvoke.cvSplit(dft, outReal, outIm, IntPtr.Zero, IntPtr.Zero);
        return dft;
    }

    // butterworth filter with Do frequency and order n.
    // Filter is returned as matrix<float> with 2 channels. 

    private Matrix<float> make_butterworth(int Do, int n)
    {
        Matrix<float> ff = fourier();
        Matrix<float> tmp = new Matrix<float>(ff.Rows, ff.Cols, 2);

        Point center=new Point(tmp.Rows/2,tmp.Cols/2);

        for (int i=0;i<orig.Rows;i++)
            for (int j = 0; j < orig.Cols; j++)
            {
                  int Duv= (int) (Math.Sqrt( Math.Pow(i-center.X,2) + Math.Pow(j-center.Y,2)));
                  tmp[i, j] = (float) (1 / (1 + Math.Pow((Duv / Do), 2 * n)));
            }

        return tmp;
    }


    // The click event which will trigger fourier() and
       make_butterworth() takes Do and n order input from user
       and applies filter on orig image.

    private void lowPassToolStripMenuItem2_Click(object sender, EventArgs e)
    {
        dialog_input d1 = new dialog_input("Enter values of Do and order n seperated by space:\n");
        d1.ShowDialog();
        string[] s = d1.t.Split(new char[] { ' ', ',' });
        int fc = Convert.ToInt32(s[0]);
        int order = Convert.ToInt32(s[1]);

        Matrix<float> filter= make_butterworth(fc, order); // 2 channels
        Matrix<float> m = fourier(); // 2 channels
        m._Mul(filter);
        // filter * with fourier image.
        CvInvoke.cvDFT(m,m,CV_DXT.CV_DXT_INVERSE, 0);

        IntPtr cmplx = CvInvoke.cvCreateImage(m.Size, IPL_DEPTH.IPL_DEPTH_32F, 2);
        CvInvoke.cvSetZero(cmplx);
        CvInvoke.cvSetImageCOI(cmplx, 0);
        CvInvoke.cvCopy(m, cmplx, IntPtr.Zero);

        Bitmap bm = new Bitmap(m.Width, m.Height);

        BitmapData bd = bm.LockBits(new Rectangle
            (0, 0, bm.Width, bm.Height),
            ImageLockMode.ReadWrite,
            PixelFormat.Canonical);

        bd.Scan0 = cmplx;

        bm.UnlockBits(bd);
        pictureBox2.Image = bm;
      }

我将fourier() 作为2 个通道而不是只采用真实通道的一件事。我不确定我在这方面是否错了。这也是为什么我必须将过滤器作为 2 个通道,其中 2 个通道用于表示两种情况下的灰色和 Alpha 数据。

由于 pixelFormat.Canonical 参数,在 bitmapdata 对象初始化时出现问题。傅立叶矩阵和滤波器矩阵相乘的结果是矩阵浮点数。我要做的就是获取它的 IDFT 并显示过滤后的图像。不确定 PixelFormat。任何帮助都会很棒。

【问题讨论】:

  • 下次请更好的cmets!您的代码不足以说明任何内容,请发布更多信息。 FFT 的流程是:1)加载图像 2)创建滤波器 3)应用 FFT 得到图像光谱(复杂图像) 4)将光谱乘以滤波器(复杂结果) 5)对结果应用 IFFT(真实图像)
  • 请检查编辑。谢谢

标签: image-processing filtering emgucv frequency-domain


【解决方案1】:

阅读本章:opencv DFT tutorialC code DFTopencv DFT python它解释了您需要了解的关于 opencv 中的 DFT 的所有信息。 关于种类

1) 图像是真实的

2) DFT(Image) 生成复杂的图像。

3) butterworth 是一个具有相同图像大小的单通道矩阵。

4) 进行过滤,将 DFT 结果图像的每个通道乘以巴特沃斯滤波器。每个通道必须相乘分离,因为我们在一个通道中分配了每个像素的实部和复数部分,这是 DFT 的结果。how filtering works

5) 过滤后你会得到一个复杂的图像

6) 现在您可以应用具有真实图像的 IDFT。在 opencv 中,您可能会得到一个复杂的图像,但第二个通道完全为零,因此您可以丢弃。

看这里:opencv C++ DFT

【讨论】:

    猜你喜欢
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2017-04-19
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    相关资源
    最近更新 更多