python将目标识别的框分组,按y轴和x轴分组,将第一行左边3个作为一个分组,第一行右边两个作为一个分组,中间两个作为一个分组,左下角作为一个分组
原图

要求

python将目标识别的框分组,按y轴和x轴分组,将第一行左边3个作为一个分组,第一行右边两个作为一个分组,中间两个作为一个分组,左下角作为一个分组
原图


阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程
基于你的要求,大致可以实现如下:
目标识别框分组算法
由于你提供的信息比较模糊,但是我们可以尝试使用以下方法:
findContours 函数将图像中的每个目标识别框识别出来。numpy 库创建一个二维数组,用于存储框的信息,例如中心坐标、宽度、高度等。scipy 库中的 sort 函数对框按 y 轴坐标进行排序,得到一个按照 y 轴排序的数组。matplotlib 库绘制分组后的结果。以下是核心代码:
import cv2
import numpy as np
from scipy import sort
import matplotlib.pyplot as plt
# 从 OpenCV 中读取图像
img = cv2.imread('原图.jpg')
# 使用 findContours 将目标识别框识别出来
contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 创建一个二维数组存储框的信息
boxes = np.zeros((len(contours), 4))
# 对框进行排序,按照 y 轴坐标
y_sorted_contours = sort.cenums(contours, key=lambda x:cv2.boundingRect(x)[1])
# 基于你提供的要求,将框分组
groups = []
left_groups = y_sorted_contours[:3]
right_groups = y_sorted_contours[3:5]
mid_groups = y_sorted_contours[5:7]
bottom_left = y_sorted_contours[-1:]
groups.extend([left_groups, right_groups, mid_groups, bottom_left])
# 使用 Matplotlib 绘制分组后的结果
for i, group in enumerate(groups):
for box in group:
x, y, w, h = cv2.boundingRect(box)
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
plt.subplot(1, 4, i+1)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title(f'Group {i+1}')
plt.axis('off')
plt.show()
请注意,这个代码只是大致实现了分组的目标,可能需要根据具体的图像调整参数。