【发布时间】:2015-07-07 16:39:40
【问题描述】:
我已将一个 tiff 堆栈上传到 MATLAB 中,并试图计算某个阈值内的体素数量。图像的最大值是 0 到 255,我的阈值是 75 到 255。图像已经过颜色分离,现在只有红色和黑色。我的代码如下,
FileTif='ImageStack.tif';
InfoImage=imfinfo(FileTif);
mImage=InfoImage(1).Width;
nImage=InfoImage(1).Height;
NumberImages=length(InfoImage);
FinalImage=zeros(nImage,mImage,NumberImages,'uint16');
for i=1:NumberImages
FinalImage(:,:,i)=imread(FileTif,'Index',i,'Info',InfoImage);
end
idx = find(FinalImage >= 75 & FinalImage <= 255);
length(idx)
我的问题是这是否抓住了我所说的我想要做的事情。或者更确切地说,当以这种方式上传 tiff 堆栈时,我的 3D 矩阵 FinalImage 的元素是从 0 到 255 的颜色值吗?我相信我是正确的
max(FinalImage(:))
min(FinalImage(:))
分别返回 255 和 0,尽管当我在 ImageJ 上使用体素计数器插件并获得不同的值时会出现混淆。我不确定差异是由于插件中的体素计数方法还是 ImageJ 阈值图像堆栈的方式。任何关于差异的说明将不胜感激!
【问题讨论】:
-
如果像素强度范围从 0 到 255(即 uint8),为什么要将
FinalImage初始化为 uint16?还有你用 imageJ 得到什么价值? -
我不太熟悉 uint8 和 uint16 之间的区别,并且不确定何时优先于另一个。我找到了将 tiff 堆栈加载到 MATLAB 中的示例代码,它使用了 uint16。我从 Matlab 中的代码中得到的值是 1469144(尝试使用 uint16 和 uint8 并得到相同的数字),ImageJ 给了我值 1136671
-
好的。你在 ImageJ 中使用的插件是什么? uint8 和 uint16 之间的差异与像素可以具有的值有关。对于 uint8,它是从 0 到 2^8(即 255),而对于 uint16,它是 2^16(即 65535),因此范围要大得多。我认为 ImageJ 将所有内容都转换为 uint8 进行处理(检查here)
-
ImageJ 中的插件是Voxel Counter。因此,我在 MATLAB 中为 uint8 和 uint16 获得了相同的值是有道理的,因为数据的最大值是 255。感谢您的帮助@Benoit_11
-
好的,很高兴为您提供帮助!并感谢我不知道 Voxel Counter 插件的提示!
标签: matlab image-processing tiff imagej