Steve on Image Processing and MATLAB

Concepts, algorithms & MATLAB

Quick tip: Determining uniqueness of local maximum 15

Posted by Steve Eddins,

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

10 views (last 30 days)  | |

Comments

To leave a comment, please click here to sign in to your MathWorks Account or create a new one.