2013-03-25 161 views
0

我正在使用emgu cv上的傅里葉變換做一個小實驗。我的目標是對圖像進行傅立葉變換,然後再進行逆傅里葉變換,並檢查圖像是否顯示。數學上,它應該。EMGU CV C傅里葉變換#

這是我的代碼,我相信這是正確的

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-它仍然顯示輸出圖像,但不幸的是,它不是輸入的原始圖像。所有顯示的都是純灰色的圖像。

謝謝。

回答

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()

你不會得到一個確切的原始圖像,但它應該是接近

+0

代碼缺少轉換函數的括號。它應該是: CvInvoke.cvDFT(DFT.Convert ()。Ptr,original.Ptr,Emgu.CV.CvEnum.CV_DXT.CV_DXT_INVERSE,-1); – 2014-02-04 01:28:32