首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
用ImageJ自动统计颗粒粒径并绘制粒径分布图全流程
📅 2026/10/9 21:08:14
✍️ 爱科研究院
👁 阅读 3,247
做材料、粉体、陶瓷、电池、制药或者土壤科学的人多半都有过这种经历手里有一堆电镜或者显微镜图像老板让你统计颗粒尺寸和分布结果你对着图发呆不知道从哪儿下手。我刚接触这个需求的时候也是硬着头皮一张张图手动量量完发现数据量还不够交不了差。后来我用ImageJ计算颗粒粒径并绘制粒径分布图整个过程从半小时手动量几十个颗粒变成几分钟自动处理上千个颗粒效率完全不是一个量级。这篇文章把我的完整流程、参数设置和踩过的坑整理出来给需要的人参考。先说清楚这套方法能解决什么问题从SEM、TEM、光学显微镜等图像中自动识别单个颗粒的轮廓计算每个颗粒的直径再统计出粒径分布最后生成频数分布直方图和累积分布曲线还能顺手算D10、D50、D90这些特征粒径。适合科研和工业质检场景尤其是需要对大量颗粒做统计、不想一颗颗手动量测的人。1. 整体思路ImageJ凭什么能做这件事1.1 为什么选ImageJ而不是其他工具市面上能做颗粒分析的软件很多商业软件有各自的颗粒分析模块功能确实强大但授权费用不便宜而且不同软件之间的操作逻辑差异很大。ImageJ最大的优势是免费开源、插件生态极其丰富、跨平台实验室里几乎任何一台电脑都能装。它本身就是一个通用图像处理平台颗粒粒径分析只是它众多功能中的一项但你不需要为这一项功能去买一套昂贵软件。ImageJ处理粒径的基本逻辑并不复杂一张显微图像本质上就是一个像素矩阵每个像素有灰度值。颗粒和背景在图像上体现为灰度差异你把颗粒从背景里“分”出来变成黑色和白色两个部分然后让软件找到每个白色区域的边缘轮廓算面积再根据比例尺换算成实际尺寸。整个过程可以拆成五步图像预处理、二值化、颗粒分割、参数测量、数据导出统计。每一环都有对应的菜单命令逻辑链完整中间能随时停下来看效果。用ImageJ还有一个很实际的好处自定义能力极强。你可以把整个流程录制成宏同一批样品的图像一键批量处理输出统一的表格。后续换换阈值、换换粒径范围也只是改一个参数的问题不会像手动测量一样每张图都要重复劳动。1.2 这套方法适合什么场景最常见的使用场景是扫描电镜图颗粒边界清晰、衬度好是相对容易处理的对象。光学显微镜图也适合只要颗粒与背景之间存在稳定的灰度差异比如染色后的生物颗粒、透明的微球、水泥颗粒的岩相照片等基本都能适用。这套方法的限制也要讲清楚。颗粒与背景灰度接近时分割效果会明显变差颗粒堆叠严重、形成大面积团聚时软件很难把每个颗粒单独认出来颗粒形状特别不规则、呈纤维状或者片状时单一的“粒径”很难定义——但这恰恰是任何粒度仪都会面临的问题。ImageJ更适合处理“在图像中能看到完整轮廓、彼此有一定分离”的颗粒。对于严重团聚的样品预处理这一关会非常关键后面我会细说。1.3 核心流程概览我用文字先把全流程串一遍心里有个地图后面每个环节就不会乱打开图像确认比例尺信息用软件自带标尺把像素换算成实际长度降低噪点、去除不均匀背景把灰度图转换成黑白的二值图用分水岭算法把粘连的颗粒分开运行Analyze Particles输出每个颗粒的面积、周长、直径等参数导出数据到表格计算特征粒径用Excel或Origin画频数分布和累积分布图。下面我按这个顺序一步步展开重点说哪里容易出错。2. 测量前准备图像采集与标定2.1 图像质量基本要求很多人拿到图像直接就开始分析结果一团糟回头看才发现是图像本身不过关。图像分析这个领域有一句老话进去的是垃圾出来的还是垃圾。颗粒分析对图像的基本要求是颗粒清晰、边界锐利、背景尽量均匀、图像不要压缩得太狠。SEM图一般问题不大但有些保存成低质量JPG的图压缩噪声会在后续二值化时变成大量小颗粒让你根本无法统计。分辨率也很关键。一个颗粒跨多少个像素直接决定了测量精度。一般来说单个颗粒直径方向至少要有10到20个像素太小了边缘误差就会占很大比例。比如颗粒是1微米图像上只有4个像素宽那测量结果可能偏大或偏小百分之几十误差根本没法接受。如果发现图里颗粒太小宁可重新拍图也不要硬分析。另外拍图的时候最好保证视野里的颗粒数量够多。统计一个分布至少要数几百个颗粒上千个更好。颗粒太少的话分布曲线的尾巴完全取决于运气特征粒径根本不稳定。这一点很多人容易忽略只盯着软件的准确度没意识到采样数量不够统计上就不成立。2.2 比例尺标定准确测量的根基我刚开始用ImageJ时犯过一个低级错误忘记标定比例尺结果所有数据都是“像素”而不是“微米”后期又没法批量换算只能重来一遍。标定就是把像素和实际物理尺寸对应起来这是整个粒径计算的地基地基歪了后面再花哨也是白搭。SEM图像比较简单图片底部通常有一根标尺比如1 μm或500 nm。用ImageJ的直线工具沿着标尺线的两端画一条线段然后打开菜单Analyze Set Scale在“Distance in pixels”处会自动带入你画的线段的像素长度在“Known distance”里填入标尺对应的实际长度比如1在“Unit of length”里填“μm”软件就会自动算出每毫米或每微米对应的像素数。勾选Global后这一批图像全部共用同一个标定值不用每张图都画一次。光学显微镜图通常没有现成标尺你可以用载玻片上的刻度线来标定或者用标准微球标定。还有一个技巧如果图像上有一个已知尺寸的物体比如某种标准微球、标称直径的微粒也可以用来验证标定是否准确——我在分析完一批样品后会额外测一个已知直径的标准粒子如果算出来偏了超过5%就说明前面的流程哪一环出了问题。注意如果SEM图像底部本身有标尺且你在后期裁剪图像时把标尺裁掉了那这张图的比例尺信息就彻底丢失了。建议分析前先记录原始图像的缩放比例或保存一份未裁剪的原始文件。3. 图像预处理与颗粒分割3.1 从彩色原图到干净的二值图这一步的目标只有一个把颗粒和背景彻底分开。彩色图像先转成8-bit灰度图操作路径是Image Type 8-bit。大部分显微图像在灰度下已经够用不需要额外转彩色通道。然后做降噪。SEM图常见的是椒盐噪声和高斯噪声可以选择Process Filters Gaussian Blur半径取1到2个像素别贪大。半径太大会把颗粒边缘模糊掉导致颗粒看起来比实际大一圈测量结果整体偏大。如果图像噪点很多可以改用中值滤波它在降噪同时保边缘的能力稍微好一些但相应地会把特别小的颗粒细节抹掉。接下来是去背景。很多图像有光照不均匀或者电镜亮度不一致的问题导致图像一侧亮一侧暗直接影响阈值分割。用Process Subtract Background选择Rolling Ball算法滚动半径一般设置为颗粒直径的1到2倍。比如颗粒直径是30像素半径就设60左右。这个操作会把局部背景的渐变去掉让整个图像的背景亮度趋于一致后续二值化会稳得多。最后是阈值分割。打开Image Adjust Threshold拖动滑块让颗粒显示为红色、背景显示为黑色直到颗粒轮廓与视觉一致然后Apply生成二值图。更推荐用Image Adjust Auto Threshold在方法里选“Otsu”它根据灰度直方图自动找到最佳分割阈值适合大多数图像。第1轮自动阈值如果不太准再在“Dark Background”和“Light Background”之间切换试试很多图的问题只是选错了背景方向。做完这一步你应该得到一张黑白分明的图颗粒是白色背景是黑色颗粒之间没有大面积“粘住”的情况。如果颗粒内部有黑洞灰度不均造成的孔洞可以用Process Binary Fill Holes把内部空洞填上。3.2 粘连颗粒的分离分水岭算法这是整个流程里最值得花时间调校的一步。二值化之后很多颗粒是贴在一起的尤其电镜图里粉末颗粒难免有团聚。如果不做处理直接测量软件就会把三四个颗粒当成一个“大颗粒”粒径数据会严重偏大。ImageJ提供了分水岭算法来分割粘连目标路径是Process Binary Watershed。原理不复杂把二值图像中每个白色像素到最近黑色像素的距离算出来相当于生成一幅“地形图”颗粒内部的中心区域像山顶颗粒之间的接触带像山谷算法沿着山谷线把原本连在一起的白色区域切开。通俗讲就像在两块黏在一起的泥巴之间用切刀划了一道缝。操作节奏上我先执行一次Watershed然后Zoom In看局部分割效果。如果仍有明显没分开的说明粘连比预想严重。这时候不急着反复点Watershed而是先做一次Process Binary Open开运算把颗粒之间极细的连接“焊点”先断开再做分水岭效果往往更好。开运算本身也可以把图像上一些孤立的噪点小颗粒去掉一举两得。有一个非常关键的注意事项分水岭只对“有凹陷接触区”的颗粒有效。如果两个颗粒完全叠在一起从二值图上看就是一个整体、没有明显脖子的形状那算法是没法把它们分开的。这种图像我只能说换一个分散得更充分的视野重新拍比硬调参数省时间。另外过于频繁地使用分水岭或者开运算还容易把一个正常的葫芦形颗粒切成两个这会导致小粒径端颗粒数量虚假偏多。所以每一步操作都要对着原始图确认看它是不是“越切越碎”。4. 粒径测量参数解析4.1 Analyze Particles关键参数怎么设分割完成打开Analyze Analyze Particles这里每个参数都值得琢磨一下。首先是Size(pixel^2)这个参数设置最小面积和最大面积的过滤范围。默认是0到无穷大但实际测量时一定要改。图像上有一些零星噪点区域面积只有几个像素如果不滤掉它们会被当成颗粒统计进去。我一般设成10到Infinity也就是小于10个像素的区域全部忽略。具体数值看你的图像噪点情况和最小颗粒尺寸可以先用Infinite跑一遍看结果表格里的最小Area然后反推一个合适的下限。反过来如果图像里有大型异物或者图像边缘的伪影你需要设置一个面积上限把这些假目标排除。Circularity圆形度是第二个重要参数。它的计算公式是4π×(Area/Perimeter²)正圆是1.0越不规则越接近0。这个参数用来过滤形状明显不对的目标。比如你分析球形颗粒可以把Circularity下限设到0.3或0.5把长片状杂质、图像划痕排除掉。但注意真实颗粒往往不是标准圆设得太苛刻会漏掉很多真颗粒。我的习惯是先用0.00到1.00全范围跑一遍观察Outlines结果再决定缩小到哪个范围而不是一上来就猜一个数。Show下拉菜单选择Outlines这一步强烈建议勾选。运行之后ImageJ会生成一个带编号的轮廓图每个被识别出来的颗粒都被标上了数字你拿它和原图一张张对照能直观看出哪些颗粒被漏了、哪些被错误合并或者错误拆分。最后三个复选框Display results弹出结果表、Exclude on edges排除贴边颗粒、Clear results before running运行前清空上一次结果。Exclude on edges建议勾选因为贴边的颗粒是被图像裁切过的计算出来的尺寸偏小混进统计会拉低粒径均值。不过如果整张图里贴边的颗粒占了很大比例比如你拍的视野颗粒很大、边缘几乎全是切掉的大颗粒那这个选项反而会把最有价值的大颗粒数据全丢掉。这种情况下我会再换一个视野重新拍摄而不是直接统计。4.2 结果表格怎么读运行Analyze Particles之后弹出结果窗口每个颗粒一行。现在打开Analyze Set Measurements把需要输出的参数勾上。颗粒分析至少要勾这几个Area颗粒面积单位是标定后的“平方微米”或平方纳米是后续算直径的基础Feret及FeretX、FeretY费雷特直径指的是颗粒在任意方向上投影距离的最大值简单可以理解为“卡钳两个方向量出来的最大宽度”MinFeret最小费雷特直径相当于颗粒最窄方向的宽度Circ.圆形度Perimeter周长用于计算圆形度等形态参量。重点是ImageJ不会直接给出一个叫“颗粒直径”的输出值。面积量的默认输出是Area而我们做粒度分析时需要的是一个等效圆的直径。等效圆直径的意思就是假设这个颗粒的形状其实是一个圆形那么和它面积一样的圆的直径是多少。公式是[ D 2 \times \sqrt{\frac{Area}{\pi}} ]在Excel里就是2*SQRT(Area/PI())。这个D就当作这个颗粒的名义粒径和激光粒度仪给出的等效球直径逻辑不同但思路相似。Feret直径有时候也被当作粒径使用不过Feret对颗粒取向敏感而等效圆直径对旋转不敏感我用等效圆直径比较多。结果表里还有一个有用的功能右上角菜单List或File Save As可以导出文本文件。我一般在Excel里做后续处理所以直接在结果窗口全选复制、粘贴到Excel里更方便。5. 粒径分布图绘制与统计计算5.1 数据整理与分组拿到每个颗粒的等效圆直径之后下一步就是画分布图。先把直径那一列数据排好序然后决定分多少个区间bin。分得太细柱状图会像锯齿一样看不出规律分得太粗分布特征又被抹平了。一个经验法则颗粒数量在几百颗左右时分成10到20个区间比较合适。具体宽度视数据范围而定比如颗粒在1到10微米之间可以按0.5微米一组分18组如果在20到100微米之间可以按2微米一组。这里有个细节很多粉末材料的粒径分布是偏态分布大颗粒少、小颗粒多横轴用线性坐标时左边很高、右边长尾巴你很难看清楚细节。这种情况下把横轴改成对数坐标比如颗粒范围跨越一个数量级以上分布形态会清楚得多。很多商品粒度仪的报告都采用对数横轴正是这个道理。5.2 频数分布图和累积分布曲线数据整理成频数表之后可以用Excel的直方图功能或者Origin画出频数分布图。我常用的是以区间中值为横坐标、以该区间内颗粒数量占总颗粒数的百分比为纵坐标画柱状图或散点连线图。纵坐标用“数量百分比”还是“体积百分比”要特别区分。ImageJ直接统计得到的是数量分布每一颗颗粒贡献1个计数。但这在材料学上往往不是我们最关心的因为细颗粒数量再多占的体积权重也很小。要得到体积分布需要对每个颗粒按球体体积加权也就是(V\frac{4}{3}\pi r^3)把每个颗粒的体积当成权重去统计。体积分布会明显比数量分布的大颗粒端更突出这个差异在双峰分布或者宽分布体系里尤其显著。如果论文里看到别人贴的粒度分布图先搞清楚他是数量分布还是体积分布别拿苹果和橘子比。累积分布曲线则是把所有颗粒按粒径从小到大排列横轴是粒径纵轴是小于该粒径的颗粒累计百分比。这个曲线在数据处理里有大用特征粒径D10、D50、D90都从这条曲线上读出来。5.3 D10 / D50 / D90的计算D50也叫中位粒径表示累计百分比达到50%时对应的粒径意思是一半按个数或按体积的颗粒小于这个尺寸。D10和D90分别是累计到10%和90%时的粒径。D90-D10可以用来表示粒度分布的宽度差值越大分布越宽。在Excel里操作先把颗粒按直径从小到大排序添加一个“累计百分比”列计算方式是对应行之前所有颗粒数量或体积之和除以总数。然后用粒径列做横轴、累计百分比列做纵轴画一条平滑曲线。要找D50就在累积曲线上找到纵坐标50%对应的横坐标值可以直接用Excel的趋势插值或者干脆把区间分细一点在两个数据点之间做线性插值精度基本够用。如果只会用Excel还有个办法用PERCENTILE函数对原始颗粒直径数组求50分位但前提是数据量大且是数量分布体积分布就需要先加权再插值。如果想一步到位很多团队会把ImageJ结果直接导入Origin或Matlab脚本写一行加权统计的代码自动输出D10、D50、D90。手工做一次之后把公式存成模板后续每次只要粘贴新数据就行。6. 常见问题排查与避坑建议6.1 常见问题速查我把自己和身边人踩过的坑汇总成一张速查表按问题现象排列看得更快现象可能原因解决办法结果全是像素单位没做Set Scale标定返回第2节画标尺线并在Set Scale里填实际长度颗粒被识别成一大块二值图中颗粒粘连未分离执行Watershed必要时先做Open再分水岭有很多几十像素的“假颗粒”噪点被当成颗粒调大Analyze Particles的Size下限或者先做去噪滤波颗粒边界明显偏大/偏小高斯滤波半径过大或阈值选得不当减小模糊半径手动微调Threshold滑块贴边的大颗粒数据缺失Exclude on edges导致大颗粒被全排除判断贴边颗粒比例如果太大建议重新拍图或取消该选项颗粒内部有黑洞颗粒内部灰度不均使用Binary Fill Holes填充孔洞双向分布被切成一个个颗粒分水岭过度分割减少二元开操作次数或换原始图重新分割分布图尾巴特别长也不平滑统计颗粒数太少多拍几个视野合并后再做统计6.2 实操中的独家经验最后说几条我个人在实操中摸索出来的经验这些内容普通帮助文档里很少写。第一无论如何处理完每一步都要保留一个中间结果图。比如二值图、Outlines轮廓图、分水岭之后的图全部另存。粒径数据如果不靠谱还能回去定位是哪一步出了问题而不是推倒重来。第二阈值调整时不要只看颗粒边缘顺不顺眼要看是否会漏掉那些亮度比较低的小颗粒。很多小颗粒在灰度图上颜色比较浅如果阈值拖得太高小颗粒全部消失整个分布就往大粒径端偏移。我看到很多新手在Otsu结果基础上把阈值往亮的方向拖了一点边缘是好看了小颗粒全没了。第三批量处理时不要每张图都用同一套参数盲目跑。同一批次扫描电镜的亮度也不完全一致尤其是聚焦区域和边缘位置。我的做法是先对3到5张代表性图像手动调好参数再看全部图像的灰度直方图是否接近如果差异明显宁可按亮度分批处理也不要一套参数打天下。第四如果发现图像里的颗粒和背景对比度很低比如透明颗粒在光学显微镜下看不太清可以试试ImageJ的Process Enhance Contrast或者用简单的减法背景来增强边界效果经常比硬调阈值好很多。当然最佳方案永远是在拍摄阶段就尽量调好亮度和对比度。我个人实操中最深的一点体会是整个方法的核心瓶颈不在参数而在图像本身。花一周时间调参数不如花半小时重新拍一批好图。图像清楚后面的阈值、分水岭都很顺利图像质量差你会在参数上疲于奔命。每次拿到一批新图我会先开十来张快速浏览一遍确认颗粒分散度和边界清晰度能满足要求再开始做批量分析。这个先审视图像再动手的习惯帮我少走了很多弯路。后续如果你需要经常处理此类图像强烈建议把完整流程录成ImageJ宏把标定、滤波、二值化、分水岭、Analyze Particles串成一条命令一次运行一键出结果真正释放手工重复劳动。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/9 21:08:14
AI编程未来的两种可能:Claude Code与Cursor路径下的测试行业变革|TaoToken统一Key接入实测
2026/10/9 21:03:12
基于YOLO的海洋垃圾识别分类:从数据增强到模型调优的毕设实战指南
2026/10/9 21:03:12
教育机器人多模态感知与教学场景理解落地实践
2026/10/9 22:48:30
寄生虫虫卵检测数据集+YOLO实战:3600张显微图像构建医学AI落地样本
2026/10/9 22:48:30
QQ 机器人装好却不回话,几个高频配置项先查一遍
2026/10/9 22:48:30
把 Hermes Agent 当 Python 库用:TaoToken 统一 Key 下的 Agent 架构与实践
2026/10/9 22:48:30
OpenClaw 多智能体调查实战:用 TaoToken 统一 Key 调度五路 CLI 取证链路
2026/10/9 22:48:30
论文初稿没思路?7款AI写论文工具1天搞定全学科毕业论文:TaoToken统一Key接入实测
2026/10/9 22:43:29
基于SpringBoot+Vue的商务安全邮箱:邮件收发与安全校验实战
2026/10/9 0:01:35
RISC-V裸机启动全流程:从复位向量到main函数的七步实现
2026/10/9 0:01:35
Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南
2026/10/9 0:01:35
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错
2026/10/8 5:02:14
Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化
2026/10/9 1:10:43
多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系
2026/10/9 3:31:49
hindsight:面向LLM应用的事后可观测性工程实践
2026/10/8 4:30:43
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/9 3:32:01
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/9 11:36:17
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)