File Exchange

image thumbnail

Bradley local image thresholding

version (207 KB) by Jan Motl
A fast an well performing local image thresholding method.


Updated 19 Apr 2015

View Version History

View License

The brief idea of the algorithm is that every image's pixel is set to black if its brightness is T percent lower than the average brightness of the surrounding pixels in the window of the specified size, otherwise it is set to white. The detail description of the algorithm is available at:
Derek Bradley, Gerhard Roth (2005). Adaptive Thresholding Using the Integral Image. Retrieved from
The advantage of this method is that the binarized images are subjectively almost as good as from Sauvola's method but the calculation is two times faster than Sauvola's method. Sauvola’s method calculates local mean and local variance, while Bradley’s method calculates just local mean. And because the variance can be calculated using following formula for variance:

Var(X) = E(X^2) – [E(X)]^2,

the calculation of variance reuses the result from the calculation of the local mean (E(X))^2 and just calculates E(X^2). And that takes the same amount of time as calculation of the local mean. Since calculation of local mean and variance is the most time consuming operation performed by these two methods, Bradley’s method is effectively two times faster than Sauvola’s method. A brief comparison of Bradley’s and Sauvola’s method is available at a blog:

Altun Nazmi (2010). Adaptive (Local) Thresholding For AForge.NET. Retrieved from

The calculation of the local mean is performed with integral image method in constant time regardless of the kernel size.

Examples of real word applications are: bar-code scanners, license plate registration.

Cite As

Jan Motl (2021). Bradley local image thresholding (, MATLAB Central File Exchange. Retrieved .

Comments and Ratings (15)

Ali razi

Hi, Is this method similar and results the same as Matlab adaptthresh function?

Jan Motl

@Henry Kricancic: While I did not follow the article, the algorithm is exactly the same.

@Tolentee: Only 2Dmatrices in uint8 are supported. If you load a jpg file with IMREAD command then you get a 3D uint8 matrix (even if the image is grayscale). Hence you have to first perform conversion into a 2D image, for example with RGB2GRAY.


Great job! Thank you for sharing all your thresholding scripts.

Max Fedorchuck

Thanks for sharing!


Does the code apply to 3D images??



Thank you so much!
All your set of adaptive thresholding scripts is amazing.
Great work. It's very appreciated.

Henry Kricancic

Hi Jan, is this function based on this paper -- "Adaptive thresholding using the integral image" from 2007 by Bradley and Roth?



Jan Motl

Hi, Gunshi. You are right. I fixed the code. And thanks for letting me know!

gunshi gupta

gunshi gupta

Hi, this code is really useful, along with all the other binarisation methods!
I just had one doubt though, in the bradley default parameters, which is supposed to be 3 in length, the list is as follows:
optargs={[15 15] 10 0 'replicate'}
this seems like its of length four to me, am i missing something?
or is the T value supposed to be a list as such [10,0]?

Michael scheinfeild

excellent code help binarize image


Jan Motl

You can try to increase the size of the sliding window. Don't be afraid to increase the windows size to hundreds to hundreds pixels - the window should be bigger than the biggest symbol in the image.

Or you can try the post-processing step from Yanowitz and Bruckstein's binarization method:

Basically it looks at the edge of each foreground object. And if the average gradient along the edge is small, it concludes that it's false foreground object and deletes the object.

Max Neudecker

This method works quite well for binarizing my samples!
Note: I found that, depending on the grayvalue variations, a lot of background pixels are wrongly segmented as foreground. However, masking with another binary image, binarized e.g. with Otsu's threshold (function graythresh), remedied this.

MATLAB Release Compatibility
Created with R13
Compatible with any release
Platform Compatibility
Windows macOS Linux

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!