21

MATLAB に画像があります。

y = rgb2gray(imread('some_image_file.jpg'));

そして、私はそれにいくつかの処理をしたい:

pic = some_processing(y);

出力の極大値を見つけます。つまり、その中のすべてのポイントは、すべてのy隣接ポイントよりも大きくなります。

それをうまく行うためのMATLAB関数が見つからないようです。私が思いつくことができる最高のものは次のとおりです。

[dim_y,dim_x]=size(pic);
enlarged_pic=[zeros(1,dim_x+2);
              zeros(dim_y,1),pic,zeros(dim_y,1);
              zeros(1,dim_x+2)];

% now build a 3D array
% each plane will be the enlarged picture
% moved up,down,left or right,
% to all the diagonals, or not at all

[en_dim_y,en_dim_x]=size(enlarged_pic);

three_d(:,:,1)=enlarged_pic;
three_d(:,:,2)=[enlarged_pic(2:end,:);zeros(1,en_dim_x)];
three_d(:,:,3)=[zeros(1,en_dim_x);enlarged_pic(1:end-1,:)];
three_d(:,:,4)=[zeros(en_dim_y,1),enlarged_pic(:,1:end-1)];
three_d(:,:,5)=[enlarged_pic(:,2:end),zeros(en_dim_y,1)];
three_d(:,:,6)=[pic,zeros(dim_y,2);zeros(2,en_dim_x)];
three_d(:,:,7)=[zeros(2,en_dim_x);pic,zeros(dim_y,2)];
three_d(:,:,8)=[zeros(dim_y,2),pic;zeros(2,en_dim_x)];
three_d(:,:,9)=[zeros(2,en_dim_x);zeros(dim_y,2),pic];

そして、3 番目の次元に沿った最大値が 1 番目のレイヤー (つまり: three_d(:,:,1))に表示されるかどうかを確認します。

(max_val, max_i) = max(three_d, 3);
result = find(max_i == 1);

これを行うためのよりエレガントな方法はありますか?これはちょっとしたコツのようです。

4

5 に答える 5

37
bw = pic > imdilate(pic, [1 1 1; 1 0 1; 1 1 1]);
于 2009-12-06T21:28:59.083 に答える
18

Image Processing Toolboxがある場合は、 IMREGIONALMAX関数を使用できます。

BW = imregionalmax(y);

変数は、極大値を示す 1 とそうでない場合は 0 とBW同じサイズの論理行列になります。y

注:ご指摘のとおり、 IMREGIONALMAX は、隣接する最大値以上の最大値を見つけます。同じ値を持つ隣接する最大値を除外する (つまり、単一ピクセルの最大値を見つける) 場合は、BWCONNCOMP関数を使用できます。BW以下は、単一のピクセルのみを残して、隣接するポイントを削除する必要があります。

CC = bwconncomp(BW);
for i = 1:CC.NumObjects,
  index = CC.PixelIdxList{i};
  if (numel(index) > 1),
    BW(index) = false;
  end
end
于 2009-12-06T19:00:23.083 に答える
11

または、 nlfilterを使用して、各近傍に適用される独自の関数を提供することもできます。

この「厳密な最大値を見つける」関数は、近傍の中心がその近傍の他のすべての要素よりも厳密に大きいかどうかを単純にチェックします。これは、この目的では常に 3x3 です。したがって:

I = imread('tire.tif');
BW = nlfilter(I, [3 3], @(x) all(x(5) > x([1:4 6:9])) );
imshow(BW)
于 2009-12-06T21:18:35.790 に答える
2

または、優れたものを使用してください:extrema2.m

于 2009-12-08T17:19:19.753 に答える