含噪轮廓下的矩形检测:板材像素尺寸计算方案咨询
板材尺寸检测(像素单位)的替代方案
1. 过滤触及图像边缘的噪声轮廓
你的问题核心是噪声轮廓触及图像边缘,导致cv2.boundingRect()返回整个图像尺寸。可以先遍历所有轮廓,排除那些边界触及图像边缘的轮廓,再选择面积最大的目标轮廓:
import cv2 import numpy as np img = cv2.imread('膨胀后的图像.png', 0) h, w = img.shape # 查找所有轮廓 contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) valid_contours = [] for cnt in contours: # 获取轮廓的边界框 x, y, bw, bh = cv2.boundingRect(cnt) # 检查边界框是否触及图像边缘 if x > 0 and y > 0 and (x + bw) < (w - 1) and (y + bh) < (h - 1): valid_contours.append(cnt) # 选择面积最大的有效轮廓 if valid_contours: target_cnt = max(valid_contours, key=cv2.contourArea) x, y, bw, bh = cv2.boundingRect(target_cnt) print(f"板材尺寸:宽{bw}px,高{bh}px")
2. 使用最小外接矩形替代普通边界框
cv2.minAreaRect()会计算包裹轮廓的最小旋转矩形,相比boundingRect()更贴合目标形状,即使存在少量边缘噪声,也能大概率得到准确的矩形尺寸:
if valid_contours: target_cnt = max(valid_contours, key=cv2.contourArea) # 获取最小外接矩形 rect = cv2.minAreaRect(target_cnt) # 矩形的宽高(注意:返回的尺寸是无序的,可根据需求排序) width, height = rect[1] print(f"板材尺寸:宽{round(width)}px,高{round(height)}px")
3. 形态学操作清理膨胀后的噪声
膨胀后可能残留小的白色噪声块,先做开运算(腐蚀+膨胀)去除这些噪声,再提取轮廓,能有效减少边缘干扰:
# 创建结构元素(根据噪声大小调整尺寸) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) # 开运算清理噪声 cleaned_img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) # 再进行轮廓检测 contours, _ = cv2.findContours(cleaned_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 后续选择最大轮廓并计算尺寸(同上述方法)
4. 连通区域分析直接定位目标区域
用cv2.connectedComponentsWithStats()可以直接识别图像中的所有白色连通区域,通过过滤面积参数,快速找到目标板材区域并获取尺寸:
# 连通区域分析(返回标签图、统计信息等) num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(img, connectivity=8) # 排除背景标签(索引0),找到面积最大的区域 max_area = -1 target_idx = 0 for i in range(1, num_labels): area = stats[i, cv2.CC_STAT_AREA] if area > max_area: max_area = area target_idx = i # 获取目标区域的尺寸 target_width = stats[target_idx, cv2.CC_STAT_WIDTH] target_height = stats[target_idx, cv2.CC_STAT_HEIGHT] print(f"板材尺寸:宽{target_width}px,高{target_height}px")
内容的提问来源于stack exchange,提问作者sm29
相关产品推荐
相关产品推荐

