문제

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 차원을 따르는 최대 값이 첫 번째 레이어에 나타나는지 확인하십시오 (즉, 즉 : 즉. three_d(:,:,1)):

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

더 우아한 방법이 있습니까? 이것은 약간의 kludge처럼 보입니다.

도움이 되었습니까?

해결책

bw = pic > imdilate(pic, [1 1 1; 1 0 1; 1 1 1]);

다른 팁

당신이 있다면 이미지 처리 도구 상자, 당신은 그것을 사용할 수 있습니다 imgrionalmax 기능:

BW = imregionalmax(y);

변수 BW 같은 크기의 논리적 매트릭스가됩니다 y 로컬 Maxima와 0을 나타내는 것들.

노트: 지적한 바와 같이, Imregionalmax는 또는 동일합니다 그들의 이웃. 동일한 값으로 이웃 Maxima를 제외하려면 (즉, 단일 픽셀 인 Maxima를 찾습니다) BWCONNCOMP 기능. 다음은 포인트를 제거해야합니다 BW 이웃이 있는데, 단일 픽셀 만 남습니다.

CC = bwconncomp(BW);
for i = 1:CC.NumObjects,
  index = CC.PixelIdxList{i};
  if (numel(index) > 1),
    BW(index) = false;
  end
end

또는 사용할 수 있습니다 nlfilter 각 지역에 적용 할 자신의 기능을 제공하십시오.

이것 "엄격한 맥스 찾기" 기능은 단순히 동네의 중심이 해당 동네의 다른 모든 요소보다 엄격하게 더 큰지 확인합니다.이 목적은 항상 3x3입니다. 그러므로:

I = imread('tire.tif');
BW = nlfilter(I, [3 3], @(x) all(x(5) > x([1:4 6:9])) );
imshow(BW)

또는 우수한 것을 사용하십시오. Extrema2.m

에 추가 imdilate, 이미지 처리 도구 상자에있는 경우 ordfilt2.

ordfilt2 지역 동네에서 값을 정렬하고 N-th 값을 선택합니다. (Mathworks 예 최대 필터를 구현하는 방법을 보여줍니다.) 3x3 피크 파인더를 구현할 수도 있습니다. ordfilt2 다음 논리로 :

  1. 3x3 도메인을 정의하십시오 중앙 픽셀은 포함되지 않습니다 (8 픽셀).

    >> mask = ones(3); mask(5) = 0 % 3x3 max
    mask =
         1     1     1
         1     0     1
         1     1     1
    
  2. 가장 큰 (8 번째) 값을 선택하십시오 ordfilt2.

    >> B = ordfilt2(A,8,mask)
    B =
         3     3     3     3     3     4     4     4
         3     5     5     5     4     4     4     4
         3     5     3     5     4     4     4     4
         3     5     5     5     4     6     6     6
         3     3     3     3     4     6     4     6
         1     1     1     1     4     6     6     6
    
  3. 이 출력을 각 이웃의 중심 값과 비교하십시오 (그냥 A):

    >> peaks = A > B
    peaks =
         0     0     0     0     0     0     0     0
         0     0     0     0     0     0     0     0
         0     0     1     0     0     0     0     0
         0     0     0     0     0     0     0     0
         0     0     0     0     0     0     1     0
         0     0     0     0     0     0     0     0
    
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top