2013-04-11 22 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