Короткое решение в K& R C, мог быть скомпилирован:
main(){main()}
14 байтов
Если у вас есть Панель инструментов обработки изображений , вы можете использовать функцию IMREGIONALMAX :
BW = imregionalmax(y);
Переменная 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
В качестве альтернативы, вы можете использовать nlfilter и указать свою собственную функцию, которая будет применяться к каждому соседству.
Это «найти строгий максимум» функция просто проверит, является ли центр окрестности строго большим, чем все другие элементы в этой окрестности, который для этой цели всегда равен 3x3. Следовательно:
I = imread('tire.tif');
BW = nlfilter(I, [3 3], @(x) all(x(5) > x([1:4 6:9])) );
imshow(BW)