1

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

我正在寻找一种数据结构来充当可以添加相邻像素的队列。它应该能够

  • 索引到矩阵(图像)中,以找到最高值的像素
  • 有效地删除点
  • 添加一个元素,如果不存在的话

这是我想出的

% 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更适合添加和删除元素的数据结构替换。有任何想法吗?

4

2 回答 2

3

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

此外,您似乎正在实施区域增长算法。这是一个关于 FEX 的提交,它使用了与增长矩阵完全相同的技术。

于 2013-04-27T14:41:29.727 回答
3

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

你怎么看?

于 2013-04-27T18:31:24.167 回答