将二进制文件中的体素值读入 matlab
Reading voxel values from binary file into matlab
我有一个 16 位体素数据集,我需要从中提取每个体素的整数值。数据集可以从here下载,是'Head Aneuyrism 16Bits'数据集(需要点击血管图片下载16bit版本)。它的大小是 512x512x512,但我不知道它是灰度还是彩色,也不知道这是否重要。看网站上的图片我猜是彩色的,但我不确定图片是否应该照字面意思。
关于 SO 的相关问题如下:How can I read in a RAW image in MATLAB?
感谢这些问题的答案中的信息,我设法使用 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',我会得到一部带有 implay 的全黑电影。
看来你读对了数据。
显示时的问题是值的比例。 implay
似乎假定值在 [0,1]
中,因此将所有值都限制在该范围内,您的数据范围在哪里 [0,3000]
.
简单做
B = B / max(B(:))
会将您的数据重新调整为 [0,1]
并使用
再次查看数据
implay(B)
给你看一些更明智的东西。
我有一个 16 位体素数据集,我需要从中提取每个体素的整数值。数据集可以从here下载,是'Head Aneuyrism 16Bits'数据集(需要点击血管图片下载16bit版本)。它的大小是 512x512x512,但我不知道它是灰度还是彩色,也不知道这是否重要。看网站上的图片我猜是彩色的,但我不确定图片是否应该照字面意思。
关于 SO 的相关问题如下:How can I read in a RAW image in MATLAB?
感谢这些问题的答案中的信息,我设法使用 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',我会得到一部带有 implay 的全黑电影。
看来你读对了数据。
显示时的问题是值的比例。 implay
似乎假定值在 [0,1]
中,因此将所有值都限制在该范围内,您的数据范围在哪里 [0,3000]
.
简单做
B = B / max(B(:))
会将您的数据重新调整为 [0,1]
并使用
implay(B)
给你看一些更明智的东西。