了解OpenCV中的距离变换

时间:2014-03-21 16:11:02

标签: opencv computer-vision

什么是距离变换?它背后的理论是什么?如果我有2个相似的图像但是在不同的位置,距离变换如何帮助重叠它们?距离变换函数产生的结果就像在中间划分的那样它找到一个图像的中心,以便另一个图像只有一半重叠?我已经查看了opencv的文档,但它仍然不清楚。

2 个答案:

答案 0 :(得分:3)

请看下面的图片(您可能希望增加显示器亮度以便更好地查看)。图片显示了用像素强度描绘的红色轮廓的距离,因此在距离最大的图像中间,强度最高。这是距离变换的一种表现形式。这是一个直接的应用 - 绿色形状是所谓的活动轮廓或蛇,它根据与轮廓的距离的渐变(并且还遵循一些其他约束)在红色轮廓周围卷曲。因此,距离变换的一个应用是形状处理。

另一个应用是文本识别 - 文本的强大提示之一是笔画的稳定宽度。在分段文本上运行的距离变换可以确认这一点。相应的方法称为stroke width transform (SWT)

至于对齐两个旋转的形状,我不知道如何使用DT。您可以找到形状的中心来旋转形状,但您也可以围绕任何点旋转它。不同之处仅在于翻译,如果您运行matchTemplate以正确方向匹配它们,则无关紧要。

也许如果您上传图片,将会更清楚该做什么。一般来说,您可以将它们作为一个整体或通过特征(对于各种变形或透视扭曲更加稳健)进行匹配,或者如果它们只有少数几个特征,则甚至可以使用轮廓/轮廓。最后,您可以通过运行PCA或fitting an ellipse(旋转矩形)来确定对象的方向(如果它具有主导方向)。

cv::RotatedRect rect = cv::fitEllipse(points2D);
float angle_to_rotate = rect.angle;

enter image description here

答案 1 :(得分:1)

距离变换是一种对单个二进制图像起作用的操作,它基本上试图测量从每个空点(零像素)到最近边界点(非零像素)的值。

提供了一个示例herehere

测量可以基于各种定义,离散地或精确地计算:例如,欧几里德,曼哈顿或棋盘。实际上,OpenCV实现中的参数允许其中的一些,并通过掩模大小控制其精度。

该功能可以返回输出测量图像(浮点) - 以及标记的连通分量图像(Voronoi图)。在操作here中有一个例子。

我看到您最近询问的from another question您希望注册 两个图像。我不认为距离变换真的是你在这里寻找的。如果您想要对齐一组点,我建议您查看Procrustes,Iterative Closest Point或Ransac等技术。