我想使用函数distanceTransform()来查找非零像素到零像素的最小距离,以及最近零像素的位置。我调用函数的第二个版本,并将labelType标志设置为DIST_LABEL_PIXEL。一切正常,我得到最接近的零像素的距离和指数。
现在我想将索引转换回像素位置,我认为索引将像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)?
答案 0 :(得分:5)
零像素也会被标记 - 它们将与它们最接近的非零像素具有相同的标签。
因此,您将拥有一个2D数组标签,其大小与源图像相同。如果检查源图像中的所有零像素,则可以从返回的2D数组中找到关联的标签。这样就可以通过匹配标签找到与每个零像素相关联的非零像素。
如果你明白我的意思。
答案 1 :(得分:0)
在python中,您可以使用numpy来关联标签和坐标:
import cv2
import numpy as np
# create an image with two 0-lines
a = np.ones((100,100), dtype=np.uint8)
a[50,:] = 0
a[:,70] = 0
dt,lbl = cv2.distanceTransformWithLabels(a, cv2.DIST_L2, 3, labelType=cv2.DIST_LABEL_PIXEL)
# coordinates of 0-value pixels
xy = np.where(a==0)
# print label id and coordinate
for i in range(len(np.unique(lbl))):
print(i,xy[0][i], xy[1][i])