# nonMaxSupr

## PURPOSE Applies nonmaximal suppression on an image of arbitrary dimension.

## SYNOPSIS function [subs,vals] = nonMaxSupr( I, radii, thresh, maxn )

## DESCRIPTION ``` Applies nonmaximal suppression on an image of arbitrary dimension.

nonMaxSupr( I, ... ) returns the pixel location and values of local
maximums - that is a location is returned only if it has a value greater
then or equal to all pixels in the surrounding window of size radii. I
can be smoothed first to make method more robust. The first output is an
array of the subscript locations of maximal values in I and the second
output contains the corresponding maximal values.  One can convert
subs/vals back to an array representation using subsToArray. Note that
values are suppressed iff there are strictly greater values in the
neighborhood.  Hences nonMaxSupr(ones(10),5) would not suppress any
values. See also Example 3 for a trick for making nonMaxSupr fast (but
possibly innacurate) for large radii (for n small).

USAGE
[subs,vals] = nonMaxSupr( I, radii, [thresh], [maxn] )

INPUTS
I       - matrix to apply nonMaxSupr to
thresh  - [] minimum value below which not to look for maxes
maxn:   -  return at most maxn of the largest vals

OUTPUTS
subs    - subscripts of non-suppressed point locations (n x d)
vals    - values at non-suppressed point locations (n x 1)

EXAMPLE - 1
G = filterGauss( [25 25], [13,13], 3*eye(2), 1 );
siz=[11 11]; G = filterGauss( siz, (siz+1)/2, eye(2), 1 );
[subs,vals] = nonMaxSupr( G, 1, eps );
figure(2); im( subsToArray( subs, vals, siz ) );
[subs,vals] = nonMaxSuprList( ind2sub2(siz,(1:prod(siz))'), G(:)',1 );
figure(3); im( subsToArray( subs, vals, siz ) );

EXAMPLE - 2
siz=[30 30]; I=ones(siz); I(22,23)=I(22,23)+3;
I(12,23)=I(12,23)+5; I(7,1)=I(7,1)-.5; figure(1); im(I);
r=3; suprEq = 1; maxn=[]; thresh=eps;
[subs,vals] = nonMaxSupr(I,r,thresh,maxn);
figure(2); im( subsToArray( subs, vals, siz ) );
[subs,vals] = nonMaxSuprWin(subs,vals,[1 1]+6,siz-6);
figure(3); im( subsToArray( subs, vals, siz ) );
[subs2,vals2] = nonMaxSuprList( ind2sub2(siz,(1:prod(siz))'), ...
I(:)',r,thresh,maxn,suprEq );
figure(4); im( subsToArray( subs2, vals2, siz ) );

EXAMPLE - 3
I=abs(randn(1000)*50); I=I/max(I(:));
figure(1); clf; im(I); hold on; radii=[50 50];
tic, [subs1,vals1]=nonMaxSupr(I,[1 1],.1); toc