我怎样才能匹配两个撕裂的边缘?
How can I match two torn edges?
Link to Gist of code. 我正在尝试重建一张破纸。第一步检测撕边:
接下来,旋转一个撕裂边缘并与另一个撕裂边缘进行比较:
当两个轮廓彼此匹配时,文档对齐。旋转一件并比较撕裂的边缘。名为 match
的分数描述了两个轮廓之间的匹配:
tempA = draw_contour(tempA, b, 123, 3)
tempB = draw_contour(tempB, a, 123, 3)
tempC = tempA + tempB
_, thresh = cv2.threshold(tempC, 220, 255, cv2.THRESH_BINARY_INV);
thresh = 255 - thresh
match = sum(sum(thresh))
这两个轮廓不能很好地结合在一起:
这些轮廓很好地结合在一起。这里的文档是对齐的:
轮廓匹配的计算是基本的。我在单独的图像上绘制轮廓。对图像求和并应用阈值。这会计算两个轮廓重叠的像素数。这种方法效果很好,但在比较多条边时速度太慢,不实用。
如何计算撕裂边缘的两个轮廓的匹配程度?
假设没有并发症(请参阅我上面的评论),您可以尝试下面概述的程序。见下图
- 计算连接边1端点的直线方程
- 计算连接边2端点的直线方程
- 计算这两条直线的夹角
- 这为您提供了两种可能的角度:
alpha
或 180-alpha
- 找到两条直线段的中点并将它们对齐(图中未显示。可能您已经在做一些对齐曲线的操作)
- 然后,尝试两个角度,根据您的匹配成本,看看哪个给出了最佳匹配
Link to Gist of code. 我正在尝试重建一张破纸。第一步检测撕边:
接下来,旋转一个撕裂边缘并与另一个撕裂边缘进行比较:
当两个轮廓彼此匹配时,文档对齐。旋转一件并比较撕裂的边缘。名为 match
的分数描述了两个轮廓之间的匹配:
tempA = draw_contour(tempA, b, 123, 3)
tempB = draw_contour(tempB, a, 123, 3)
tempC = tempA + tempB
_, thresh = cv2.threshold(tempC, 220, 255, cv2.THRESH_BINARY_INV);
thresh = 255 - thresh
match = sum(sum(thresh))
这两个轮廓不能很好地结合在一起:
轮廓匹配的计算是基本的。我在单独的图像上绘制轮廓。对图像求和并应用阈值。这会计算两个轮廓重叠的像素数。这种方法效果很好,但在比较多条边时速度太慢,不实用。
如何计算撕裂边缘的两个轮廓的匹配程度?
假设没有并发症(请参阅我上面的评论),您可以尝试下面概述的程序。见下图
- 计算连接边1端点的直线方程
- 计算连接边2端点的直线方程
- 计算这两条直线的夹角
- 这为您提供了两种可能的角度:
alpha
或180-alpha
- 找到两条直线段的中点并将它们对齐(图中未显示。可能您已经在做一些对齐曲线的操作)
- 然后,尝试两个角度,根据您的匹配成本,看看哪个给出了最佳匹配