【问题标题】:Storing image data as a row vector将图像数据存储为行向量
【发布时间】:2017-04-24 18:06:29
【问题描述】:

我在一个文件夹中有多个图像,对于每个图像,我想将数据(像素值)存储为行向量。将它们存储在行向量中后,我可以将这些行向量组合为一个多维数组。例如第一个图像的数据将存储在第 1 行,第二个图像的数据将存储在第 2 行,依此类推。并且任何时候我想访问特定的图像数据,假设我想要第三张图像,我可以这样做race(3,:)

我目前收到错误:

被连接的矩阵的维度不一致。

错误发生在这里race = [race; imagevec] 我不知道如何纠正这个问题,除非imagevec = I(:)' 没有将矩阵转换为行向量。

race = []; % to store all row vector
imagevec = []; % to store row vector

path = 'C:\Users\User_\somedir\'; % directory
pathfile = dir('C:\Users\User_\somedir\*.jpg'); % image file extension in directory

for i = 1 : length(path)
    filename = strcat(path,pathfile(i).name); % get the file
    I = imread(filename); % read file

    imagevec = I(:)'; % convert image data to row vector

    race = [race; imagevec]; % store row vector in matrix
end

【问题讨论】:

  • 您的原始图像的大小似乎不同。在每个I = imread(filename); 之后执行disp(size(I)) 看看是否是问题所在。
  • 纠正这个问题的方法是在连接矩阵的位置放置一个断点并运行脚本。然后在每次迭代中检查两个矩阵的维度,直到它们不一致。然后您就找到了显示错误的图像以及原因。
  • 你说的都对,我看他们的维度不同。出于某种原因,我没有考虑到这一点。使它们全部达到同一维度的最佳方法是什么?

标签: matlab


【解决方案1】:

使用元胞数组而不是矩阵将允许您以这种方式进行索引,即使您的图像大小不同。

您甚至不必将它们转换为行向量即可将它们全部存储在同一个结构中。你可以这样做:

path = 'C:\Users\User_\somedir\'; % directory
pathfile = dir([path,*.jpg']); % image file extension in directory
race = cell(length(pathfile),1);
for i = 1 : length(pathfile)
    filename = strcat(path,pathfile(i).name); % get the file
    I = imread(filename); % read file
    race{i} = I; % store in cell array
end

然后当你想要执行一些操作时,你可以简单地索引到元胞数组中。如果您愿意,您甚至可以将其转换为行向量,如下所示。

thisImage = race{3}(:)';

【讨论】:

    【解决方案2】:

    如果您使用矩阵来存储结果,则矩阵的所有行必须具有相同的长度。

    元胞数组与数组类似,只是元素的类型/大小不必相同。

    您可以使用元胞数组完成您正在寻找的事情。首先,将比赛初始化为:

    race = {};
    

    那就试试吧:

    race = {race{:}, imagevec};
    

    【讨论】:

    • 这是我得到的错误“来自非单元格数组对象的单元格内容引用。”
    • 您必须将race 初始化为元胞数组:race = {}; 而不是race = [];
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    相关资源
    最近更新 更多