0

我在一个文件夹中有一组彩色图像,我通过以下方式将其读入矩阵:

dirOutput = dir(fullfile('\ImageExample\images','*.jpg'));
fileNames = {dirOutput.name};
for k=1:length(fileNames)
    cd '\ImageExample\images'
    H=fileNames{k};
    S=im2double(imresize(imread(H),[20 20]));
    T=S(:);
    data=[data;T'];
end

在这里,每个图像都被转换为矩阵数据的行向量。现在我进行了一组操作,并希望将每一行数据重新绘制为大小为 20X20X3(rgb) 的图像,矩阵元素为 uint8。哪组命令可以帮助我这样做?处理后,我得到一个双数据类型的矩阵。

4

1 回答 1

0

在我们开始之前,我会取消将每个图像存储为单个向量,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};

祝你好运!

于 2014-08-25T02:27:37.203 回答