A MATLAB user asked me how to determine which image pixels had local maxima that weren't unique. My answer involves a creative use of ordfilt2.
Let's review first the concept of a local maximum filter. This image operator replaces every pixel value with the maximum pixel value found in a neighborhood surrounding the pixel. For example:
a = magic(5)
a =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
What should the output be for a local maximum filter using 3-by-3 neighborhoods? The output in the 3rd row, 2nd column would be the maximum value found in this submatrix:
neighborhood = a(2:4, 1:3)
neighborhood =
23 5 7
4 6 13
10 12 19
The (3,2) output is 23:
max(neighborhood(:))
ans =
23
Local maximum filtering is the same as morphological dilation, so I usually use imdilate to compute the result for the entire image:
b = imdilate(a, ones(3,3))
b =
24 24 24 16 16
24 24 24 22 22
23 23 21 22 22
18 25 25 25 22
18 25 25 25 21
That's the background; now back to the original question. How do you determine which pixels have multiple maxima in their neighborhoods?
I suggest using ordfilt2 twice. This function is for ''two-dimensional order-statistic filtering.'' This operation replaces every pixel value with the n-th sorted pixel value in its neighborhood. It uses an ascending sort order, so if n is the number of pixels in the neighborhood, the operation is exactly equivalent to the local maximum filter.
The specific procedure is:
1. Call ordfilt2 to get the highest pixel values in each neighborhood.
2. Call ordfilt2 again to get the second-highest pixel values in each neighborhood.
3. Determine where the outputs of steps 1 and 2 are equal. Wherever they are equal, the local maximum is not unique.
Let's try an example. First, modify our original matrix a bit:
ap = a; ap(3,4) = 22
ap =
17 24 1 8 15
23 5 7 14 16
4 6 13 22 22
10 12 19 21 3
11 18 25 2 9
Get the highest pixel values in each 3-by-3 neighborhood:
highest = ordfilt2(ap, 9, ones(3,3))
highest =
24 24 24 16 16
24 24 24 22 22
23 23 22 22 22
18 25 25 25 22
18 25 25 25 21
Get the second-highest pixel values:
second_highest = ordfilt2(ap, 8, ones(3,3))
second_highest =
23 23 14 15 15
23 23 22 22 22
12 19 21 22 22
12 19 22 22 22
12 19 21 21 9
Determine where the highest and second highest pixel values are equal:
non_unique_maxima_mask = (highest == second_highest)
non_unique_maxima_mask =
0 0 0 0 0
0 0 0 1 1
0 0 0 1 1
0 0 0 0 1
0 0 0 0 0
Get
the MATLAB code
Published with MATLAB® 7.2

Mark - see the blog policies post.
“““““““““““““““““““““““
(\(\
(._. )
(’)(’)_)~ thanks
Hi steve,I am new in matlab and need your help.I want to find (row,col) of local maximums in an image matrix within N*N window. what do you do suggest?
Amir—I can think of multiple ways to interpret your question. Depending on what you really mean, you might find either the function imregionalmax or imdilate to be useful.
Thanks a lot Steve.It was very helpful.