0

我正在对 emgu cv 使用傅里叶变换做一个小实验。我的目标是对图像进行傅立叶变换,然后再次进行傅立叶逆变换,并检查图像是否显示。从数学上讲,它应该。

这是我的代码,我认为它是正确的

Image<Gray, float> image = new Image<Gray, float>("c://box1.png");
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);


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

IntPtr complexImage2 = CvInvoke.cvCreateImage(idft.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 2);

CvInvoke.cvShowImage("picture", idft);
System.Threading.Thread.Sleep(99999); // to wait and see the picture

我有两个问题:

1-错误:出现一个错误说“OpenCV:源图像必须有1、3或4个通道”我相信它与IDFT有关,但我无法解决它

2-它仍然显示输出图像,但不幸的是,它不是输入的原始图像。所有显示的是纯灰色图像。

谢谢。

4

1 回答 1

0

尝试这个

Image<Gray, Single> theImage = new Image<Gray, Single>("C://box1.png");
Image<Gray, Single> DFT = new Image<Gray, Single>(theImage.Size);
Image<Gray, Single> original = new Image<Gray, Single>(theImage.Size);

CvInvoke.cvDFT(theImage.Convert<Gray, Single>().Ptr, DFT.Ptr,  Emgu.CV.CvEnum.CV_DXT.CV_DXT_FORWARD, -1);
CvInvoke.cvDFT(DFT.Convert<Gray, Single>().Ptr, original.Ptr,  Emgu.CV.CvEnum.CV_DXT.CV_DXT_INVERSE, -1);

这是灰度,对于 RGB 图像,您可以将图像拆分为灰度图像数组,并对每个通道执行上述过程。即使用 theImage.Split()

你不会得到一个精确的原始图像,但它应该是接近的

于 2013-04-10T00:03:09.020 回答