2015-11-23 112 views
1

我想使用python OpenCV查找並分離邊緣檢測圖像中的所有邊緣。邊緣可以是輪廓形式,但不一定。我只想將所有連接的邊緣像素分組在一起。因此從技術上講該算法可程序化聽起來是這樣的:使用OpenCV查找連接的組件

  1. 對於每個邊緣像素,找到相鄰(連接)邊緣像素,並將其添加到圖像的當前細分,直到你無法找到一個了。
  2. 然後移動到下一個未檢查的邊緣像素並開始一個新的細分,並再次執行1)。

我查看了cv.findContours,但結果並不令人滿意,可能是因爲它是用於輪廓(封閉邊緣)而不是自由端點。下面是結果:

原邊檢測:

我預計五個棱將分別被分成了自己的細分:

輪廓加工後圖像,但顯然cv2.findContours函數將邊緣2分割成更多細分,我不想要這些細分。

這裏是我用來保存這些2個圖像的代碼:

def contourForming(imgData): 
     cv2.imshow('Edge', imgData) 
     cv2.imwrite('EdgeOriginal.png', imgData) 
     contours = cv2.findContours(imgData, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 
     cv2.imshow('Contours', imgData) 
     cv2.imwrite('AfterFindContour.png', imgData) 
     cv2.waitKey(0) 
     pass 

有限制我的實現,但是。我必須使用Python 2.7和OpenCV2。除此之外,我無法使用任何其他修訂或語言。我這樣說是因爲我知道OpenCV 2有一個使用C++的connectedComponent函數。我本可以使用,但問題是,由於某些限制,我無法使用它。

那麼,任何想法我應該如何處理這個問題?

+1

你可以嘗試cv ::輪廓提取之前擴大邊緣,但可能會改變結果 – Micka

回答

2

使用findContours是正確的方法,你只是做錯了。

細看的文檔:

注:源圖像通過該功能進行修改。

「經過輪廓處理」圖像確實來自findContours垃圾結果。因此,如果您想在findContours的調用後保留原始圖像,通常會將克隆的圖像傳遞給該函數。

有意義findContours的結果在contours。你需要使用drawContours來繪製它們,通常在一張新圖像上。

這是結果我得到:

enter image description here

與下面的C++代碼:

#include <opencv2/opencv.hpp> 
using namespace cv; 

int main(int argc, char** argv) 
{ 
    // Load the grayscale image 
    Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE); 

    // Prepare the result image, 3 channel, same size as img, all black 
    Mat3b res(img.rows, img.cols, Vec3b(0,0,0)); 

    // Call findContours 
    vector<vector<Point>> contours; 
    findContours(img.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_NONE); 

    // Draw each contour with a random color 
    for (int i = 0; i < contours.size(); ++i) 
    { 
     drawContours(res, contours, i, Scalar(rand() & 255, rand() & 255, rand() & 255)); 
    } 

    // Show results 
    imshow("Result", res); 
    waitKey(); 

    return 0; 
} 

應該很容易移植到Python(我很抱歉,但我可以給你的Python代碼,因爲我無法測試它)。您也可以查看具體的OpenCV - Python tutorial來檢查如何正確使用findContoursdrawContours

+0

謝謝!我認爲它現在有效。我不知道你給OpenCV 3.0.0的文檔([link](http://docs.opencv.org/master/d4/d73/tutorial_py_contours_begin.html#gsc.tab=0))適用於OpenCV 2.7也是。 – aiman