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

求助:基于Python/OpenCV以标尺为参考测量图像中粒子微米级长度

基于OpenCV的粒子长度批量测量方案

核心结论

  • 完全可以用图中标尺作为参考计算粒子长度,OpenCV完全能实现
  • 核心逻辑就是先确定1个像素对应多少微米,再检测粒子、计算其像素长度,最后转换为微米单位即可

实现步骤与脚本

1. 标尺标定(关键步骤)

拿你提供的示例图来说,标尺为10μm。用系统画图工具或任意像素测量工具,量出这段标尺对应的像素数量。比如量得是100像素,那转换比例就是 10μm ÷ 100像素 = 0.1μm/像素,这个数值后续要用到。

2. 初学者友好的简易脚本

下面是包含单张测试、批量处理功能的脚本,注释清晰,直接上手可用:

import cv2
import os
import numpy as np

def get_particle_lengths(image_path, scale):
    # 读取图像并转为灰度图
    img = cv2.imread(image_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 自动二值化(无需手动调阈值,分离粒子与背景)
    _, binary_img = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    
    # 去除小噪声(可根据粒子大小调整kernel尺寸)
    kernel = np.ones((3,3), np.uint8)
    binary_img = cv2.morphologyEx(binary_img, cv2.MORPH_OPEN, kernel)
    
    # 检测所有粒子的轮廓
    contours, _ = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    lengths = []
    for cnt in contours:
        # 过滤过小的轮廓(避免杂点干扰,数值可按需调整)
        if cv2.contourArea(cnt) < 20:
            continue
        # 获取粒子的最小外接矩形,取长轴作为粒子长度(像素单位)
        rect = cv2.minAreaRect(cnt)
        pixel_len = max(rect[1])
        # 转换为微米单位,保留两位小数
        um_len = pixel_len * scale
        lengths.append(round(um_len, 2))
    
    return lengths

def batch_process_images(folder_path, scale):
    # 遍历目标文件夹中的所有图像文件
    for file_name in os.listdir(folder_path):
        if file_name.lower().endswith(('.png', '.jpg', '.jpeg')):
            full_path = os.path.join(folder_path, file_name)
            particle_lengths = get_particle_lengths(full_path, scale)
            print(f"{file_name} 中粒子长度(μm):{particle_lengths}")

# ---------------------- 配置参数区 ----------------------
# 1. 填入你标定好的像素-微米转换比例
SCALE_FACTOR = 0.1  # 单位:μm/像素
# 2. 单张测试的图像路径
TEST_IMG_PATH = "test.jpg"
# 3. 批量处理的图像文件夹路径
IMG_FOLDER = "particle_images"
# ------------------------------------------------------

# 单张图像测试(先验证效果)
if os.path.exists(TEST_IMG_PATH):
    test_results = get_particle_lengths(TEST_IMG_PATH, SCALE_FACTOR)
    print(f"测试图像粒子长度(μm):{test_results}")

# 批量处理(取消注释即可启用)
# batch_process_images(IMG_FOLDER, SCALE_FACTOR)

3. 使用说明

  • 标尺标定:务必准确测量已知长度标尺对应的像素数,计算出SCALE_FACTOR填入参数区
  • 参数调整:如果粒子与背景分离效果差,可更换二值化方式;如果杂点多,调大cv2.contourArea(cnt) < 20中的数值
  • 批量处理:将所有待处理图像放入指定文件夹,取消批量处理代码的注释即可运行

注意事项

  • 确保所有待处理图像的标尺比例一致,若不同图像标尺不同,需单独标定对应比例
  • 脚本采用外接矩形长轴近似粒子长度,适合你图中这类杆状粒子;若粒子形状特殊,可替换为轮廓最长距离等计算方式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:05:38