我觉得愚蠢甚至不得不问这个,它真的应该是死的简单,但对MatLab来说是新手我想知道一个更有经验的人会怎么做。
简单的问题;我需要在多个图像中找到一些区域,按位置关联它们,保存那些感兴趣的区域,并在以后使用它们。一种方法是将区域存储在矢量中。
%% pseudo code
regions = [];
for i = some_vector_of_images
% segment, get mask
% find regions
cc = bwconncomp(mask);
stats = regionprops(cc, 'all');
% correlate against known x/y
% save for later
regions[index++] = stats;
end
% use 'regions'
但是,数组声明存在问题。它的默认类型是double,因此无法工作(无法为元素分配结构)。我已尝试struct.empty
,但数组无法调整大小。我尝试过一个单元格数组,但是我收到了类似的错误(Conversion to cell from struct is not possible.
)
真的,我只需要一种方法在循环之前声明一些集合,这些集合将保存这些结构的实例。再一次,相当愚蠢的问题,在这里有点尴尬......请怜悯。
答案 0 :(得分:1)
查看使用 struct2cell
是否可以帮助您解决此问题。试试这个pseudo-code
-
regions = cell(num_of_images,1) %// This will be before the loop starts
...
regions[index++] = {struct2cell(stats)} %// Inside the loop
请注意,这不是pseudo-code
,因此square brackets
和++
无效。
因此,伪代码的完整版本将是 -
%%// --- pseudo code
%// Without this pre-allocation you would get the error -
%%// "Conversion to cell from struct is not possible"
regions = cell(numel(some_vector_of_images),1)
for i = some_vector_of_images
% segment, get mask
% find regions
cc = bwconncomp(mask);
stats = regionprops(cc, 'all');
% correlate against known x/y
% save for later
regions(i) = {struct2cell(stats)}
end
答案 1 :(得分:1)
您可以通过附加结构将空数组转换为结构数组。将regions[index++] = stats;
替换为
regions = [regions, stats];
这一行将继续在循环中构建数组。这个习惯用法在MATLAB中通常不受欢迎,因为每个循环都需要创建一个新的数组。
另一种方法是使用repmat。
预先使用模板结构分配数组stats = some_operations_on(some_vector_of_images(1));
regions = repmat(stats, numel(some_vector_of_images), 1);
并在循环内,使用
进行分配regions(i) = stats;
答案 2 :(得分:1)
在这种情况下,通常我根本不会预先分配,或者使用cell-cat模式。
这个没有初始化struct数组,但工作正常。在这种情况下,请确保i
是每个元素的索引。
for i = 1:numel(some_vector_of_images)
% mask = outcome of some_vector_of_images(i)
cc = bwconncomp(mask);
regions(i) = regionprops(cc, 'all');
end
这个捕获结果是一个单元格数组,并在最后连接所有元素。
regions = cell(numel(some_vector_of_images), 1);
index = 1;
for i = some_vector_of_images
% mask = outcome of i
cc = bwconncomp(mask);
regions{index} = regionprops(cc, 'all');
index = index + 1;
end
regions = cat(1, regions{:});