如何在Python中去除牛二值图像头部并解决CSV与裁剪图匹配问题
解决牛体重估算中图像头部排除与CSV数据匹配问题
一、排除牛头部的图像处理方法
1. 手动精准裁剪
直接调整图像裁剪的列范围,把头部区域从原图像中切掉:
- 先通过
cv2.imshow打开图像,用鼠标定位头部的右边界坐标(比如观察图像后确定头部占左侧0-120列); - 修改图像裁剪代码,调整列的截取范围,示例:
# 保留原行范围115:305,列从120开始截取,直接切掉左侧头部 img = cv2.imread(subdir + '\\' + img_name + '.png')[115:305, 120:848]
后续转HSV、二值化等操作都基于这个裁剪后的图像执行即可。
2. 自动分割头部(适用于批量处理)
如果需要处理大量图像,手动裁剪效率低,可通过轮廓分析自动分离身体与头部:
- 先基于Hue通道生成牛的整体二值掩码;
- 查找掩码中的所有轮廓,筛选出面积最大的轮廓(通常牛的身体是最大连通区域);
- 用该轮廓生成仅包含身体的掩码,去除头部区域。
示例代码:
# 假设已通过Hue阈值得到牛的二值掩码mask contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 筛选面积最大的轮廓(对应牛的身体) max_contour = max(contours, key=cv2.contourArea) # 创建仅保留身体区域的掩码 body_mask = np.zeros_like(mask) cv2.drawContours(body_mask, [max_contour], 0, 255, -1) # 应用掩码得到仅含身体的图像 body_img = cv2.bitwise_and(img, img, mask=body_mask)
二、裁剪后CSV数据与图像的匹配方法
针对CSV列数不匹配的问题,只需对读取后的CSV数据做对应列的裁剪即可:
- 确定图像裁剪的列起始/结束索引(比如前面用的
120:848); - 读取CSV后用pandas的
iloc对列进行切片,示例:
csv_img = pd.read_csv(subdir + '\\' + csv_name + '.csv', skiprows=115, skipfooter=175, engine='python') # 对应图像的列裁剪范围,截取CSV的第120列到第848列(和numpy切片规则一致) csv_img = csv_img.iloc[:, 120:848]
处理后CSV的行列数就会和裁剪后的图像完全匹配。
内容的提问来源于stack exchange,提问作者Katie Price
相关产品推荐
相关产品推荐

