2014-10-17 49 views
4

我想使用函數distanceTransform()來查找非零像素與零像素的最小距離,以及最接近零像素的位置。我使用labelType標誌設置爲DIST_LABEL_PIXEL來調用函數的第二個版本。一切工作正常,我得到的距離和最接近的零像素的指數。在OpenCV的距離變換中的像素索引

現在我想將索引轉換回像素位置,我認爲索引會像idx =(row * cols + col)或類似的東西,但我必須找出OpenCV只計算零像素並使用此計數作爲索引。因此,如果我將123作爲最接近像素的索引,則意味着第123個零像素是最接近的。

  1. OpenCV如何計算它們?可能以行方式?

  2. 是否有將索引映射回位置的有效方法?顯然,如果我知道OpenCV如何計算它們,我可以重新記錄它們並記錄計數和位置,但這看起來很愚蠢而且效率不高。

  3. 是否有充分的理由使用他們使用的索引?我的意思是,使用絕對索引有什麼優勢嗎?

在此先感謝。

編輯:

如果你要明白我的意思,你可以運行這個命令:

Mat mask = Mat::ones(100, 100, CV_8U); 
mask.at<uchar>(50, 50) = 0; 

Mat dist, labels; 
distanceTransform(mask, dist, labels, CV_DIST_L2, CV_DIST_MASK_PRECISE, DIST_LABEL_PIXEL); 

cout << labels.at<int>(0,0) << endl; 

你會看到,所有的標籤都是1,因爲只有一個零像素,但如何我應該找到那個信息的位置(50,50)?

回答

4

零像素也被標記 - 它們將與它們最接近的非零像素具有相同的標籤。

因此,您將擁有一個二維數組標籤,與您的源圖像大小相同。如果您檢查源圖像中的所有零像素,則可以從返回的二維數組中找到關聯的標籤。這樣就可以通過匹配標籤來查找哪些非零像素與每個零像素相關聯。

如果你明白我的意思。

+0

是的,我看到了,它是有道理的,因爲這些像素是最接近自己的。但是這也需要在圖像上進行額外的傳遞以收集零像素的標籤和位置。我完全沒有看到絕對索引的優勢。無論如何,謝謝,我沒有想到這一點,至少我不必自己數數。 – thomas 2014-10-17 09:53:20

+0

@thomas謝謝 - 你不需要額外的圖片傳遞,你可以在一個單一的過程中建立一個像素映射到標籤。只需要在算法中思考一下。 – 2014-10-17 10:08:26

+1

我之前沒有說過,但我想根據最接近的零像素的值和距離(顯然不在用於距離轉換的蒙版中)將值分配給非零像素。我認爲這可以通過一次完成,一個「獲得標籤,計算位置,獲取價值,做一些數學,分配價值」。現在我必須事先做標籤 - >位置映射通行證,除了我必須做的任務傳遞之外,它還是第二遍。 – thomas 2014-10-17 10:23:01