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

求助:如何用MATLAB精准提取CT扫描图像的骨料边界?

CT图像骨料与空隙分割改进方案及边界提取方法

一、预处理优化:先降噪再分割

CT图像常伴随高斯噪声,直接阈值分割易引入伪边缘,建议先做保边缘降噪处理:

  • 高斯滤波(适配高斯噪声场景):
    img_filtered = imgaussfilt(original_img, 1.5); % 核大小可根据噪声强度在1-2区间调整
    
  • 双边滤波(保留边缘细节的同时降噪):
    img_filtered = bfilter2(original_img, 5, 0.1, 20); % 窗口大小、空间标准差、灰度标准差可按需微调
    

二、阈值分割方法调整

1. 优化自适应阈值参数

你使用adaptivethreshold效果不佳,大概率是窗口尺寸和偏移量设置不合理,可调整参数重试:

% 增大窗口尺寸(覆盖更多局部区域,避免过度分割),减小偏移量(降低对局部均值的偏移要求)
binary_img = adaptivethreshold(img_filtered, 51, 7); % BlockSize设为奇数(31/51/71均可测试),Offset设5-10区间

2. 尝试多阈值或手动阈值

  • 用multithresh自动确定分割阈值,再完成二值化:
    levels = multithresh(img_filtered, 1); % 分2类,对应空隙与骨料
    binary_img = imbinarize(img_filtered, levels);
    
  • 查看灰度直方图手动选阈值:
    imhist(img_filtered); % 观察直方图,找到空隙(左峰)与骨料(右峰)之间的谷底,比如阈值设为80
    binary_img = img_filtered > 80;
    

三、后处理:修正分割结果缺陷

二值化后通常存在小噪点或孔洞,用形态学操作修复:

  • 去除小噪点+填充小空洞:
    se = strel('disk', 3); % 结构元素大小按需调整
    img_cleaned = imclose(imopen(binary_img, se), se); % 先开运算去噪,再闭运算填充骨料内部小空洞
    
  • 移除面积过小的连通区域:
    img_cleaned = bwareaopen(img_cleaned, 100); % 移除面积小于100像素的区域,过滤细碎噪点
    

四、准确提取骨料边界

1. 基于二值化结果提取边界

用bwboundaries提取连通区域的边界,支持排除内部孔洞:

[boundaries, labels] = bwboundaries(img_cleaned, 'noholes'); % 'noholes'参数忽略骨料内部孔洞的边界
imshow(img_cleaned); hold on;
for k = 1:length(boundaries)
    plot(boundaries{k}(:,2), boundaries{k}(:,1), 'r', 'LineWidth', 1.5);
end
hold off;

2. 结合边缘检测与分割结果

若需要更精细的边缘,可先用Canny检测边缘,再用二值化结果筛选有效边缘:

edges = edge(img_filtered, 'Canny', [0.1 0.3]); % 调整Canny高低阈值适配图像
valid_edges = edges & img_cleaned; % 只保留骨料区域内的边缘
imshow(valid_edges);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:08:26