python - 在 OpenCV 中查找子像素中的轮廓点

标签 python opencv image-processing computer-vision

如果我们使用cv2.findContours()找到图像的轮廓,则每个轮廓中存在的坐标的数据类型为int32。 示例:打印 contours[0] 给出,

array([[[0,1]],
       [[1,1]],
          .
          .
          .
       [[400,232]]])

有没有办法以更高的精度(亚像素)找到轮廓中的坐标?

array([[[0.11,1.78]],
       [[1.56,1.92]],
          .
          .
          .
       [[400.79,232.35]]])

最佳答案

原则上,在正确采样的灰度图像中,您确实拥有以亚像素精度猜测位置的信息。但这仍然是一个猜测。我不知道有任何现有算法尝试做到这一点,我只知道跟踪二进制图像中的轮廓的算法。

已经发表了几篇论文(据我所知),试图以一种更好地表示底层轮廓的方式来简化轮廓多边形。这些论文都假设平滑度允许他们完成任务,如果没有这样的假设,二值图像中除了通过简单的像素轮廓算法提取的信息之外就没有其他信息。此类别中最简单的方法是平滑多边形:将每个顶点移动到离其两个相邻顶点形成的线更近一些。

但是,如果目标是获得更精确的对象测量,则可以采用多种不同的方法来使用灰度值数据来显着提高这些测量的精度。我熟悉其中两个:

  • L.J. van Vliet,“多维数字化图像中的灰度测量”,代尔夫特理工大学博士论文,1993 年。PDF
  • N。 Sladoje 和 J. Lindblad,“利用灰度信息进行高精度边界长度估计”,IEEE 模式分析和机器智能汇刊 31(2):357-363,2009。DOI

第一个基于正确采样的带限图像的假设,计算二维面积、周长和局部曲率(更高的维度导致额外的测量)。后者确实有长度,但它是“像素覆盖”模型的起点:同一作者也有关于面积和费雷特直径的论文。该模型假设对尖锐边界进行区域采样。

关于python - 在 OpenCV 中查找子像素中的轮廓点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74862442/

相关文章:

Python:子实例化后自动调用父函数

c++ - 为什么 c++ 不包括\n 而 python 不是

c++ - Opencv2.4 设置相机参数

matlab - 如何在 matlab 中使用 "bwlabel"分别标记图像(文本图像)中的单独线条?

algorithm - 我需要比较两个图像以查看不同的颜色。任何中级算法?

python - pypi - 服务器响应 (503) : backend read error

python - 属性错误_rsaobj对象没有 'export key'属性

Python OpenCV : mouse callback for drawing rectangle

python - 我们可以训练 haar-cascade 来检测数字和字母吗?

C:制作图像映射缓冲区副本的最佳方法