Matlab上颌窦CT体积测量代码步长疑问及~=维度不匹配报错求助
问题解答
问题1:图像读取步长的含义与取值说明
- 含义:该参数控制DICOM序列切片的读取间隔,用于平衡计算效率和测量精度。比如你总共选中了N层CT切片,步长设为1时,会按顺序读取全部切片;步长设为2时,仅读取第1、3、5…层切片,跳过相邻的一层,减少参与计算的总数据量。
- 取值方法:
- 优先取
1:如果需要最高的测量精度,直接读取全部切片,不会引入采样误差 - 若CT层厚极薄(<0.5mm)、总切片数过多导致计算卡顿,可适当调大到2~3,注意最终计算体积时,需要将单层面积乘以「层厚 × 步长」再累加,避免体积计算偏差
- 步长取值不能超过总切片数,否则只会读取第一层切片
- 优先取
问题2:矩阵维度不一致报错修复
这个报错是Matlab版本差异 + 代码鲁棒性不足共同导致的,适配R2019b的修复方案如下:
报错原因
- 旧版R2013的
im2bw函数会自动将输入图像归一化到01灰度范围再按阈值二值化,而R2019b的`im2bw`不会自动处理非01范围的输入,你的输入是HU值范围的CT影像,直接用0.49做阈值会导致二值化结果异常,经常出现全黑/全白的二值图,连通域检测结果为空 - 当连通域检测结果为空时,
max(A)返回空值,空值和labelmatrix输出的矩阵做~=比较时就会触发维度不匹配的报错 - 跨版本的
labelmatrix输出格式存在兼容性差异
修复后的完整代码段
% Read images clear all close all [filename, pathname] = uigetfile('*','Select CT exam (all slices)','MultiSelect','on'); num= length(filename); bbbb=1; % 修复原输入的转义符错误 step=input('Step of image reading: \n'); for aaaa = 1:step:num xinfo=dicominfo([pathname,char(filename(aaaa))]); pxsp=cat(2,xinfo.PixelSpacing); x=dicomread([pathname,char(filename(aaaa))])+cat(2,xinfo.RescaleIntercept); k=x; % 替换im2bw,先归一化再二值化,适配新版本Matlab k = imbinarize(rescale(k),0.49); k = imfill(k,'holes'); cc = bwconncomp(k); stats = regionprops(cc,'Area'); A = [stats.Area]; % 新增空连通域判断,避免异常 if isempty(A) k = zeros(size(k)); else [~,biggest] = max(A); % 替换labelmatrix写法,消除版本兼容性问题 k = zeros(size(k)); k(cc.PixelIdxList{biggest}) = 1; end x(k~=1)=-2000; masccranio(:,:,bbbb)=k; cranio(:,:,bbbb)=x; cranio_full(:,:,bbbb)=x; bbbb=bbbb+1; end
兼容备选方案
如果要继续使用已弃用的im2bw函数替代imbinarize,可以把二值化代码改为:
k = im2bw(mat2gray(k), 0.49);
效果和rescale + imbinarize一致。
内容的提问来源于stack exchange,提问作者Mahdi
相关产品推荐
相关产品推荐

