在我们开始之前,我会取消将每个图像存储为单个向量,cell
而是使用数组。这样,你可以只索引cell
数组,它会给你一个输出图像作为结果,并逃避从行向量到图像的转换。但是,我的猜测是您可能正在使用某种最小化/机器学习框架,其中每个图像都是一个特征。
无论如何,我们将在cell
这里使用相同的数组方法,并且 Divakar 还指出了您应该做什么。您使用(:)
运算符将每个调整大小的彩色图像转换为单个向量。要进行反向操作,您需要使用reshape
. reshape
接受一维向量,然后您指定所需矩阵的维度,reshape
并将此一维向量转换为所需维度的所需矩阵。请记住,您指定的维度必须满足一维向量中的元素总数。
因此,要读回图像,请对图像中的for
所有行运行循环,提取每个行向量,运行reshape
并将其存储到元胞数组中。您还需要使用im2uint8
将每行提取的双图像转换回其原始uint8
形式。换句话说:
numImages = size(data,1);
imageArray = cell(1,numImages);
for k = 1 : numImages
T = data(k,:); %// Get row vector
im = im2uint8(reshape(T, 20, 20, 3)); %// Reshape row vector into 20 x 20 x 3 matrix
imageArray{k} = im;
end
如果你想要一个单线解决方案(帽子的尖端去 Divakar),arrayfun
像这样使用:
imageArray = arrayfun(@(x) im2uint8(reshape(data(x,:)), 20, 20, 3), 1:size(data,1), 'uni', 0);
因此,要访问第 k个图像,只需执行以下操作:
img = imageArray{k};
祝你好运!