简介:我正在尝试寻找一个物体的两个边界的图像处理任务,可以用两个直线段来描述。我正在使用霍夫线变换的一些变体来找到目标图像中的线段。通过对象的每个边界的霍夫变换找到多条线(共享一个非常小的角度),并且可能发现一些线条与图像中某处的对象边界不对应(误报)。 由于物体的两个边界之间的空间关系(角度)近似已知,我想我会采用某种聚类方法来省略误报并计算出每个线段中的平均线段数。边界。
方法:为了对线段进行聚类,需要为每个线段的位置定义相似性度量。我想我会选择两个线段之间的角度元组和两个线段之间的某种平均距离。这也是我想知道计算这个平均距离测量的最佳方法。 一种稍微简单的方法是在离散位置对每个段进行采样,并测量每个采样点与另一个线段的最近距离(L2),将距离加起来并将总和除以样本数。我确定有更聪明的方法可以做到这一点,有什么建议吗?
提示:我正在使用几个LGPL / BSD许可工具包(OpenCV,Boost)在C ++中工作,因此有些特殊的数学运算(如mathematica中的集成)可能难以实现。
答案 0 :(得分:1)
假设我正确理解了问题,那么以下解决方案如何: 当你有线时,也许你可以尝试确定这些线的起点和终点。计算这些时,您只需测量两个起点和两个终点的距离,然后计算距离的平均值。
我假设您将线条作为像素值。可以通过查找线的像素的x和y的最大值和最小值来计算起点和终点。
答案 1 :(得分:1)
而不是平均距离,最小距离怎么样?有关如何计算此here的详细讨论。
答案 2 :(得分: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交换回来。