我正在尝试实现一种检测图像中区域的算法,即从种子像素开始,应该将相邻像素添加到该区域,首先是最高值。
我正在寻找一个数据结构作为可以添加相邻像素的队列。它应该能够
以下是我的想法
% given:
% I image (2d matrix)
% x, y seed point
list = [];
region = zeros(size(I));
while [...]
% Add all neighbors of (x, y) to list
if x > 1
% neighboring pixel to the left
ind = sub2ind(size(I), x - 1, y);
if length(find(list == ind)) == 0
list(end+1) = ind;
end
end
% similarly for all other neighbors
% [...]
% Find max in I among points in list
[dummy, list_max_i] = max(I(list));
max_i = list(list_max_i);
[x, y] = ind2sub(size(I), max_i);
% remove from list
list(list_max_i) = [];
region(x, y) = 1;
end
但我想用数据结构替换list
,这更适合添加和删除元素。有任何想法吗?
答案 0 :(得分:3)
如何继续使用仅分批生长的矩阵/向量而不是逐个生长的矩阵/向量。这具有预分配和动态扩展阵列的灵活性的好处。以下是两篇感兴趣的帖子:
此外,您似乎正在实施region growing算法。这是FEX上的a submission,它使用这种生长矩阵的完全相同的技术。
答案 1 :(得分:3)
我认为你需要重新思考你的方法。为什么不为每个像素保留一个掩码,而不是维护一个保持更改大小的列表(非常不合理的设计)? mask
的大小与I
最初开始为零的大小相同。然后,当一个像素插入到列表中时,它的掩码将更改为1,当它离开列表时,它将其值更改为-1。您可以使用max( I( mask == 1 ) )
找到列表中的最大像素数,等等
这样,您只会更改掩码中的值,而不会更改其大小和分配。
您怎么看?