Introduction
Sometimes, we have some vague gray photos that are not clear. This can be fixed. In the image processing field, it's called histogram equalization. It is important that it can expand the histogram of the image. Then, your photos will be clear.
Background
Equipment Operation System: Microsoft Windows 7 Professional (64 bit) Development Utility: Microsoft Visual Studio 2010
Using the Code
double aryHistogram[256] = {0};
double aryTransform[256] = {0};
double dobSumI = 0.0f;
int iJ = 0;
int iK = 0;
memset ( aryHistogram, 0x00, 256 * sizeof( double ) );
for ( int iY = 0; iY < imageA->DibInfo->bmiHeader.biHeight; iY++ )
{
for ( int iX = 0; iX < imageA->DibInfo->bmiHeader.biWidth; iX++ )
{
lIDXA = ( iX * 3 ) + ( iY * imageA->DibInfo->bmiHeader.biWidth * 3 );
byteRGB_BA = imageA->DibArry[lIDXA+0];
byteRGB_GA = imageA->DibArry[lIDXA+1];
byteRGB_RA = imageA->DibArry[lIDXA+2];
byteYUV = ( 0.299 * byteRGB_RA + 0.587 * byteRGB_GA + 0.114 * byteRGB_BA );
aryHistogram[INT(byteYUV)]++;
} } memset ( aryTransform, 0x00, 256 * sizeof( double ) );
for ( iJ = 0; iJ <= 255; iJ++ )
{
dobSumI = 0.0f;
for ( iK = 0; iK <= iJ; iK++ )
{
dobSumI = dobSumI + aryHistogram[iK];
aryTransform[iJ] = ( 255.0 * dobSumI /
( imageA->DibInfo->bmiHeader.biWidth * imageA->DibInfo->bmiHeader.biHeight ));
} } for ( int iY = 0; iY < imageA->DibInfo->bmiHeader.biHeight; iY++ )
{
for ( int iX = 0; iX < imageA->DibInfo->bmiHeader.biWidth; iX++ )
{
lIDXA = ( iX * 3 ) + ( iY * imageA->DibInfo->bmiHeader.biWidth * 3 );
byteRGB_BA = imageA->DibArry[lIDXA+0];
byteRGB_GA = imageA->DibArry[lIDXA+1];
byteRGB_RA = imageA->DibArry[lIDXA+2];
imageB->DibArry[lIDXA+0] = aryTransform[INT(byteRGB_BA)];
imageB->DibArry[lIDXA+1] = aryTransform[INT(byteRGB_BA)];
imageB->DibArry[lIDXA+2] = aryTransform[INT(byteRGB_BA)];
} }
Exception
- There is a notice, if your bit depth of bitmap file is not 24 bits, you should change your bitmap files to adapt this program, or you could rewrite this source code to fit your bitmap format.
- You have to install Microsoft SDK v7.1, because I include windowscodes.lib.
#pragma comment(lib, "windowscodecs.lib")
Reference
- [1] Gary Bradski and Adrian Kaehler, “Learning OpenCV: Computer Vision with the OpenCV Library,” O’REILLY, September 2008, ISBN:978-0-596-51613-0
Acknowledgement
- Thank you (Microsoft Visual Studio 2010, Lenna Sjööblom) very much for this great development utility and beautiful photo.