www.pudn.com > yuzhishuanfa.zip > Histogram.cpp
// Histogram.cpp: implementation of the CHistogram class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "math.h"
#include "Image.h"
#include "Histogram.h"
#include "dibapi.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#include "ProgDlg.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CHistogram::CHistogram()
{
m_Array=NULL;
m_Length=256;
}
CHistogram::~CHistogram()
{
if(m_Array!=NULL)
delete m_Array;
}
//灰度图象直方图初始化
void CHistogram::GrayInitialize(BYTE FAR *pImage,
DWORD Width, DWORD Height)
{
// AfxMessageBox("灰度图象直方图初始化");
if(pImage==NULL) return;
m_Length=256;
m_Array=new DWORD[m_Length];
for(DWORD k=0;k255)Lumin=255;
m_Array[(BYTE)Lumin]++;
}
}
//1999-01-29,鲍捷,彩色图象区域的直方图
//从一数组初始化直方图
void CHistogram::InitializeIndirect(DWORD * Array, DWORD Length)
{
if(m_Array!=NULL) delete m_Array;
m_Length=Length;
m_Array=new DWORD[m_Length];
for(UINT i=0;i=0 ) //其前元素
{
coef+=weight;
NewArray[i] += int(m_Array[i-j] * weight+1);
}
}
//此时coef为总权重
NewArray[i]=DWORD( NewArray[i] / coef );
}
//更新原直方图
for( k=0 ; k < m_Length ; k++)
{
m_Array[k] = NewArray[k];
}
delete NewArray;
return TRUE;
}
//灰度图象直方图均衡化
BOOL CHistogram::GrayEqual(BYTE FAR * pImage,
DWORD Width,
DWORD Height
)
{
// AfxMessageBox("CHistogram::GrayEqual");
if(m_Array==NULL) return FALSE;
DWORD *NewArray=new DWORD[m_Length];
if(!NewArray) return FALSE;
//建立新直方图 m_Array[i]--映射->NewArray[i]
DWORD i,j;
NewArray[0]=0;
NewArray[1]=m_Array[1];
for(i=2;i255) NewArray[i]=255;
}
//更新原图
DWORD Color;
if(pImage!=NULL)
{
CProgressDlg dlg(0,Width,1);
for(i=0;i255)Color=255;
::SetGrayPixel(pImage,i,j,Width,Height,(BYTE)Color);
}
dlg.StepIt();
}
}
delete NewArray;
return TRUE;
}
//1999-01-29,鲍捷,灰度图象区域的均衡化
//1999.1.18 鲍捷,彩色图象均衡
BOOL CHistogram::Equal(HDC hImage,DWORD Width, DWORD Height)
{
if(hImage==NULL) return FALSE;
DWORD *NewArray=new DWORD[m_Length];
if(!NewArray) return FALSE;
//建立新直方图 m_Array[i]--映射->NewArray[i]
DWORD i,j;
NewArray[0]=0;
NewArray[1]=m_Array[1];
for(i=2;i255) NewArray[i]=255;
}
//更新原图
// WORD Lumin,NewLumin; //亮度
// int Percent;
COLORREF Color;
WORD R,G,B;
CProgressDlg dlg(0,Width,1);
for(i=0;i255)Lumin=255;
NewLumin=(WORD)NewArray[Lumin];
Percent=NewLumin*100/Lumin;
R+=(int)R*Percent/100;
G+=(int)G*Percent/100;
B+=(int)B*Percent/100;
if(R>255)R=255;if(R<0)R=0;
if(G>255)G=255;if(G<0)R=0;
if(B>255)B=255;if(B<0)R=0;
*/
R=(WORD)NewArray[R];G=(WORD)NewArray[G];B=(WORD)NewArray[B];
::SetPixelV(hImage,i,j, RGB(R,G,B) );
}
dlg.StepIt();
}
delete NewArray;
return TRUE;
}
//1999-01-29,鲍捷,彩色图象区域的均衡化
//1999-01-29,鲍捷,灰度图象区域的亮度变化
//1999-01-29,鲍捷,彩色图象区域的亮度变化
//1999-02-03,鲍捷,灰度拉伸 从Low--High到0--m_Length