You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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数据做对应列的裁剪即可:

  1. 确定图像裁剪的列起始/结束索引(比如前面用的120:848);
  2. 读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:32:17