2016-08-13 68 views
0

我正在處理二進制圖像以獲得其優勢。我使用opencv的cannyedge函數,但結果不太理想。如何獲得沒有斷線的清潔邊緣?

Click for the Images

int edgeThresh = 1; 
    int lowThreshold = 100; 
    int const max_lowThreshold = 100; 
    int ratio = 3; 
    int kernel_size = 3; 

    blur(binaryImage, detected_edges, Size(3, 3)); 
    Canny(binaryImage, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size); 
    dst = Scalar::all(0); 
    src.copyTo(dst, detected_edges); 
    imwrite(defaultPath + "edge_" + filename, dst); 

我做了一個骯髒的解決辦法,其工作原理,但再次加處理時間:

Canny(detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size); 
    blur(detected_edges, detected_edges, Size(3, 3)); 
    Canny(detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size); 

我是新來的OpenCV和圖像處理,最有可能的,我失去了一些東西。

請賜教。謝謝!

+0

沒有看看你的圖像,但LineSegementDetector是相當強大的 – Micka

回答

0

FIRSTLY:對於像這樣的圖像,它只是白色和黑色像素,使用findContours函數,它會更快,更精確。如果您需要繪製剛剛找到的輪廓(繪製結果),請使用drawContours函數(繪製新的矩形,與找到輪廓的尺寸相同)。

關於此文檔HERE

SECONDLY:它可能是一個問題,您的內核大小或閾值值不正確。第二個閾值建議比第一個大3倍。我認爲這個問題可能與你的內核大小有關(Canny函數中的最後一個參數)。根本不要使用這個函數重載,使用沒有這個參數的函數或者降低你的內核大小。

+0

這裏是值: int edgeThresh = 1; \t \t int lowThreshold = 100; \t \t int const max_lowThreshold = 100; \t \t int ratio = 3; \t \t int kernel_size = 3; 我會嘗試findCountours現在。我會更新結果。謝謝! – DGMJ

+0

我研究了findContours,正是我需要的。謝謝! – DGMJ