1

我正在尝试将文件夹中的所有图像添加到m * n * p数组中。我知道图像的大小不一样,并且彼此不同。这就是为什么我收到尺寸不匹配错误的原因。

这是我要运行的代码

d = dir('c:\test\*.jpg');
fileNames = {d.name};
numElements = numel(fileNames);

Im =imread(fullfile('c:\test\',fileNames{1}));
I = rgb2gray(Im);

sequence = zeros([size(I) numElements], class(I));
sequence(:,:,1) = I;

for k = 2:numElements
    sequence(:,:,k) = rgb2gray(imread(fullfile('c:\test\',fileNames{k})));
end

有没有办法解决这个问题?

我尝试使用它来调整它们的大小,但这要么会根据比例调整它们的大小,但这仍然无法解决我的问题,要么会根据会破坏纵横比的列数和行数来调整它们的大小。

有什么方法可以初始化sequence数组,以便它接受任何大小的图像并进行相应调整?

4

2 回答 2

4

简单地通过填充或剪切来调整图像的大小对我来说似乎很疯狂,除非您不在乎是否丢失信息或添加零,这可能会严重扭曲图像的含义。(对于某些问题,零填充可能是个问题。)

上采样或下采样也可能会丢失信息,或者由于插值而向图像添加不需要的特征。我认为插值的明智选择不会是一个坏主意,但该选择取决于这些图像对您意味着什么以及您将如何使用它们。这些事情只有你自己知道。当然,改变纵横比可能不是一个好主意。

如果您只想存储图像,那么为什么不使用元胞数组呢?元胞数组不关心图像的大小。

如果您确实需要相同大小的图像,但又不愿意接受纵横比的变化,那么零填充是您唯一的选择。请注意,零垫实际上是黑色像素垫。如果您更喜欢用白色像素填充,那么用 1(或 255,取决于图像的缩放比例)填充。

编辑:

由于单元阵列似乎是很好的解决方案,请执行以下操作:

% Preallocates a cell array
sequence = cell(6,1);

% stuff the images
for k = 1:numElements
    sequence{k} = rgb2gray(imread(fullfile('c:\test\',fileNames{k})));
end

请注意,您已经为文件名使用了元胞数组。您可以使用花括号 {} 括号对元胞数组进行索引。请注意,您也可以使用 round () 括号来索引单元格数组,但结果将是一个新的单元格数组,而不是您想要的实际单元格元素。

于 2013-08-24T14:52:27.217 回答
1

我可以想到两个简单的解决方案,包括填充或剪切原始图像以实现统一的大小:

(1) 确定所有图像的特定最终尺寸(以像素为单位)(例如,使用一张图像作为所有其他图像的模板)

(2)方案 A.调整所有图像的大小,使其中一个尺寸与模板中对应的尺寸相匹配,而另一个尺寸大于模板的尺寸。接下来沿超大尺寸剪辑图像。一种替代方法是接缝雕刻,它使用一种算法来删除它认为的非必要像素。

备选方案 B.调整所有图像的大小,使其中一个尺寸的尺寸与模板中的相应尺寸相匹配,而另一个尺寸小于模板的尺寸。沿短尺寸填充图像,使其与模板的大小相匹配。

如果由于剪裁而无法从图像中丢失任何信息,则将图像填充到一定大小,但随后会出现空白,这可能是不可接受的。

于 2013-08-24T14:17:02.397 回答