【问题标题】:Matlab imshow from vector来自矢量的 Matlab imshow
【发布时间】:2014-08-24 17:15:15
【问题描述】:

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

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。哪组命令可以帮助我这样做?处理后得到一个double数据类型的矩阵。

【问题讨论】:

  • reshape, uint8, imshow, figure, help, image

标签: image matlab image-processing vector imshow


【解决方案1】:

在我们开始之前,我会取消将每个图像存储为单个向量,而是使用cell 数组。这样,您只需索引cell 数组,它就会为您提供输出图像,并避免从行向量到图像的转换。但是,我的猜测是,您可能正在使用某种最小化/机器学习框架,其中每个图像都是一个特征。

无论如何,我们将在此处使用相同的cell 数组方法,并且 Divakar 还指出了您应该做什么。您使用(:) 运算符将每个调整大小的彩色图像转换为单个向量。要进行反向操作,您需要使用reshapereshape 接受一维向量,您指定所需矩阵的维度,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);

因此,要访问第 kth 个图像,只需执行以下操作:

img = imageArray{k};

祝你好运!

【讨论】:

  • 当我需要使用 imshow 显示图像时会出现问题,它大部分是黑色的,我尝试将这些值乘以 255,但它大部分是白色的。有没有办法解决这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 2017-06-05
  • 2014-09-25
相关资源
最近更新 更多