gpt4 book ai didi

c++ - OpenCV 距离变换中的像素索引

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:19 29 4
gpt4 key购买 nike

我想使用函数 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;

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

最佳答案

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

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

如果你明白我的意思。

关于c++ - OpenCV 距离变换中的像素索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26421566/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com