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

如何用OpenCV(Python)从沉淀物上边缘裁剪至试管底部?

基于OpenCV裁剪试管沉淀物区域的实现思路与代码示例

核心思路

  1. 提取沉淀物上边缘位置:从已处理好的图像中,定位标记沉淀物上边缘的水平线对应的y轴坐标(图像y轴向下增长,上边缘y值更小)。
  2. 确定试管左右边界:通过原始图像锁定试管的左右范围,避免裁剪到试管外的空白区域。
  3. 裁剪目标区域:以沉淀物上边缘的y坐标为起始点,图像底部为终点,结合试管左右边界,截取对应区域。

代码实现(Python + OpenCV)

import cv2
import numpy as np

# 读取图像(替换为你的本地图像路径)
original_img = cv2.imread("原始图像路径")
processed_img = cv2.imread("处理后图像路径", cv2.IMREAD_GRAYSCALE)

# 1. 获取沉淀物上边缘的y坐标
# 提取处理后图像中非零像素的行,取最小y值(最靠上的边缘)
non_zero_rows = np.where(processed_img > 0)[0]
upper_edge_y = non_zero_rows.min() if len(non_zero_rows) > 0 else 0

# 2. 获取试管的左右边界
# 对原始图像做灰度化与边缘检测,提取试管轮廓
gray_original = cv2.cvtColor(original_img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray_original, 50, 150)

# 按列求和,筛选出有边缘的左右列范围
col_sum = np.sum(edges, axis=0)
left_bound = np.where(col_sum > 0)[0][0]
right_bound = np.where(col_sum > 0)[0][-1]

# 3. 裁剪沉淀物区域
sediment_region = original_img[upper_edge_y:, left_bound:right_bound]

# 显示并保存结果
cv2.imshow("沉淀物区域", sediment_region)
cv2.imwrite("裁剪后的沉淀物.png", sediment_region)
cv2.waitKey(0)
cv2.destroyAllWindows()

补充优化点

  • 若处理后图像的边缘存在噪声,可通过取非零行的中位数/均值来优化上边缘定位,避免单点干扰。
  • 试管边界也可通过cv2.findContours轮廓检测实现:找到图像中最大的矩形轮廓(试管)后提取左右坐标,适配更复杂的拍摄场景。

内容的提问来源于stack exchange,提问作者Mohit Srivastava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:18:20