【发布时间】:2015-04-21 17:59:06
【问题描述】:
我正在尝试将大量图像组合成一个 .mat 文件。图像为 512x512,灰度。有 31 个这样的图像。
我执行以下操作来创建 matfile 并保存它:
fid1 = fopen('C:\Users\...\MATLAB\fileList_IMG.txt','r');
PATH_IMG = 'C:\Users\...\IMAGES\';
PATH_MAT = 'C:\Users\...\IMAGES\MATfiles\';
IMG_DATA = zeros(512, 512, 31);
while ~feof(fid1)
folderName = fgetl(fid1);
for i=1:31
fileName = sprintf('%s%s\\%s\\%s_%02d.png',PATH_IMG, folderName, folderName, folderName, i);
tempImg = imread(fileName);
IMG_DATA(:,:,i) = tempImg(:,:,1);
end
save_fileName = sprintf('%s%s', PATH_MAT, folderName);
save(save_fileName, 'IMG_DATA');
end
我为加载 matfile 做了以下操作:
fileName = 'C:\Users\...\IMAGES\MATfiles\balloon.mat';
NEWIMG_DATA = load(fileName);
为了便于阅读,假设这是 new_IMG_DATA。
我注意到值不同!它不像值被放大,因为 IMG_DATA 中的 170 和 172 的值对应于 new_IMG_DATA 中的 3709 和 3666。 IMG_DATA 和 new_IMG_DATA 都是双精度数据类型。如果我在创建 .mat 文件之前强制 IMG_DATA 为 uint8,则 new_IMG_DATA 的大部分值都是 255。
以下是 IMG_DATA 保存为 matfile 之前的一些示例: IMG_DATA(400,400,4:10)
ans(:,:,1) = 133
ans(:,:,2) = 141
ans(:,:,3) = 142
ans(:,:,4) = 145
ans(:,:,5) = 156
ans(:,:,6) = 157
ans(:,:,7) = 158
以下是加载后的 new_IMG_DATA 示例: NEWIMG_DATA.IMG_DATA(400,400,4:10)
ans(:,:,1) = 16366
ans(:,:,2) = 18216
ans(:,:,3) = 19648
ans(:,:,4) = 19578
ans(:,:,5) = 19203
ans(:,:,6) = 18682
ans(:,:,7) = 17123
我希望能够正确保存和加载 .mat 文件。我该怎么做?
【问题讨论】:
-
您需要创建一个非常简短的代码示例来重现此错误,因为 MATLAB 在加载/保存时出现错误是非常罕见的。在代码 sn-p 中显示 SAVE 之前的值,以及 SAVE 之后的值。如果这是一个真正的 MATLAB 错误,您应该能够以非常简单的方式重现
-
这是来自 CAVE 数据库的多光谱图像吗?这些图像是 16 位的,所以它们的范围是 0 到 65535。你应该试试 tempImg = double(imread(fileName))/255.;
-
看图片时可以试试
im2double吗?你用的是什么版本的matlab?在您的偏好中,您保存 mat 文件的格式是什么?如果更改这些设置,是否会影响保存的数据? -
@ypnos:是的。感谢您指出它是 16 bpp。当我在 IrfanView 中打开图像时,我不断得到 512x512x8BPP。所以我假设它是8BPP。无论如何,我在读回 matfile 时这样做了:new_IMG_DATA = uint8(new_IMG_DATA./255);
-
@ypnos,你创造了沙鼠!惊人的!我已经使用了一段时间了,它非常好!