求助:基于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
相关产品推荐
相关产品推荐

