OpenCV中如何实现矩形轮廓跨图像的稳定从上到下、从左到右排序
带数字编号矩形块自动提取与稳定排序实现
开发目标
- 从输入图像中识别所有带数字编号的矩形块
- 按自然阅读规则对提取的矩形块序列化排序,实现从上到下分排、同排从左到右的一致输出,最终覆盖1到32的全编号序列
当前已实现的代码逻辑
import cv2 import matplotlib.pyplot as plt # 加载图像、灰度转换、自适应阈值处理 image = cv2.imread('3.jpg') result = image.copy() gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 51, 9) # 填充矩形轮廓 cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: cv2.drawContours(thresh, [c], -1, (255, 255, 255), -1) # 形态学开运算 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 9)) opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=4) plt.imshow(thresh) # 检测轮廓并排序 cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] # 当前生效的排序逻辑 cnts = sorted(cnts, key=lambda x: [cv2.boundingRect(x)[1], cv2.boundingRect(x)[0]]) # 曾尝试但未启用的排序逻辑 # cnts = sorted(cnts, key=lambda ctr: cv2.boundingRect(ctr)[0] + cv2.boundingRect(ctr)[1] * image.shape[1], reverse=True) i = 0 for c in cnts: area = cv2.contourArea(c) x, y, w, h = cv2.boundingRect(c) roi = image[y:y+h, x:x+w] cv2.imwrite('{}.jpg'.format(i), roi) i += 1 cv2.imwrite('output_image.jpg', image) cv2.imshow('thresh', thresh) cv2.imshow('opening', opening) cv2.imshow('image', image) cv2.waitKey() cv2.destroyAllWindows()
现存问题
- 排序稳定性不足:不同输入图像下,代码输出的轮廓顺序不统一
- 同排排序存在随机反向情况:部分图像中本该按1-2-3-4、5-6-7-8顺序输出的同排矩形,实际输出为4-3-2-1、8-7-6-5的反向序列
- 无法实现跨图像的一致排序效果,达不到预期的全编号顺序输出要求
待解决需求
设计可适配不同输入图像的通用排序逻辑,确保所有场景下都能输出符合自然阅读顺序的矩形块序列。
内容的提问来源于stack exchange,提问作者Prabin Nepal
相关产品推荐
相关产品推荐

