OpenCV距离变换中的像素索引

tho*_*mas 5 c++ opencv image-processing

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

现在我想将索引转换回像素位置,我认为索引将像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;
Run Code Online (Sandbox Code Playgroud)

您将看到所有标签都是1,因为只有一个零像素,但我应该如何找到该信息的位置(50,50)?

Rog*_*and 5

零像素也被标记 - 它们将具有与它们最接近的非零像素相同的标签.

因此,您将拥有一个2D数组标签,其大小与源图像相同.如果检查源图像中的所有零像素,则可以从返回的2D数组中找到关联的标签.然后,这可以通过匹配标签来查找与每个零像素相关联的非零像素.

如果你明白我的意思.

  • [此链接](http://answers.opencv.org/question/6109/per-pixel-labeling-in-distancetransform/)中的答案用代码解释了如何在使用时获取标签位置的信息. DIST_LABEL_PIXEL`.我希望它对其他人和对我有帮助. (4认同)
  • 我之前没有说过,但我想根据最近的零像素的值和距离为非零像素分配值(显然不在我用于距离变换的掩码中)。我认为这可以一次性完成,即“获取标签,计算位置,获取值,做一些数学运算,分配值”。现在我必须事先进行标签-&gt;位置映射传递,这使其成为除了我必须做的分配传递之外的第二传递。 (2认同)