What is histogram , it is a frequency showing some information in image. Due to some factors based on the equipment or lighting or whatever it is possible sometimes taken image will contain colors that uses near by gray values. That is is the image's gray levels are not really stretched to required level.
See some images here
These are images taken on low light or artificially generated. if you examine this these uses intensities that are around near by spectrum.That is why our eye is not able to perceive the amount of detail we want to interpret. Histogram equalization is a very simple technique to stretch out this contrast by using a cumulative distributive function.
This CDF function is very simple, it means for the pixel with highest value it assigns a probability of 1, because it is cumulative That is for the brightest pixel value( say 255) it sums probabilities of all pixels from 0 to 255 and it must be 1 it will be (for other pixel values it sum ups probabilities up to that pixel's value). So our CDF function is a monotonically increasing function.
I am attaching the mathematica code and results. so i don't have to explain.
yimage = Import["f:\\imtests\\lowContrast1.jpg"];
grayImg = ColorConvert[myimage, "GrayScale"];
mydata = ImageData[grayImg, "byte"];
temp = ImageDimensions[grayImg];
width = temp[[1]];
height = temp[[2]];
numberOfPixels = width*height;
histo = Array[0 &, 256];
(* compute histogram *)
m = mydata[[2]][[138]];
For[ i = 1 , i <= height, i++,
For[ j = 1 , j <= width, j++,
m = mydata[[i]][[j]];
m = m + 1;
histo[[m]] ++;
];
];
(* create cummlative distributive function to map pixels *)
cdf = Array[0 &, 256];
For[ i = 1, i <= 256, i++,
sum = 0.0;
For[ j = 1, j <= i, j++,
sum = sum + histo[[j]] / numberOfPixels;
];
sum = sum * 255;
cdf[[i]] = sum;
];
(* plot cdf *)
ListLinePlot[cdf]
(* equalize histogram *)
orignalData = mydata;
(* change pixels in original image based on cdf function *)
For[ i = 1 , i <= height, i++,
For[ j = 1 , j <= width, j++,
m = mydata[[i]][[j]] + 1;
mydata[[i]][[j]] = cdf[[m]]
];
];
Image[orignalData, "byte"]
Image[mydata, "byte"]
Outputs
CDF function
Original image
Output image
See how good is the equalized image. but do not expect Histogram Equalization to perform this in all conditions. In general It is good for x-ray images. One other problem is it will also amplify the noise. So it better to remove the noise before passing to this.
3 comments:
I suggest to you to invest more time with Python and PIL which can help you to explain the algorithms better. Please format the code well.
GreŠ°t site you have got here.. It's difficult to find excellent writing like yours nowadays. I truly appreciate people like you! Take care!!
Here is my page just click for source
You really make it appear so easy with your presentation but
I to find this topic to be really one thing
that I feel I would never understand. It kind of feels too
complicated and very huge for me. I'm taking a look forward for
your subsequent post, I will try to get the hold of it!
Post a Comment