Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

New to MATLAB?

HISTEQ normalization range not clear

Asked by Jurgen

Jurgen (view profile)

on 18 Nov 2012

When I tried to equalize an image using histeq I got an unexpected result. The original has values in the range 0-199 and the output has a range of 153-255, I was hoping for more contrast. So I wrote a few lines of code myself, to see if I could reproduce the results. If I apply 'faulty' normalization to the cumulative histogram of the original I got similar, but not identical, results. Leading me to believe histeq.m does not normalize properly.

Or am I doing something wrong? Heres the code to reproduce it:

im = imread('pout','tif'); %or cameraman if you like
% get original histogram:
graycount = imhist(im);
% Calculate CDF & Normalize:
graymap   = cumsum(graycount)/sum(graycount);
graymap   = uint8(graymap*255/max(graymap));
% Apply CDF as LUT & Get new histogram:
imEQ      = graymap(im+1);
EQcount   = imhist(imEQ); 
% Same using histeq():
imhisteq  = histeq(im,256);
histeqcount = imhist(histeq(im,256));

Then test for equality with isequal and some figures:

if(~isequal(histeqcount,EQcount))
  disp('Histeq does something else!!')
end
figure;    
  subplot(1,2,1);stem(histeqcount);title('hist. Histeq im');
  subplot(1,2,2);stem(cumsum(histeqcount));title('cum. hist. Histeq im');
figure;    
  subplot(1,2,1);stem(EQcount);title('manual hist. EQ im');
  subplot(1,2,2);stem(cumsum(EQcount));title('manual cum. hist. EQ im');  
figure;
  hist(EQcount-histeqcount,100);title('Difference histeq and manual histograms')
figure;        subplot(2,2,1);imshow(histeq(im,256));subplot(2,2,3);imshow(vec2mat(histeqcount,20));       subplot(2,2,2);imshow(graymap(im+1));subplot(2,2,4);imshow(vec2mat(EQcount,20)) 

Very similar images, I think histeq normalized it differently but why? Also a better result is gotten if normalized CDF to 0-1:

graymap = cumsum(graycount)/sum(graycount); %raw CDF
% Using built-in functions:
graymap = im2uint8(mat2gray(graymap));
% Or explicitly:
graymap = uint8((graymap -min(graymap))*255/(max(graymap)-min(graymap)));

0 Comments

Jurgen

Jurgen (view profile)

Products

No products are associated with this question.

0 Answers

Contact us