Code covered by the BSD License

### Highlights fromFast 2D peak finder

5.0

5.0 | 3 ratings Rate this file 172 Downloads (last 30 days) File Size: 3.04 KB File ID: #37388

# Fast 2D peak finder

by natan

03 Jul 2012 (Updated 06 Jun 2013)

Find local maxima \ peak positions in noisy 2D arrays

File Information
Description

A simple and fast 2D peak finder. The aim was to be faster than more sophisticated techniques yet good enough to find peaks in noisy data to within 1 pixel accuracy. The code thresholds the data, median filters it, smooths it with a user defined filter, thresholds again, and looks for local maxima at relevant pixels. The code best works when using uint16 \ uint8 images, and assumes that peaks are relatively sparse. The code requires Matlab's Image Processing Toolbox. The code can be used inside parfor for faster processing times.

Required Products Image Processing Toolbox
MATLAB release MATLAB 7.13 (R2011b)
Tags for This File
Everyone's Tags
Tags I've Applied
08 May 2013

02 Apr 2013

Thanks. it works well.

01 Apr 2013

@Sujay, as the code documentation say in line 8: "The 2D data raw image - assumes a Double\Single-precision ... or unit16 array. Please note that the code casts the raw image to uint16, if your image is 8-bit depth, I recommend to change all the places that uint16 is used to uint8 for faster run times." So, either use FastPeakFind(uint16(image),...) or change all uint16 to uint8 in the code. In future updates I'll include this feature automatically.

27 Mar 2013

I have a 512x512 .tif image that I can read in matlab as, A=imread(''). I am trying to use this program as,
FastPeakFind(A). It is showing the following error:
??? Error using ==> times
Integers can only be combined with integers of the same
class, or scalar doubles.

Error in ==> FastPeakFind at 81
d=d.*uint16(d>threshold);

What is wrong?

23 Oct 2012

Great algorithm and pretty fast. Thanks !!!!

21 Aug 2012

@Carl Witthoft, Thanks for the comments, I've updated the information regarding the image processing toolbox requirement the scaling in case of a 0:1 range of image values. I've also already tested some more compact local maxima conditions, such as:
if all ( reshape( d(x(j),y(j)) >= d(x(j)-1:x(j)+1,y(j)-1:y(j)+1),9,1))

if d(x(j),y(j)) == max(max(d((x(j)-1):(x(j)+1),(y(j)-1):(y(j)+1))))

if d(x(j),y(j)) == max( reshape( d(x(j),y(j)) >= d(x(j)-1:x(j)+1,y(j)-1:y(j)+1),9,1))

All these were a factor of 2-3 slower than the simple 8-fold if condition. It takes Matlab more time to do the max or reshape functions than to go through the simple conditions...

Additionally, Matlab's image processing toolbox has the function imregionalmax, but I've found it is 6-7 times slower than this code.

13 Aug 2012

First commment lost.. try again. 1) Please specify that ImageProcessingToolbox is required. 2) For speed reasons, it may help to replace the 8-fold logical test with something like "d(j,j) > max(max(d(j-1:j+1,j-1:j+1))"

13 Aug 2012

One more thought: to allow for input files with float ranges (e.g. 0:1.0), replace the uint16 cast with "d = uint16( d.*2^16./(max(max(d))" or similar scaling function.

25 Jul 2012
09 Jul 2012

bug fixed, code now handles images of arbitrary size.

16 Jul 2012

Code runs faster by casting to appropriate numeric classes for medfilt2 and conv2

10 Aug 2012

minor editing, added functionality - when no input is used, the function generates random peaks data and plot a figure.

21 Aug 2012

Added scaling correction for the case pixel values are all between 0 and 1. Improved file documentation.

05 Feb 2013

Improved performance of saving to file and additional small improvements.

11 Feb 2013

corrected typos from previous release that prevented the function from running for no arguments (demo mode)

05 Mar 2013

bug fixes

09 May 2013

Added automatic uint8 support for improved performance. Added an output option of a binary matrix of peak positions besides the regular coordinate vector.

06 Jun 2013

the case binary matrix output when the image is all zeros returned an error (bug now fixed). Many thanks to Roman Voronov for spotting this.