File Exchange

image thumbnail

Local Adaptive Thresholding

version (144 KB) by Guanglei Xiong
Threshold with local statistics, such as mean or median.


Updated 31 Mar 2016

View License

ADAPTIVETHRESHOLD An adaptive thresholding algorithm that seperates the foreground from the background with nonuniform illumination.
bw=adaptivethreshold(IM,ws,C) outputs a binary image bw with the local threshold mean-C or median-C to the image IM.
ws is the local window size.

tm is 0 or 1, a switch between mean and median. tm=0 mean(default); tm=1 median.

Contributed by Guanglei Xiong ( at Tsinghua University, Beijing, China.

For more information, please see

Cite As

Guanglei Xiong (2021). Local Adaptive Thresholding (, MATLAB Central File Exchange. Retrieved .

Comments and Ratings (43)

azima ariff


This function doesn't work at all... original image subtracted from filtered image

saud malik

Cheng Ning

nice and simple

Ely Raz

I compared Local Adaptive Thresholding from Matlab File Exchange ( ) vs. the adaptthresh function (Matlab built in function) and I get different outputs. Are these two functions similar and can be compered? The adpt1 is my desired output and can I achieve the same using adaptthresh?


I = imread('rice.png');

val= adaptthresh(I, 0.01);
adpt2 = imbinarize(I,val);

imshowpair(adpt1, adpt2, 'montage');

andhavarapu lokesh

sairam to all members
if any one has the Adaptive Thresholding for Edge Detection in
Gray Scale Images code can please provid to me

David Fernández

So good do far

Ruchir Srivastava

@Yasha Jain, for me, ignoring C and following @2one's suggestion (on 3rd July 2014) worked. You can try as well.

Aurik Sarker

Yasha Jain

How do we decide the value of C

What is that ws(wnidow size)??

Andraz Skoda

sanjay bhattacharya wrote:

''I have written a code without using any std functions like imfilter etc, its purely based on fundamentals.


sanjay bhattacharya, this is exactly what I need. Is there any chance to show me hot your code looks like? Offcourse anyone else can help.



Thank you!


For others, it appears that C (=constant) was originally the binary image segmentation threshold.

I have modified my version of the code as follows:





This now uses the adaptive (mean) filter to highlight image features (i.e. mIM-IM) and then the Otsu threshold to segment and generate a binary image.


this works quite well for my application but can anyone explain to me what the algorithm is doing exactly?
I understand that the algorithm generates a local mean filtered image by iterating over each pixel for user window size but what is line:


this subtracts the original image and a constant, C, from the local mean filtered image. What is C and why do this?

Kang Zheng

What is C exactly?

Hokchhay Tann

Great code, but not applicable to my type of images. I'm trying to make the threshold automated since I have a hundred thousands of this kind. I appreciate any suggestions.


I did apply this algorithm on my images but it didn't work out completely. There is a research paper by Q.Huang which speaks about Otsu's thresholding using adaptive window. I would like to know if somebody has implemented that.

Rosidah Lazid

Had anyone here used this code for processing trabecular micro CT images? Appreciate your feedback on the outcome. Thanks.


Very simple and effective, thanks!

Nek Valous

Great script!

Ana Triana

Easy to read and use. Thank you.

Jorge Lewinnek

what is that window size?


Navneet Viswan

is it possible to detect laser traces on an object using this algorithm?

Hans Müller


How about sharing it, then?

sanjay bhattacharya

it can detect the letters even where its very dark (see the lines in the end) line 8 etc

sanjay bhattacharya

I have written a code without using any std functions like imfilter etc, its purely based on fundamentals.


sanjay bhattacharya

Nice code, but not applicable in extreme situations.

hafid rafi

it's very very simple thanks

Guillermo Moreno

Simple and Fast, thanks

alev soke

thank you very much.
it is a perfect program.

zhang shi jie

really nice

ranjeeth dasineni

works great man!!

kayalvizhi lakshmanan

saravanan radhakrishnan

really good code

mel tem

thank you

amit vishnipolsky

saravanan kumar

nice work

Piyorot Khongchuay


Alan Zhang

The 2 lines near the end should be changed from:
This change allows C to be +ve and negative. In the old code bw=im2bw(sIM,C) causes error when C is -ve.

tester Mc tester

it didnt work!!
i get
Error using ==> mat2gray
A must be double

J. Zhou

Pretty cool results with flexible options.
Great job!

MATLAB Release Compatibility
Created with R14SP2
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!