如何识别图像中的多条暗带并为其绘制外接矩形框
优化方案
原有方案误检主要是仅依赖全局亮度阈值+面积过滤,没有利用暗带的相对明暗属性和长条几何特征,可以按以下步骤改进:
- 改用自适应局部阈值替代固定HSV阈值:暗带是相对周围区域更暗,而非全局亮度固定在某个区间,自适应阈值可以过滤掉全局深色但和周围亮度差不大的无关区域
- 增加几何规则过滤轮廓:暗带一般为长条形态,可通过长宽比、轮廓填充率两个指标过滤掉不符合形态的误检轮廓
- 可选增加重叠矩形合并逻辑:避免单个暗带被拆分为多个小检测框的情况
import cv2 import numpy as np import matplotlib.pyplot as plt stretch = frames.copy() # frame为导入的原始图像 # 对比度增强预处理和原有逻辑保持一致 clahe = cv2.createCLAHE(clipLimit=2., tileGridSize=(8,8)) lab = cv2.cvtColor(stretch, cv2.COLOR_BGR2LAB) l, a, b = cv2.split(lab) l2 = clahe.apply(l) lab = cv2.merge((l2,a,b)) img2 = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR) gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) smooth = cv2.cvtColor(cv2.GaussianBlur(gray, (11,11), 0), cv2.COLOR_GRAY2BGR) # 改用自适应局部阈值替代固定HSV阈值 # 11x11为邻域大小,8为阈值偏差:邻域平均亮度减8,可根据实际效果调整参数 frame_gray = cv2.cvtColor(smooth, cv2.COLOR_BGR2GRAY) frame_threshold = cv2.adaptiveThreshold(frame_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 8) # 形态学操作:去除小噪点,连接断裂的暗带区域 # 横向长条核适配横向暗带,如果是纵向暗带改成(1,5) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,1)) frame_threshold = cv2.morphologyEx(frame_threshold, cv2.MORPH_CLOSE, kernel, iterations=2) frame_threshold = cv2.morphologyEx(frame_threshold, cv2.MORPH_OPEN, kernel, iterations=1) contours,hierarchy = cv2.findContours(frame_threshold,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) # 按几何规则过滤轮廓 min_area = 100 # 最小面积阈值,根据你的图像尺寸调整 min_aspect_ratio = 3 # 最小长宽比,暗带为长条形态所以要求长宽比大于3 min_fill_ratio = 0.6 # 最小填充率:轮廓面积/外接矩形面积,避免不规则形状误检 for cnt in contours: area = cv2.contourArea(cnt) if area < min_area: continue x,y,w,h = cv2.boundingRect(cnt) # 计算长宽比,取长边/短边 aspect_ratio = max(w/h, h/w) if aspect_ratio < min_aspect_ratio: continue # 计算填充率 fill_ratio = area / (w*h) if fill_ratio < min_fill_ratio: continue # 符合条件的区域绘制外接框 cv2.rectangle(frames, (x, y), (x+w, y+h), (255,0,0), 4) plt.imshow(cv2.cvtColor(frames, cv2.COLOR_BGR2RGB)) plt.show()
参数调整说明
- 如果暗带是纵向的,把形态学核改成
(1,5),长宽比阈值可以根据实际暗带形态调整 - 自适应阈值的最后两个参数(邻域大小、偏差值)可以根据图像明暗情况调整,邻域越大对明暗变化的敏感度越低,偏差值越大只有越暗的区域会被选中
- 如果需要保留HSV阈值的筛选能力,可以把HSV阈值结果和自适应阈值结果做与运算,同时满足两个条件的区域才保留,进一步降低误检
内容的提问来源于stack exchange,提问作者Pruthviraj Acharya
相关产品推荐
相关产品推荐

