如何利用含board、liquid两类的二值掩码计算烤盘板的像素长度
计算烤盘板的像素长度方案
核心思路
用cv2.fitEllipse拟合椭圆后,椭圆参数里的长轴长度就是板的像素长度,关键是先准确提取board类的轮廓,再解析椭圆参数。
具体步骤
- 提取board专属掩码:从二值掩码中分离出仅包含board的区域(比如假设board对应的灰度值为255,liquid为0,可根据实际掩码调整)。
- 提取board轮廓:用
cv2.findContours提取board区域的轮廓,建议用cv2.RETR_EXTERNAL只取最外层轮廓,避免内部干扰;再用cv2.contourArea过滤掉小的噪声轮廓。 - 拟合椭圆并解析参数:对board的轮廓用
cv2.fitEllipse拟合,返回的元组格式为((中心x, 中心y), (长轴长度, 短轴长度), 旋转角度),其中第二个元素的第一个值就是板的像素长度(如果长轴方向与板的延伸方向不符,取第二个值即可)。
代码示例
import cv2 import numpy as np # 读取二值掩码图(假设board为255,liquid为0) mask = cv2.imread('board_liquid_mask.png', cv2.IMREAD_GRAYSCALE) # 提取board区域 board_mask = np.where(mask == 255, 255, 0).astype(np.uint8) # 提取board轮廓 contours, _ = cv2.findContours(board_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 过滤小轮廓,只保留最大的(board的轮廓) board_contour = max(contours, key=cv2.contourArea) # 拟合椭圆 ellipse = cv2.fitEllipse(board_contour) # 解析椭圆参数:长轴长度即为板的像素长度 board_length = ellipse[1][0] # 如果短轴才是实际板的长度,就取ellipse[1][1] print(f"板的像素长度:{board_length}")
注意事项
- 如果拟合的椭圆不符合预期,检查轮廓是否正确提取:比如是否有断开的轮廓,可先对board_mask做一次
cv2.morphologyEx膨胀操作,连接断裂区域。 - 若板是近似矩形,也可以用
cv2.minAreaRect拟合旋转矩形,取矩形的长边长作为长度,可能更贴合实际形状。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

