Please explain as to what happens to an image when we use histeq
function in MATLAB? A mathematical explanation would be really helpful.
-
2Surely this Wikipedia article](http://en.wikipedia.org/wiki/Histogram_equalization) would tell you all you need to know about histogram equalisation (by MATLAB or anything else). – Roger Rowland Jun 07 '14 at 07:03
-
@user3699876 - So did my answer help you? It's been a while, and I saw that you were last online yesterday. An accept from you would be nice... especially noting the quality of my answer. – rayryeng Jun 23 '15 at 14:25
-
Yups and Thanks!!. 1 year ago,I was a novice in image processing.Got really upset with -5 upvotes. Anyways, I have a good understanding now especially after taking the Coursera course. – Anshuman Jun 23 '15 at 19:43
-
@Anshuman If this answer helped you a year ago, please consider accepting the answer. – rayryeng Sep 29 '16 at 18:40
1 Answers
Histogram equalization seeks to flatten your image histogram. Basically, it models the image as a probability density function (or in simpler terms, a histogram where you normalize each entry by the total number of pixels in the image) and tries to ensure that the probability for a pixel to take on a particular intensity is equiprobable (with equal probability).
The premise behind histogram equalization is for images that have poor contrast. Images that look like they're too dark, or if they're too washed out, or if they're too bright are good candidates for you to apply histogram equalization. If you plot the histogram, the spread of the pixels is limited to a very narrow range. By doing histogram equalization, the histogram will thus flatten and give you a better contrast image. The effect of this with the histogram is that it stretches the dynamic range of your histogram.
In terms of the mathematical definition, I won't bore you with the details and I would love to have some LaTeX to do it here, but it isn't supported. As such, I defer you to this link that explains it in more detail: http://www.math.uci.edu/icamp/courses/math77c/demos/hist_eq.pdf
However, the final equation that you get for performing histogram equalization is essentially a 1-to-1 mapping. For each pixel in your image, you extract its intensity, then run it through this function. It then gives you an output intensity to be placed in your output image.
Supposing that p_i
is the probability that you would encounter a pixel with intensity i
in your image (take the histogram bin count for pixel intensity i
and divide by the total number of pixels in your image). Given that you have L
intensities in your image, the output intensity at this location given the intensity of i
is dictated as:
g_i = floor( (L-1) * sum_{n=0}^{i} p_i )
You add up all of the probabilities from pixel intensity 0, then 1, then 2, all the way up to intensity i
. This is familiarly known as the Cumulative Distribution Function.
MATLAB essentially performs histogram equalization using this approach. However, if you want to implement this yourself, it's actually pretty simple. Assume that you have an input image im
that is of an unsigned 8-bit integer type.
function [out] = hist_eq(im, L)
if (~exist(L, 'var'))
L = 256;
end
h = imhist(im) / numel(im);
cdf = cumsum(h);
out = (L-1)*cdf(double(im)+1);
out = uint8(out);
This function takes in an image that is assumed to be unsigned 8-bit integer. You can optionally specify the number of levels for the output. Usually, L = 256
for an 8-bit image and so if you omit the second parameter, L
would be assumed as such. The first line computes the probabilities. The next line computes the Cumulative Distribution Function (CDF). The next two lines after compute input/output using histogram equalization, and then convert back to unsigned 8-bit integer. Note that the uint8
casting implicitly performs the floor operation for us. You'll need to take note that we have to add an offset of 1 when accessing the CDF. The reason why is because MATLAB starts indexing at 1, while the intensities in your image start at 0.
The MATLAB command histeq
pretty much does the same thing, except that if you call histeq(im)
, it assumes that you have 32 intensities in your image. Therefore, you can override the histeq
function by specifying an additional parameter that specifies how many intensity values are seen in the image just like what we did above. As such, you would do histeq(im, 256);
. Calling this in MATLAB, and using the function I wrote above should give you identical results.
As a bit of an exercise, let's use an image that is part of the MATLAB distribution called pout.tif
. Let's also show its histogram.
im = imread('pout.tif');
figure;
subplot(2,1,1);
imshow(im);
subplot(2,1,2);
imhist(im);
As you can see, the image has poor contrast because most of the intensity values fit in a narrow range. Histogram equalization will flatten the image and thus increase the contrast of the image. As such, try doing this:
out = histeq(im, 256); %//or you can use my function: out = hist_eq(im);
figure;
subplot(2,1,1);
imshow(out);
subplot(2,1,2);
imhist(out);
This is what we get:
As you can see the contrast is better. Darker pixels tend to move towards the darker end, while lighter pixels get pushed towards the lighter end. Successful result I think! Bear in mind that not all images will give you a good result when you try and do histogram equalization. Image processing is mostly a trial and error thing, and so you put a mishmash of different techniques together until you get a good result.
This should hopefully get you started. Good luck!

- 102,964
- 22
- 184
- 193
-
can histogram equalization be modified so that it works only on the non-null pixels? – Naseer Feb 21 '16 at 22:05
-
i tried to make a piece of code that makes histogram equalization, but the results are different from the built in function in matlab. Any suggestions why is this happening? – Fadwa Jul 23 '16 at 22:08
-
@Misaki I can't really comment unless I see your code and results. Please open up a new question. – rayryeng Jul 23 '16 at 22:16
-
@rayryeng I asked a question here please take a look. http://stackoverflow.com/questions/38546890/histogram-equalization-results – Fadwa Jul 23 '16 at 22:18