【问题标题】:Counting number of voxels above threshold from a tiff stack从 tiff 堆栈计算高于阈值的体素数
【发布时间】: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


【解决方案1】:

我解决了我的问题,如果其他人需要,我会在此处发布答案。我在设置阈值后单击“应用”,这会将其更改为二进制,从而导致错误的结果。如果我设置阈值然后使用体素计数器插件,那么我将得到与我在 MATLAB 中的代码相同的结果。

【讨论】:

    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 2018-11-19
    • 2017-03-20
    • 1970-01-01
    • 2021-05-13
    • 2012-08-09
    相关资源
    最近更新 更多