【问题标题】:DFT of image in Emgu 3.0+Emgu 3.0+ 中图像的 DFT
【发布时间】:2017-01-05 19:59:43
【问题描述】:

如何在 Visual Basic 中使用 Emgu 3.0+ 计算图像的 DFT?

我有一些图像作为带有 CvInvoke.Imread() 的 Mat 加载,我可以显示和更改它,我想计算该图像的正向 DFT,然后显示幅度。我怎样才能做到这一点?我在将有效的 IInputArrays 输入到 CvInvoke.Dft() 时遇到问题。目前我的 Emgu 版本是 3.1.0。

这是我目前使用的代码:

    Dim imgOrig As Mat
    imgOrig = CvInvoke.Imread(ofd.FileName, LoadImageType.AnyColor)

    EmguImageBox.Image = imgOrig

    Dim imgGrayscale As New Mat()
    CvInvoke.CvtColor(imgOrig, imgGrayscale, ColorConversion.Bgr2Gray)

    EmguImageBox.Image = imgGrayscale

    Dim imgDFT As Mat
    imgDFT = New Mat(imgOrig.Rows, imgOrig.Cols, DepthType.Cv32F, 2)

    CvInvoke.Dft(imgGrayscale, imgDFT, DxtType.Forward, 0)

    EmguImageBox.Image = imgDFT

【问题讨论】:

  • 您可以包含您已经尝试过的代码吗?
  • 我一直在尝试遵循这个家伙的方法:stackoverflow.com/questions/16812950/…,但出现了错误。我将添加一些我一直在尝试的代码。

标签: vb.net visual-studio opencv emgucv dft


【解决方案1】:

也许你已经解决了这个问题,但这里有一些信息可能会让其他有同样问题的人走上正确的道路。我自己尝试在 Emgu 版本 3.1.0 中做同样的事情,但只找到了使用旧版本 Emgu 的示例。终于搞定了,也许你可以在 VB 中实现。

 #region Perform FFT
                //Get optimal DFT size
                int m = CvInvoke.GetOptimalDFTSize(originalImg.Height);
                int n = CvInvoke.GetOptimalDFTSize(originalImg.Width);

                //Resize image
                Mat resizedImg = new Mat();
                CvInvoke.CopyMakeBorder(originalImg, resizedImg, 0, m - originalImg.Height, 0, n - originalImg.Width, Emgu.CV.CvEnum.BorderType.Default);

                //Create imaginary channel for original image    
                Mat imChannel = new Mat(resizedImg.Size, Emgu.CV.CvEnum.DepthType.Cv32F, 1);
                imChannel.SetTo(new MCvScalar(0));
                //Add both real and imaginary channel to Mat vector
                Emgu.CV.Util.VectorOfMat vectorMat = new Emgu.CV.Util.VectorOfMat(new Mat[2] { resizedImg, imChannel });
                //Create 2 channel Mat from the vector
                Mat FFTimg = new Mat(resizedImg.Size, Emgu.CV.CvEnum.DepthType.Cv32F, 2);
                CvInvoke.Merge(vectorMat, FFTimg);

                //Perform DFT
                CvInvoke.Dft(FFTimg, FFTimg, Emgu.CV.CvEnum.DxtType.Forward, 0);

                //Split channels to separate Mat objects
                CvInvoke.Split(FFTimg, vectorMat);

                //Calculate magnitudes
                Mat fftMag = new Mat();
                CvInvoke.Pow(vectorMat[0], 2, vectorMat[0]);
                CvInvoke.Pow(vectorMat[1], 2, vectorMat[1]);
                CvInvoke.Add(vectorMat[0], vectorMat[1], fftMag);
                CvInvoke.Sqrt(fftMag, fftMag);

                //Swith quadrants 
                Mat q1 = new Mat(fftMag, new System.Drawing.Rectangle(0, (int)(fftMag.Height - fftMag.Height / 2), (int)(fftMag.Width / 4), fftMag.Height - (int)(fftMag.Height - fftMag.Height / 2)));
                Mat q2 = new Mat(fftMag, new System.Drawing.Rectangle(0, 0, (int)(fftMag.Width / 4), (int)(fftMag.Height / 2)));

                Mat tmp = new Mat();
                q1.CopyTo(tmp);
                q2.CopyTo(q1);
                tmp.CopyTo(q2);
                #endregion

【讨论】:

    猜你喜欢
    • 2016-08-11
    • 1970-01-01
    • 2015-11-09
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    相关资源
    最近更新 更多