我想檢測二進制圖像中的分叉和端點。圖像已經變細了。一直在閱讀如何能夠做到這一點的方式,但我不知道如何能夠在OpenCV中實現它。我所知道的是,我必須使用3x3窗口來掃描整個圖像。然後,如果3x3窗口上0像素的總和小於或等於5,則這是分叉現象,如果總和爲7,則爲終止分支;如果是6是連續的線。使用OpenCV檢測二進制圖像的分叉和端點
首先,我不知道如何在OpenCV中聲明3x3窗口以及如何訪問組成窗口的9個塊中的每個塊。
其次我該如何將窗口移到圖像上。將不勝感激您的幫助,示例代碼也會做。
我想檢測二進制圖像中的分叉和端點。圖像已經變細了。一直在閱讀如何能夠做到這一點的方式,但我不知道如何能夠在OpenCV中實現它。我所知道的是,我必須使用3x3窗口來掃描整個圖像。然後,如果3x3窗口上0像素的總和小於或等於5,則這是分叉現象,如果總和爲7,則爲終止分支;如果是6是連續的線。使用OpenCV檢測二進制圖像的分叉和端點
首先,我不知道如何在OpenCV中聲明3x3窗口以及如何訪問組成窗口的9個塊中的每個塊。
其次我該如何將窗口移到圖像上。將不勝感激您的幫助,示例代碼也會做。
爲了得到一個矩陣的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
非常感謝你mevatron,讓我試試這個。 – user854576
很高興能幫到你!讓我知道這是否適合你。 – mevatron
你跟OpenCV的使用哪種語言不能整除:C ,C++還是Python? – misha
嗨米莎,我在C++中使用OpenCV – user854576