我想使用函數distanceTransform()來查找非零像素與零像素的最小距離,以及最接近零像素的位置。我使用labelType標誌設置爲DIST_LABEL_PIXEL來調用函數的第二個版本。一切工作正常,我得到的距離和最接近的零像素的指數。在OpenCV的距離變換中的像素索引
現在我想將索引轉換回像素位置,我認爲索引會像idx =(row * cols + col)或類似的東西,但我必須找出OpenCV只計算零像素並使用此計數作爲索引。因此,如果我將123作爲最接近像素的索引,則意味着第123個零像素是最接近的。
OpenCV如何計算它們?可能以行方式?
是否有將索引映射回位置的有效方法?顯然,如果我知道OpenCV如何計算它們,我可以重新記錄它們並記錄計數和位置,但這看起來很愚蠢而且效率不高。
是否有充分的理由使用他們使用的索引?我的意思是,使用絕對索引有什麼優勢嗎?
在此先感謝。
編輯:
如果你要明白我的意思,你可以運行這個命令:
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)?
是的,我看到了,它是有道理的,因爲這些像素是最接近自己的。但是這也需要在圖像上進行額外的傳遞以收集零像素的標籤和位置。我完全沒有看到絕對索引的優勢。無論如何,謝謝,我沒有想到這一點,至少我不必自己數數。 – thomas 2014-10-17 09:53:20
@thomas謝謝 - 你不需要額外的圖片傳遞,你可以在一個單一的過程中建立一個像素映射到標籤。只需要在算法中思考一下。 – 2014-10-17 10:08:26
我之前沒有說過,但我想根據最接近的零像素的值和距離(顯然不在用於距離轉換的蒙版中)將值分配給非零像素。我認爲這可以通過一次完成,一個「獲得標籤,計算位置,獲取價值,做一些數學,分配價值」。現在我必須事先做標籤 - >位置映射通行證,除了我必須做的任務傳遞之外,它還是第二遍。 – thomas 2014-10-17 10:23:01