You need to enable JavaScript to run this app. OpenCV中如何实现矩形轮廓跨图像的稳定从上到下、从左到右排序
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 14:54:04