2011-03-13 124 views
1

我正在做一些圖像處理學習,我用新的C++ iterface使用openCV。OpenCV二進制圖像只得到白色像素不工作

我有一個RGB圖像,我讀了灰度版本,均衡直方圖,然後使用canny來檢測邊緣。

問題是:Canny函數返回灰度圖像還是二進制圖像? 我使用double for循環來檢查應用Canny邊緣檢測器得到的圖像中的像素值,並且我有許多完全不同的值。在二進制圖像必須只有兩個值0或1(0或255)...我該怎麼做?

我的代碼:

imagen = imread(nombre_imagen,0); //lee la imagen en escala de grises 
equalizeHist(imagen,imagen); 
Canny(binary,binary,0.66*threshold,1.33*threshold,3,true); 
for(int i=0;i<binary.rows;i++){ 
    for(int j=0;j<binary.cols;j++){ 
     std::cout << binary.at<float>(i,j)<< ","; 
    } 
    std::cout << "\n"; 
} 

這是一個183x183矩陣,我可以看到很多值甚至有些nan的。 我該如何製作這個二進制文件?

對於Canny函數,我使用獲取灰度圖像的「平均值」的閾值;我在這裏看到它:http://www.kerrywong.com/2009/05/07/canny-edge-detection-auto-thresholding/

回答

0

文檔(http://opencv.willowgarage.com/documentation/cpp/imgproc_feature_detection.html?highlight=canny#Canny)說:

空隙的Canny(常量墊&圖像,墊&邊緣,雙閾值1,雙閾值2,INT apertureSize = 3,布爾L2gradient =假)

第二個參數 - 邊緣 - 輸出邊緣圖。它將具有與圖像相同的尺寸和相同類型

在您的調用中,您傳遞與第二個參數相同的源圖像,這會導致我認爲奇怪的結果。

+0

是使用另一個墊子圖像的結果 – matiasfh 2011-03-15 23:06:39

+0

這很奇怪。在我的程序中,我這樣使用它: 'cv :: Mat after; cv :: Canny(m_mImage,之後,50,120);' 它的功能完美。也許嘗試沒有L2gradient設置爲true。您是否檢查了您的閾值功能是否正常工作? – Yax 2011-03-16 18:01:16

1

二進制圖像有您需要轉換爲int(或unsigned int)型uchar如果你想在0-255範圍:

for(int i=0;i<edges.rows;i++) { 
    for(int j=0;j<edges.cols;j++) { 
     std::cout << (int)edges.at<uchar>(i,j)<< ","; 
    } 
    std::cout << "\n"; 
} 

應該避免C風格的演員,但我會離開作爲讀者的練習。