将二进制文件中的体素值读入matlab

时间:2016-02-18 09:17:17

标签: image matlab voxel

我有一个16位体素数据集,我需要从中提取每个体素的整数值。数据集可以从here下载,它是头部Aneuyrism 16Bits'数据集(您需要点击血管图像下载16位版本)。它的大小是512x512x512,但我不知道它是灰度还是颜色,也不重要。看看网站上的图片,我猜它是彩色的,但我不确定图像是否应该按字面意思拍摄。

有关SO的相关问题如下:How can I read in a RAW image in MATLAB?

以及关于mathworks的以下内容:http://www.mathworks.com/matlabcentral/answers/63311-how-to-read-an-n-dimensioned-matrix-from-a-binary-file

感谢这些问题答案中的信息,我设法用matlab从文件中提取了一些信息,如下所示:

fileID=fopen('vertebra16.raw','r');

A=fread(fileID,512*512*512,'int16');

B=reshape(A,[512 512 512]);

我不需要对图像进行可视化,我只需要为每个体素设置整数值,但我不确定我是否以正确的方式使用我的脚本读取信息。 我发现尝试检查我是否具有正确的体素值的唯一方法是使用以下内容可视化B:

implay(B)

现在,使用上面的代码,然后使用implay(B)我得到一张黑白电影,中间有一个白色光盘,黑色背景和一些黑色像素在光盘中移动(我试图上传一帧电影,但它没有工作)。看看我下载文件的网站上的图片,我得到的电影画面看起来与那张图片截然不同,所以我得出的结论是我没有正确的体素值。

以下是与我的问题相关的一些问题:

  • 我是否需要知道图像是灰度还是颜色才能正确读取体素值?
  • 在数据集网站上只写了数据集是16位格式,所以我怎么知道我是处理有符号还是无符号整数?
  • 在上面提到的SO问题中,他们使用&uint8 => uint8'。我在matlab手册中找不到这个,所以我想知道是否' uint8 => uint8'对于&uint8'是一个过时的matlab表示法。或者如果它做了不同的事情。我怀疑它确实有所不同,因为如果我使用' int16 => int16'而不是' int16'在上面的代码中,我得到了一部完全黑色的电影。

1 个答案:

答案 0 :(得分:1)

看起来你正确地读了数据。

显示时的问题是值的比例。 implay似乎假设值位于[0,1],因此会将所有值限制在该范围内,您的数据范围为[0,3000]

简单地做

B = B / max(B(:))

会将您的数据重新调整为[0,1]并再次使用

查看数据
implay(B)

向您展示更明智的事情。