For every pixel, based on the neighbor hood value the histogram equalization is done. Here I used 3 by 3 window matrix for explanation. By changing the window matrix size, the histogram equalization can be enhanced. By changing the values of M and N the window size can be changed in the code given below.
MATLAB CODE:
A=imread('tire.tif');
figure,imshow(A);
Img=A;
%WINDOW SIZE
M=10;
N=20;
mid_val=round((M*N)/2);
%FIND THE NUMBER OF ROWS AND COLUMNS TO BE PADDED WITH ZERO
in=0;
for i=1:M
for j=1:N
in=in+1;
if(in==mid_val)
PadM=i-1;
PadN=j-1;
break;
end
end
end
%PADDING THE IMAGE WITH ZERO ON ALL SIDES
B=padarray(A,[PadM,PadN]);
for i= 1:size(B,1)-((PadM*2)+1)
for j=1:size(B,2)-((PadN*2)+1)
cdf=zeros(256,1);
inc=1;
for x=1:M
for y=1:N
%FIND THE MIDDLE ELEMENT IN THE WINDOW
if(inc==mid_val)
ele=B(i+x-1,j+y-1)+1;
end
pos=B(i+x-1,j+y-1)+1;
cdf(pos)=cdf(pos)+1;
inc=inc+1;
end
end
%COMPUTE THE CDF FOR THE VALUES IN THE WINDOW
for l=2:256
cdf(l)=cdf(l)+cdf(l-1);
end
Img(i,j)=round(cdf(ele)/(M*N)*255);
end
end
figure,imshow(Img);
figure,
subplot(2,1,1);title('Before Local Histogram Equalization'); imhist(A);
subplot(2,1,2);title('After Local Histogram Equalization'); imhist(Img);
![]() |
After Local Histogram Equalization |
http://angeljohnsy.blogspot.com/2011/04/matlab-code-histogram-equalization.html
13 comments:
How can this code be modified to perhaps have a window of 7x7
How can this code be modified to have another "window" other than 3x3?
@Anonymous
I have modified the code so that you can change the window size of your convenience.
@Aaron Angel
if i have an image of size 112X92 and i want to apply histogram based image processing what appropriate size of window should i give??
if i have an image of size 112X92 an i want to apply histogram based image processing
what appropriate window size should i give?
@rushabh
Use a large window with mxn values in odd number.
SALAM...can anyone plz help me on MATLAB Code: Global Histogram Equalization on this page..i too need it..plz help me as early as u can..lotttt of thanxxx
@kumail abbas
Check this link
http://angeljohnsy.blogspot.com/2011/04/matlab-code-histogram-equalization.html
how can this code be extended to oriented local histogram equalisation
sir,
please help me
i m providing you some data
OLHE is similar to local histogram
equalization (LHE), but it captures the orientation of edges
while LHE does not. We begin with a brief review on LHE. For
each pixel on an image, we perform the histogram equalization
on the local w -by- h window centering on this pixel using
f ( x ) = (round(cd f ( x )) − min(cd f))*(L-1)/(w · h − cd f)
min
where x is the pixel intensity value, cd f ( x ) is the cumulative
distribution function of the histogram of the pixel intensities in
the w -by- h window, cd f
min is the minimum intensity in this
window, andL is the desired number of output gray levels.
Typically a square window is used, and we definek ≡ w = h .
We call the center of the k -by- k window the anchor . For LHE,
the anchor point is the pixel to be processed itself. For thewhole image, each pixel repeats the above operation and uses
f ( x ) to get its new intensity value. Fig. 1 illustrates LHE.
We define the generalized LHE operator as
L
ξ,η
k
( I W ∗ H
) = I
W ∗ H
(2)
where ξ,η is the relative position of the anchor point to
the pixel to be processed, I W ∗ H
is the input image whose
dimension is W -by- H ,andI
W ∗ H
is the histogram-equalized
image with the same dimension. The typical LHE which uses
the k -by- k local window can be denoted as L
0 , 0
k
, since the
anchor point is exactly the pixel to be processed itself.
If the pixel to be processed is brighter than all the neigh-boring pixels around it, it will have a large intensity value
after the local histogram equalization, and vice versa. We can
make LHE ‘oriented’ by changing anchor positions. Fig. 2
shows nine LHE operators using 3-by-3 windows. The eight
operators with { ξ,η } other than{ 0 , 0 } are ‘oriented’, and they
are dubbed as the Oriented Local Histogram Equalization
operators (OLHE operators) in this paper. The following
gives the formal definition of the OLHE operators:
O
k
≡ L
(
( k − 1 )
2
,
− ( k − 1 )
2
)
k
, O
↓
k
≡ L
( 0 ,
− ( k − 1 )
2
)
k
,
O
k
≡ L
(
− ( k − 1 )
2
,
− ( k − 1 )
2
)
k
, O
−→
k
≡ L
(
( k − 1 )
2
, 0 )
k
,
O
←−
k
≡ L
(
− ( k − 1 )
2
, 0 )
k
, O
k
≡ L
(
( k − 1 )
2
,
( k − 1 )
2
)
k
,
O
↑
k
≡ L
( 0 ,
( k − 1 )
2
)
k
, O
k
≡ L
(
− ( k − 1 )
2
,
( k − 1 )
2
)
k
(3)
where k is an odd number. Note that according to our
definition, there will always be exactly eight OLHE opera-tors no matter what the value of k is. Given an image I ,
OLHE produces 8 images, which areO
k
( I ) , O
↓
k
( I ) , O
k
( I ) ,
O
−→
k
( I ) , O
k
( I ) , O
←−
k
( I ) O
↑
k
( I ) and O
k
( I ) . The 8 images
are referred to as the OLHE images.
hey can any one please help me with code for enhancement of an image of a finger because I have to extract the fingerprint from it but cant get past binzrization cz the change intensity of the pattern in image is very low so it just gives me a black screen please help.
Great job, but i have a question.
Why on i and j you used i= 1:size(B,1)-((PadM*2)+1) and j=1:size(B,2)-((PadN*2)+1) instead of use i= 1:size(B,1) and j=1:size(B,2), for the lest elements from the right can participate on the calculation of the probability of density?
Nice man. really good code.
How should one decide window size LocalHistogram Equalisation given a different input size image?
Enjoyed Reading? Share Your Views