Quick tip: Determining uniqueness of local maximum
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
댓글
댓글을 남기려면 링크 를 클릭하여 MathWorks 계정에 로그인하거나 계정을 새로 만드십시오.