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