3

简介:我正在处理一个图像处理任务,试图找到一个对象的两个边界,可以用两条直线段来描述。我正在使用霍夫线变换的一些变体来查找目标图像中的线段。霍夫变换发现对象的每个边界有多条线(共享一个非常小的角度),并且可能发现一些线与图像中某处的对象边界不对应(误报)。由于对象的两个边界之间的空间关系(角度)是近似已知的,我想我会采用某种聚类方法来排除误报并计算每个找到的多个线段中的平均线段边界。

方法:为了对线段进行聚类,需要为每个线段的位置定义一个相似性度量。我想我会使用两个线段之间的角度元组和两个线段之间的某种平均距离。这也是我想知道计算这个平均距离度量的最佳方法是什么。一种比较简单的方法是在离散位置对每个线段进行采样,并测量每个采样点到另一个线段的最近距离 (L2),将距离相加并将总和除以样本数。我敢肯定有更聪明的方法可以做到这一点,有什么建议吗?

提示:我正在使用 C++ 和几个 LGPL/BSD 许可的工具包(OpenCV、Boost),所以一些特殊的数学运算,比如在数学中的集成可能很难实现。

4

3 回答 3

1

假设我正确理解了问题,那么以下解决方案如何:当您有线条时,也许您可​​以尝试确定这些线条的起点和终点。当您计算这些时,您只需测量两个起点和两个终点的距离,然后计算距离的平均值。

我假设您将线条作为像素值。可以通过查找线像素的 x 和 y 的最大值和最小值来计算起点和终点。

于 2011-09-13T14:16:22.397 回答
1

而不是平均距离,最小距离如何?这里有一个关于如何计算的扩展讨论。

于 2011-09-13T21:10:07.970 回答
0

给定一组 n 条线段,第 i 条线段从点 (x0i,y0i) 延伸到 (x1i,y1i):

查看第一条线段,看看它是否更接近垂直或水平。如果 abs(y00-y10) > abs(x00-x10) 则设置标志并交换 x 和 y 坐标。这将防止无限斜率问题。(我想如果两条线段是垂直的,你仍然可能会遇到问题,但如果你的线段不同,平均线没有多大意义。)

使用所有 2n 个端点,计算拟合直线的最小二乘法

y = a*x + b

对于每个端点,计算 abs(a*xij + b - yij)。这测量平行于该端点的 y 轴到平均线的距离。我猜如果这大于某个数量,您可以拒绝该线段并在没有它的情况下重复拟合。如果它小于几个像素,您可以用拟合的坐标替换 y 坐标,以将线段的末端移动到拟合线。

如果设置了交换标志,则将 x 和 y 交换回来。

于 2017-01-02T21:53:51.150 回答