2011-10-04 374 views
-1

我想檢測二進制圖像中的分叉和端點。圖像已經變細了。一直在閱讀如何能夠做到這一點的方式,但我不知道如何能夠在OpenCV中實現它。我所知道的是,我必須使用3x3窗口來掃描整個圖像。然後,如果3x3窗口上0像素的總和小於或等於5,則這是分叉現象,如果總和爲7,則爲終止分支;如果是6是連續的線。使用OpenCV檢測二進制圖像的分叉和端點

首先,我不知道如何在OpenCV中聲明3x3窗口以及如何訪問組成窗口的9個塊中的每個塊。

其次我該如何將窗口移到圖像上。將不勝感激您的幫助,示例代碼也會做。

+0

你跟OpenCV的使用哪種語言不能整除:C ,C++還是Python? – misha

+0

嗨米莎,我在C++中使用OpenCV – user854576

回答

0

爲了得到一個矩陣的3×3窗口中,你可以做以下

Mat image = imread("image.png", 0); 
// binarize it with cv::threshold or cv::adaptiveThreshold or something else. 
Rect r(0, 0, 3, 3); 
// this gets a 3x3 window starting with upper left of (0, 0) pixel 
Mat windowImage(image, r); 

注意:關注你獲得該區域只有原來矩陣內的參考,如果你想要一個副本你」你需要調用窗口的clone()成員。這有點讓我想起了幾次:D

要訪問塊內的像素,您可以使用Mat類的at()成員函數。像這樣(假設你的圖像類型CV_8UC1的):

// block processing loops 
for(int i = 0; i < windowImage.rows; i++) 
{ 
    for(int j = 0; j < windowImage.cols; j++) 
    { 
     unsigned char val = windowImage.at<unsigned char>(i, j); 
     // do pixel processing logic here... 
    } 
} 

另外,注意在()成員具有一些開銷,因此,如果您想在使用數據指針來加快速度快的樣子。

要移動窗口,您需要移動感興趣的矩形區域的位置。 Rect構造函數的前兩個參數以左上角的x和y位置開始。所以你需要將你的圖像分塊。

const int BLOCK_SIZE = 3; 
int rowBlocks = image.rows/BLOCK_SIZE; 
int colBlocks = image.cols/BLOCK_SIZE;  

for(int i = 0; i < rowBlocks; i++) 
{ 
    for(int j = 0; j < colBlocks; j++) 
    { 
     Mat block_ij(image, Rect(i, j, BLOCK_SIZE, BLOCK_SIZE)); 
     // block process here... 
    } 
} 

注意:您可能需要看看該功能copyMakeBorder添加邊框圖像周圍的情況下,當你的圖像尺寸爲3

+0

非常感謝你mevatron,讓我試試這個。 – user854576

+0

很高興能幫到你!讓我知道這是否適合你。 – mevatron

相關問題