python 相交矩形合并显示

在进行图像识别过程中,由于阈值设置、图片颜色等影响,识别结果会出现多个小块的相交矩形,影响最终结果展示。因此需要对图片中相交的矩形进行合并显示,显示相交矩形的最小外接矩形。方法可能不够简便,仅是一种思路,供参考~
判断矩形是否相交方法参考上篇
如果存在以下几个矩形:
在这里插入图片描述
那么我最终想要的结果是显示这几个相交矩形的最小外接矩形,即蓝色矩形:
在这里插入图片描述

具体思路为:

1)判断两个矩形(A、B)是否相交;
2)若相交,则新的左上角坐标loc1取两个矩形左上角坐标的最小值:

loc1 = (min(Aloc1[i][0], Bloc1[j][0]), min(Aloc1[i][1], Bloc1[j][1]))

右下角坐标loc2取两个矩形右下角坐标的最大值:

loc2 = (max(Aloc2[i][0], Bloc2[j][0]), max(Aloc2[i][1], Bloc2[j][1]))

若不相交则保留原矩形坐标点;
3)重复1)2)步骤,直至遍历完所有矩形。

实现代码:

def inter_rec(locxx,locyy):
    loc1 = locxx
    loc2 = locyy
    for i in range(0, len(locxx)):
        for j in range(0, len(locxx)):
            if i != j:
                Xmax = max(loc1[i][0], locxx[j][0])
                Ymax = max(loc1[i][1], locxx[j][1])
                M = (Xmax, Ymax)
                Xmin = min(loc2[i][0], locyy[j][0])
                Ymin = min(loc2[i][1], locyy[j][1])
                N = (Xmin, Ymin)
                if M[0] < N[0] and M[1] < N[1]: #判断矩形是否相交
                    loc1x = (min(loc1[i][0], locxx[j][0]), min(loc1[i][1], locxx[j][1]))
                    locly = (max(loc2[i][0], locyy[j][0]), max(loc2[i][1], locyy[j][1]))
                    aa=[loc1[i],loc1[j]]
                    bb=[loc2[i],loc2[j]]
                    loc1 = [loc1x if q in aa else q for q in loc1]
                    loc2 = [locly if w in bb else w for w in loc2]
    return loc1,loc2

if __name__ == '__main__':
    # 矩形左上角坐标:
    locxx = [(478, 528), (185, 525), (423, 489), (200, 474), (595, 467), (488, 467), (313, 454), (391, 442), ( 244, 435), (240, 418), (431, 404), (437, 403), (352, 403), (365, 343), (303, 338), (436, 331), (343, 331), (222, 318), (353, 258), (241, 163)]
    #矩形右下角坐标:
    locyy = [(494, 552), (201, 556), (485, 509), (222, 524), (613, 495), (544, 511), (340, 481), (423, 507), (308, 490), (264, 475), (468, 471), (459, 447), (385, 457), (382, 370), (335, 373), (459, 350), (365, 362), (294, 485), (391, 298), (542, 429)]

    Img = np.zeros([670, 700, 3], np.uint8) + 255
    Img1 = Img.copy()
    finx, finy = inter_rec(locxx, locyy)
    for i in range(0, len(locxx)):
        cv2.rectangle(Img, locxx[i], locyy[i], (0, 0, 255), 2)
        cv2.imshow("img", Img)
    for j in range(0, len(finx)):
        cv2.rectangle(Img1, finx[j], finy[j], (255, 0, 0), 2)
    cv2.imshow("result", Img1)
    cv2.waitKey(0)

输出结果如下:
在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rena要努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值