微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Matlab 函数 reshape 在尝试从 .raw 二进制图像文件创建 3D 图像时不计算最后一个维度

如何解决Matlab 函数 reshape 在尝试从 .raw 二进制图像文件创建 3D 图像时不计算最后一个维度

我使用 Matlab 中的 Otsu 方法创建了二值化图像,并使用函数剪切了生成的图像的一部分。现在我想使用 VolumeViewer 命令查看这些图像。我知道生成的图像的 x、y 和 z 维度。我目前正在运行此代码(不包括在循环之后发生的 volumeViewer):


    files= {'C3\C3_000mal_550_539_527.raw';...
           
            };
 for i=1:numel(files)
         Image = fopen(files{i},'r');
    ImageData{i} = fread(Image,Inf,'uint16=>uint16');
    ImageData{i} = reshape(ImageData{i},550,539,[]);
    fclose(openedCrystalImage);
    end

使用此代码使用 reshape 会遇到以下错误

使用 reshape 时出错 已知维度的乘积,296450,不能整除元素总数,78114575。

我做了数学计算,550*539=296450 和 296450 * 527=156229150:如果我们将最后一个数字除以元素数,它等于 2,因此可以整除元素总数。在我看来,reshape 函数无法找到最后一个维度的大小或将其定义为 1。 定义z的大小也会导致错误提示使用方括号[],所以函数可以找到它。

使用 reshape 时出错 元素数量不得更改。使用 [] 作为尺寸输入之一自动计算合适的尺寸 对于那个维度。

现在到了奇怪的部分。此代码适用于另一组图像,具有不同大小的 x、y 和 z 范围。所以坦率地说,不知道问题出在哪里。所以我真的很感激并回答我的问题

解决方法

我想通了。错误就在这里:

ImageData{i} = fread(Image,Inf,'uint16=>uint16');

显然是在将图像转换为 8 位文件而不是之前的 16 位文件之前将它们保存为 .raw。因此,我的维度是元素数量的两倍。通过这种改变,它可以工作:

ImageData{i} = fread(Image,'uint8=>uint8');

我能够查看其他图片的原因是 z 范围可以被 2 整除。

因此,在为变量 ImageData 创建数组时,reshape 函数不是问题,而是整数数据的大小。

附言我刚开始编程,所以答案的准确性应该持保留态度

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。