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

1つずつではなく、バッチでのみ成長するマトリックス/ベクトルを使用し続けるのはどうですか. これには、事前割り当ての利点と、配列を動的に拡張する柔軟性があります。興味のある2つの投稿を次に示します。

また、領域成長アルゴリズムを実装しているようです。これは、マトリックスを成長させるのとまったく同じ手法を使用する FEX に関する提出物です。

于 2013-04-27T14:41:29.727 に答える
3

アプローチを再考する必要があると思います。サイズの変更を保持するリストを維持する代わりに (非常にマトラビッシュなデザインではありません)、ピクセルごとにマスクを保持しないのはなぜですか? ゼロから始めmaskたときと同じサイズになります。I次に、ピクセルがリストに挿入されるとマスクが 1 に変更され、リストを離れると値が -1 に変更されます。などを使用して、リスト内の最大ピクセル数を見つけることができますmax( I( mask == 1 ) )
この方法では、マスクの値のみを変更し、サイズと割り当ては変更しません。

どう思いますか?

于 2013-04-27T18:31:24.167 に答える