как да намерите локални максимуми в изображението

Въпросът е относно концепцията за откриване на функции. Заседнал съм, след като намерих ъгъла на изображението, и искам да знам как да намеря характерната точка в изчислените ъгли.

Да предположим, че имам изображение в сива скала, което има данни като тези

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 чрез (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