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

如何用OpenCV-Python沿二值掩码长度方向测量宽度?

二值掩码图像沿长度方向测量宽度的实现方法

完全可以实现这个需求,下面给你一套适合入门的实操方案,以Python+OpenCV为例:

核心逻辑

沿图像的长度方向(假设是纵向,也就是从上到下的行方向)逐行扫描,每一行里找到白色掩码区域的左右边界,用右边界索引减去左边界索引再加1,就是该行的宽度。最后可以把宽度数据做成曲线,或者直接标注在图像上。

具体步骤

1. 准备工作与读取图像

先把图像读进来,确保是二值格式(黑色背景、白色前景),如果原图像不是纯二值的,先做二值化处理:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 以灰度模式读取掩码图像
mask = cv2.imread('你的掩码图像路径.jpg', cv2.IMREAD_GRAYSCALE)
# 把图像转成严格的二值格式(像素值只有0和255)
_, binary_mask = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY)

2. 逐行计算宽度

遍历每一行,提取前景区域的边界并计算宽度:

height, width = binary_mask.shape
width_records = []

for y in range(height):
    # 获取当前行的所有像素
    current_row = binary_mask[y, :]
    # 找到当前行中所有白色前景的列索引
    foreground_pos = np.where(current_row == 255)[0]
    
    if len(foreground_pos) > 0:
        # 计算宽度:右边界 - 左边界 + 1(因为索引从0开始)
        row_width = foreground_pos[-1] - foreground_pos[0] + 1
        width_records.append(row_width)
    else:
        # 该行没有前景,宽度记为0
        width_records.append(0)

3. 结果可视化

可以把宽度变化做成折线图,或者直接在图像上标注宽度:

# 绘制宽度变化折线图
plt.figure(figsize=(10, 5))
plt.plot(width_records)
plt.xlabel('行号(长度方向)')
plt.ylabel('宽度')
plt.title('沿长度方向的宽度变化')
plt.show()

# 在原图像上标注宽度(可选)
# 先把灰度图转成彩色图,方便标注红色文字
result_img = cv2.cvtColor(binary_mask, cv2.COLOR_GRAY2BGR)
for y in range(height):
    if width_records[y] > 0:
        # 重新获取当前行的前景边界
        foreground_pos = np.where(binary_mask[y, :] == 255)[0]
        left = foreground_pos[0]
        right = foreground_pos[-1]
        # 在区域中间位置标注宽度
        cv2.putText(result_img, str(width_records[y]),
                    ((left + right)//2, y),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 0, 255), 1)
# 显示标注后的图像
cv2.imshow('宽度标注结果', result_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

实用小贴士

  • 如果你的“长度方向”是横向(从左到右的列方向),只需要把遍历逻辑改成逐列扫描,计算每列的高度即可,思路完全一致。
  • 如果掩码图像有小噪声(比如孤立的白点),可以先做开运算去除噪声,避免宽度计算出错:
    # 创建3x3的结构元素,做开运算
    kernel = np.ones((3,3), np.uint8)
    clean_mask = cv2.morphologyEx(binary_mask, cv2.MORPH_OPEN, kernel)
    
  • 入门阶段先把循环遍历的逻辑搞懂,之后可以尝试用numpy的向量化操作代替循环,提升大图像的处理速度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:25:39