匹配两个矩形的位置和大小的算法

时间:2016-09-15 08:05:33

标签: algorithm image-processing pattern-matching template-matching

我正在寻找一种算法来计算以下内容:我有一个带有预定义区域的图像(附加图像上的绿色图像)。用户绘制红色矩形,算法应计算红色矩形是否与绿色矩形匹配。例如,附加图片上红色矩形的位置就可以了。

计算这个的好方法是什么?有没有最佳实践算法?

我的想法是计算红色矩形的中间,然后确定中间是否在绿色矩形内。另外,我会计算长度和高度是否与绿色的长度和高度相匹配(25%或更多)。

这是个好主意吗?还有其他建议吗?

enter image description here

3 个答案:

答案 0 :(得分:11)

计算交点的面积并除以两个矩形(算术或几何)的面积的平均值。你会得到一小部分。越接近1,匹配就越好。

答案 1 :(得分:2)

  • 取顶点之间的平均距离作为不匹配的标准。
  • 假设第一个矩形的顶点为[x1,y1], [x2,y2], [x3,y3], [x4,y4],第二个矩形的顶点为[a1,b1],[a2,b2],[a3,b3],[a4,b4]
  • 在这些点之间获取euclidiean distance
  • 较低的距离意味着更好的匹配,例如精确重叠将给出0,任何矩形的形状偏移或偏移都会增加顶点的平均距离。

enter image description here

答案 2 :(得分:1)

调查问题,我倾向于考虑应该使绿色和红色矩形的比较失败的条件,以及关于每个条件的错误条件的推理。

我的意思是,实际上,我想从算法中得到以下回答,明确比较失败的哪个方面:

  1. 您的矩形宽度偏离。
  2. 您的矩形高度偏离。
  3. 您的矩形的水平位置远离。
  4. 你的矩形的垂直位置是偏离的。
  5. 让我们将上述条件称为“失败条件”。这些失败的条件表明我对比较的看法,这无可避免地指导了我的方法。人们可以用不同的方式来看待它(“你的矩形区域很远。”)。当然,用户可以获得更多通用响应,如下所示:

    • 您的矩形尺寸偏离了。
    • 你的矩形的位置很远。
    • 您的矩形很远。再试一次。
    • 老兄,你喝醉了吗?

    在下文中,我使用green将绿色矩形称为对象,使用red将红色矩形称为对象。所有条件都基于相对误差,即相对于实际值归一化的绝对误差,即绿色矩形的值。

    需要指明的一件事是“离开”意味着横向和纵向放置。这意味着绿色矩形的关键点的位置与红色矩形的对应关键点的位置之间存在偏差。让我们选择矩形的中心作为比较的关键点(可以选择矩形的左上角)。

    需要指明的另一件事是你如何以相对的方式比较两个点,分别为每个轴。你需要一个参考值。您可以做的是计算每个轴中两点之间的绝对偏移。然后,您可以计算相对于绿色矩形的相应尺寸的相对偏移。例如,您可以将相对水平偏移计算为x轴中心之间的绝对偏移量除以绿色矩形的宽度。总而言之,为了比较成功,我希望矩形具有几乎相同的尺寸和几乎相同的中心。 “几乎”应该以百分比量化。

    关于条件失败(1),假设矩形宽度的最大允许相对误差为25%,我们必须计算的布尔值为:

    | green.width - red.width | / green.width > 0.25
    

    如果上面的值是true,那么失败条件(1)就会消失。老兄可能会喝醉。我们可以退出并通知。

    关于条件失败(2),假设矩形高度的最大允许相对误差为30%,我们必须计算的布尔值为:

    | green.height - red.height | / green.height > 0.30
    

    如果上面的值是true,那么失败的条件(2)就会消失。我们可以退出并通知。

    关于条件失败(3),假设矩形水平偏移的最大允许相对误差为15%,我们必须计算的布尔值为:

    | green.center.x - red.center.x | / green.width > 0.15
    

    如果上面的值是true,那么失败条件(3)就会消失。我们可以退出并通知。

    关于条件失败(4),假设矩形垂直偏移的最大允许相对误差为20%,我们必须计算的布尔值为:

    | green.center.y - red.center.y | / green.height > 0.20
    

    如果上面的值是true,那么失败的条件(4)就会消失。我们可以退出并通知。

    如果至少有一个失败条件消失,则比较失败。如果没有失败的条件是true,则比较成功,绿色和红色矩形几乎相同。

    我认为上述方法有很多优点,例如推理比较的不同方面,以及为失败条件定义不同的阈值。您还可以根据自己的喜好调整阈值。但在极端情况下,可能需要考虑更多参数。