使用一组可变点来索引矩阵

时间:2013-04-11 19:49:17

标签: matlab data-structures

我正在尝试实现一种检测图像中区域的算法,即从种子像素开始,应该将相邻像素添加到该区域,首先是最高值。

我正在寻找一个数据结构作为可以添加相邻像素的队列。它应该能够

  • 索引到矩阵(图像),找到最高值像素
  • 有效删除积分
  • 添加元素(如果尚未存在)

以下是我的想法

% 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,这更适合添加和删除元素。有任何想法吗?

2 个答案:

答案 0 :(得分:3)

如何继续使用仅分批生长的矩阵/向量而不是逐个生长的矩阵/向量。这具有预分配和动态扩展阵列的灵活性的好处。以下是两篇感兴趣的帖子:

此外,您似乎正在实施region growing算法。这是FEX上的a submission,它使用这种生长矩阵的完全相同的技术。

答案 1 :(得分:3)

我认为你需要重新思考你的方法。为什么不为每个像素保留一个掩码,而不是维护一个保持更改大小的列表(非常不合理的设计)? mask的大小与I最初开始为零的大小相同。然后,当一个像素插入到列表中时,它的掩码将更改为1,当它离开列表时,它将其值更改为-1。您可以使用max( I( mask == 1 ) )找到列表中的最大像素数,等等 这样,您只会更改掩码中的值,而不会更改其大小和分配。

您怎么看?