OpenCV距离变换中的像素索引

时间:2014-10-17 09:05:42

标签: c++ opencv image-processing

我想使用函数distanceTransform()来查找非零像素到零像素的最小距离,以及最近零像素的位置。我调用函数的第二个版本,并将labelType标志设置为DIST_LABEL_PIXEL。一切正常,我得到最接近的零像素的距离和指数。

现在我想将索引转换回像素位置,我认为索引将像idx =(row * cols + col)或类似的东西,但我不得不发现OpenCV只计算零像素和使用此计数作为索引。因此,如果我得到123作为最近像素的索引,这意味着第123个零像素是最接近的。

  1. OpenCV如何计算它们?可能是以行方式?

  2. 是否有将索引映射回位置的有效方法?显然我可以重新计算它们并记录计数和位置,如果我知道OpenCV如何计算它们,但这看起来很愚蠢而且效率不高。

  3. 是否有充分的理由使用他们使用的索引?我的意思是,使用绝对索引有什么优势吗?

  4. 提前致谢。

    编辑:

    如果你想看看我的意思,你可以运行:

    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)?

2 个答案:

答案 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])