我怎样才能匹配两个撕裂的边缘?

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端点的直线方程
  • 计算这两条直线的夹角
  • 这为您提供了两种可能的角度:alpha180-alpha
  • 找到两条直线段的中点并将它们对齐(图中未显示。可能您已经在做一些对齐曲线的操作)
  • 然后,尝试两个角度,根据您的匹配成本,看看哪个给出了最佳匹配