как найти локальные максимумы на изображении

Вопрос касается концепции обнаружения признаков. Я застрял после того, как нашел угол изображения, и я хочу знать, как найти характерную точку в вычисленных углах.

Предположим, у меня есть изображение в градациях серого с такими данными

A = [ 1 1 1 1 1 1 1 1;
      1 3 3 3 1 1 4 1;
      1 3 5 3 1 4 4 4;
      1 3 3 3 1 4 4 4; 
      1 1 1 1 1 4 6 4;
      1 1 1 1 1 4 4 4]

если я использую

B = imregionalmax(A);

результат будет таким

B = [ 0 0 0 0 0 0 0 0;
      0 1 1 1 0 0 1 0;
      0 1 1 1 0 1 1 1;
      0 1 1 1 0 1 1 1;
      0 0 0 0 0 1 1 1;
      0 0 0 0 0 1 1 1]

Вопрос в том, как мне выбрать самый высокий пик внутри максимальной локальной области (в примере, как я выбрал 5 из 3 и 6 из 4)?

Моя идея заключалась в том, чтобы использовать B для обнаружения каждого региона и снова использовать imregionalmax(), но я не умею кодировать, и мне нужен совет или другие идеи.


person someone    schedule 06.03.2014    source источник


Ответы (2)


Есть еще несколько простых способов реализации 2D-искателя пиков: ordfilt2 или imdilate.

ordfilt2

Самый прямой метод — использовать ordfilt2, который сортирует значения в локальных окрестностях и выбирает n-е значение. (Пример MathWorks демонстрирует, как реализовать максимальный фильтр .) Вы также можете реализовать поиск пиков 3x3 с помощью ordfilt2 by, (1) используя домен 3x3, который не включает центральный пиксель, (2) выбирая наибольшее (8-е) значение и (3) по сравнению с центральным значением:

>> mask = ones(3); mask(5) = 0 % 3x3 max
mask =
     1     1     1
     1     0     1
     1     1     1

В этой маске учитываются 8 значений, поэтому 8-е значение является максимальным. Выход фильтра:

>> 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

Хитрость заключается в том, чтобы сравнить это с 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

imdilate

Расширение изображения обычно применяется к бинарным изображениям, но оттенки серого — это просто максимальный фильтр (см. раздел "Определения" imdilate документов). Здесь применяется тот же трюк, что и с ordfilt2: определите окрестность, которая не включает пиксель центральной окрестности, примените фильтр и сравните с нефильтрованным изображением:

B = imdilate(A, mask);
peaks = A > B;

ПРИМЕЧАНИЕ. Эти методы находят только пик одного пикселя. Если какие-либо соседи имеют одинаковое значение, это не будет пиком.

person chappjc    schedule 06.03.2014

Функция imregionalmax дает вам 8-связную область, содержащую максимум и его 8 соседей (т.е. области 3x3, которые вы видите). Затем вы можете использовать морфологические операции с тем же структурным элементом 3x3. чтобы проредить эти регионы до их центров. Например.

 B = imregionalmax(A);
 C = imerode(B, ones(3));

или эквивалентно

 B = imregionalmax(A);
 D =  bwmorph(B, 'erode');

В качестве альтернативы вы можете написать свою собственную функцию максимального нахождения, используя блочную обработку:

 fun = @(block) % your code working on 'block' goes here ...
 B = blockproc(A, ones(3), fun)

Но скорее всего это будет медленнее встроенных функций. (У меня сейчас нет набора инструментов, поэтому я не могу его попробовать.)

Также посмотрите здесь и здесь.

person mbschenkel    schedule 06.03.2014