如何检测图像中的自定义多条形图案并获取其位置?
检测自定义多条形图案(Multiple-Bar Pattern)的实用方案
我来分享一套针对这类固定数量、等宽异高平行黑条的检测方案,亲测适配不同尺寸的场景:
一、预处理:锁定黑色目标区域
首先把图像里的黑色区域单独提取出来,过滤无关干扰:
- 先将图像转为灰度图,再用反向阈值分割(因为黑色对应低灰度值)生成二值掩码,自动阈值用Otsu方法就很省心。示例代码(基于OpenCV):
import cv2 import numpy as np # 读取图像 img = cv2.imread("target_image.jpg") # 转灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 提取黑色区域的二值掩码 _, black_mask = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
二、筛选候选条带:匹配等宽平行特征
从掩码里找出符合要求的条带轮廓:
- 用
cv2.findContours提取所有黑色区域的轮廓,筛选出近似矩形的轮廓(条带是矩形形态)。 - 对每个候选矩形,记录它的宽度、旋转角度、高度:
- 宽度误差控制在±5%以内(可根据实际场景调整),确保所有条带宽度一致;
- 旋转角度误差控制在±2度以内,保证条带平行;
- 统计符合条件的矩形数量,看是否等于你预设的固定条带数。
三、验证图案完整性:确认是目标组合
找到足够数量的候选条带后,还需要验证它们是否构成完整的多条形图案:
- 检查排列规律:条带应该紧密排列或按固定间距分布,且它们的顶边/底边大致在同一直线上(因为高度不同但平行);
- 计算条带的中心坐标,验证它们的x/y坐标是否呈规律分布(水平条带的y坐标接近,垂直条带的x坐标接近)。
四、定位图案:获取整体边界
如果验证通过,把所有条带的外接矩形合并成一个大的 bounding box,就是图案的位置:
# 假设contours是筛选后的目标条带轮廓 x_coords = [] y_coords = [] widths = [] heights = [] for c in contours: x, y, w, h = cv2.boundingRect(c) x_coords.append(x) y_coords.append(y) widths.append(w) heights.append(h) # 计算整体边界框 x_min = min(x_coords) y_min = min(y_coords) x_max = max([x + w for x, w in zip(x_coords, widths)]) y_max = max([y + h for y, h in zip(y_coords, heights)]) pattern_bbox = (x_min, y_min, x_max - x_min, y_max - y_min) # 可视化检测结果 cv2.rectangle(img, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2) cv2.imshow("Detected Multiple-Bar Pattern", img) cv2.waitKey(0)
五、特殊场景适配
- 图像有噪声:预处理前加
cv2.GaussianBlur模糊,过滤小噪点; - 条带边缘不规整:用形态学操作(膨胀+腐蚀)修复轮廓;
- 倾斜条带:轮廓检测会保留旋转角度,只要角度一致就能正常匹配。
内容的提问来源于stack exchange,提问作者user9590073
相关产品推荐
相关产品推荐

