2012-11-20 50 views
0

我在OpenCV中創建了以下高斯內核,並將其與OpenCV的GaussianBlur函數進行比較。但是,我得到一個黑色的圖像,而不是一個光滑的圖像。有人可以對此有所瞭解嗎?使用opencv進行高斯平滑

Mat src, dst1,dst2; 
Mat gaussiankrnl(3,3,CV_32F); 
Point anchor; 
double delta; 
int ddepth; 

anchor = Point(-1, -1); 
delta = 0; 
ddepth = -1; 

src = imread("coins.pgm"); 




gaussiankrnl.at<double>(0,0) = 1/16; 
gaussiankrnl.at<double>(0,1) = 2/16; 
gaussiankrnl.at<double>(0,2) = 1/16; 
gaussiankrnl.at<double>(1,0) = 2/16; 
gaussiankrnl.at<double>(1,1) = 4/16; 
gaussiankrnl.at<double>(1,2) = 2/16; 
gaussiankrnl.at<double>(2,0) = 1/16; 
gaussiankrnl.at<double>(2,1) = 2/16; 
gaussiankrnl.at<double>(2,2) = 1/16; 


filter2D(src, dst1, ddepth , gaussiankrnl, anchor, delta, BORDER_DEFAULT); 

GaussianBlur(src, dst2, Size(3,3), 1.0); 

imshow("result1", dst1); 
imshow("result2", dst2); 

cvWaitKey(0); 
return 0; 

回答

5

你正在分割整數和零內核。

更改1/161.0/16.0以及其他值。

+0

嗨,謝謝。你能告訴我爲什麼結果有差異嗎?他們不應該是一樣的嗎??我在此發佈了結果:http://i47.tinypic.com/2qn7br6.png –

+0

更改爲1.0/16.0有所幫助。另外我使用CV_32F,這是錯誤的。相反,必須使用CV_64F。 –

+0

如果您在C++中編寫1/16,則會得到整數除法,結果爲1/16 = 0,然後將其轉換爲double。您必須將這些數字中的至少一個加倍。您可以通過投射或在其中一個數字的末尾附加.0(或僅)。 1./16也會起作用。 –