直方图归一化报错:Index must be a positive integer or logical 求助
解决DICOM图像直方图统计时的索引错误问题
我来帮你拆解这个报错的原因,以及给出可行的解决办法:
问题根源
你碰到的Attempted to access ; index must be a positive integer or logical报错,核心问题是MATLAB数组的索引必须是正整数或逻辑值,但你的代码里Histo(a(n,m)+1)这一行用到了非整数索引。
为什么处理lena256.bmp正常,处理011fp5_256.dcm就出问题?
- 像
lena256.bmp这类8位位图,读取后默认是uint8类型,转成double后像素值范围是0-255,哪怕不做归一化,a(n,m)+1的结果也是1-256的正整数,完全符合索引要求。 - 而处理DICOM图像时,你执行了
a=a/max(a(:)),把像素值归一化到了0-1的浮点数范围。比如某个像素值是0.45,那a(n,m)+1就是1.45,这不是正整数,MATLAB自然会抛出索引错误。
两种解决方案
方案1:将归一化后的浮点数映射到0-255整数范围
把0-1的浮点数乘以255并转成整数,让索引变回合法的正整数:
a = dicomread('011fp5_256.dcm'); a = double(a); a = a/max(a(:)); a = round(a*255); % 将0-1浮点数转为0-255的整数,也可以用uint8(a*255) figure; imshow(a, []); % 加[]让imshow自动适配显示范围 figure; imhist(a); [N, M] = size(a); Histo(1:256) = 0; for n = 1 : N for m = 1 : M Histo(a(n,m)+1) = Histo(a(n,m)+1)+1; end end Histo = Histo/(N*M); figure; plot(Histo);
方案2:用MATLAB内置函数histcounts统计直方图
手动循环统计容易踩坑,MATLAB的histcounts可以直接处理浮点数的区间统计,代码更简洁可靠:
a = dicomread('011fp5_256.dcm'); a = double(a); a = a/max(a(:)); figure; imshow(a, []); figure; imhist(a); [N, M] = size(a); % 分成256个区间统计频率 [counts, edges] = histcounts(a, 256); Histo = counts/(N*M); figure; plot(edges(1:end-1), Histo); % 用每个区间的左边界绘制直方图
额外提醒:如果你的DICOM图像像素值本身包含负数,
a/max(a(:))会导致部分像素值为负,a(n,m)+1可能小于1,同样会报错。这种情况建议先把像素值映射到0-255范围,比如用a = (a - min(a(:)))/(max(a(:)) - min(a(:)))*255;再转整数。
内容的提问来源于stack exchange,提问作者Lunk
相关产品推荐
相关产品推荐

