2013-04-11 26 views
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 

但我想通过数据STR更换list ucture,它更适合添加和删除元素。有任何想法吗?

+0

使用'cell'数组。 – Justin 2013-04-11 19:59:25

+0

有几件事我不明白你的算法。 'region'的作用是什么(你似乎把它设置为1,如果它有最大值,但从不参考它,你会不会陷入循环?)。从列表中删除“list_max_i”有什么意义?你的'while'循环何时终止?你想结束什么样的价值观?您是否试图从最大像素值开始创建“最陡峭的上升”,从您用作种子点的那个开始,并维护路径信息?多一点的信息,你可能会得到一个比迄今为止建议的更好的解决方案... – Floris 2013-04-29 04:57:50

+0

这段代码实际上是在一个函数内,'region'是结果,一个图像中的连续区域。该列表只应包含用于添加到该区域的“候选人”,并且由于您不想一次又一次添加相同的候选人,因此添加到该区域时,必须从列表中删除元素。 – ValarDohaeris 2013-04-29 08:33:00

回答

3

你如何继续使用只能批量生长的矩阵/矢量,而不是逐个生成。这具有预分配和动态扩展数组的灵活性的好处。这里有两个感兴趣的帖子:

此外,它看起来就像你正在实现一个region growing算法。这里是FEX上的a submission,它使用这种完全相同的生长矩阵技术。

+0

是的,[FEX提交](http://www.mathworks.com/matlabcentral/fileexchange/19084-region-growing)完全符合我的要求,谢谢! – ValarDohaeris 2013-04-29 08:28:34

3

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

您认为如何?

+0

这是解决方案的一半,'mask'允许检查一个像素是否已经被考虑,但是我还需要在列表中找到所有最高值的像素。 – ValarDohaeris 2013-04-29 08:27:45

+0

然后就是:'max(image(mask))' – Oleg 2013-04-29 16:24:22