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