【发布时间】:2014-04-29 02:53:02
【问题描述】:
什么是距离变换?它背后的理论是什么?如果我有两个相似的图像但在不同的位置,距离变换如何帮助它们重叠?距离变换函数产生的结果就像在中间分开 - 是它是为了找到一个图像的中心,使另一个图像重叠一半?我已经查看了 opencv 的文档,但仍然不清楚。
【问题讨论】:
什么是距离变换?它背后的理论是什么?如果我有两个相似的图像但在不同的位置,距离变换如何帮助它们重叠?距离变换函数产生的结果就像在中间分开 - 是它是为了找到一个图像的中心,使另一个图像重叠一半?我已经查看了 opencv 的文档,但仍然不清楚。
【问题讨论】:
距离变换是一种适用于单个二值图像的操作,它从根本上寻求测量从每个空点(零像素)到最近边界点(非零像素)的值。
测量可以基于各种定义,离散或精确计算:例如欧几里得、曼哈顿或棋盘。实际上,OpenCV 实现中的参数允许其中一些参数,并通过掩码大小控制它们的准确性。
该函数可以返回输出测量图像(浮点)以及标记的连接组件图像(Voronoi 图)。在操作here 中有一个例子。
我看到from another question 你最近问过你希望注册 两个 图像一起。我不认为距离变换真的是你在这里寻找的东西。如果您希望对齐一组点,我建议您查看 Procrustes、Iterative Closest Point 或 Ransac 等技术。
【讨论】:
cv::distanceTransform 中的非空像素,这可能有点令人困惑
请看下图(您可能需要提高显示器亮度以更好地查看)。图片显示了与用像素强度描绘的红色轮廓的距离,因此在距离最大的图像中间,强度最高。这是距离变换的体现。这是一个直接的应用程序 - 绿色形状是所谓的活动轮廓或蛇,它根据与轮廓的距离梯度(并且还遵循一些其他约束)围绕红色轮廓卷曲。因此,距离变换的一种应用是形状处理。
另一个应用是文本识别——文本的强大提示之一是稳定的笔画宽度。在分段文本上运行的距离变换可以证实这一点。对应的方法称为stroke width transform (SWT)
至于对齐两个旋转的形状,我不确定如何使用 DT。您可以找到形状的中心来旋转形状,但您也可以围绕任何点旋转它。区别仅在于翻译,如果您运行matchTemplate 以将它们匹配到正确的方向,则无关紧要。
如果您上传图片,可能会更清楚该怎么做。一般来说,您可以将它们作为一个整体进行匹配,也可以通过特征(对各种变形或透视变形更健壮)进行匹配,如果它们只有几个特征,甚至可以使用轮廓/剪影。最后,您可以通过运行 PCA 或fitting an ellipse(作为旋转矩形)来确定对象的方向(如果它具有主导方向)。
cv::RotatedRect rect = cv::fitEllipse(points2D);
float angle_to_rotate = rect.angle;
【讨论】: