www.pudn.com > spacial.rar > MyDib.cpp


#include "StdAfx.h" 
#include ".\mydib.h" 
#include"MyDib.h" 
#include "operator.h" 
CMyDib::CMyDib(void) 
: haarcount(0) 
{ 
} 
CMyDib::CMyDib(CSize size, int nBitCount)	//构造函数 
	:CDib(size, nBitCount) 
{ 
	haarcount=0; 
} 
 
CMyDib::~CMyDib(void) 
{ 
} 
 
 
/******************************************************************************** 
*	函数名称: 
*		Negatives 
*	描述: 
*		图像反色操作 
*	参数: 
*		无 
*	返回类型: 
*		void 
********************************************************************************/ 
void CMyDib::Negatives() 
{ 
	int L, i, j; 
 
	int nRowByteCount = GetDibSaveDim().cx;//图像每一行的字节数 
	 
	for(i = 0; i < m_lpBMIH->biHeight; i++) 
	{ 
		for(j = 0; j < m_lpBMIH->biWidth; j++) 
		{ 
			L = i * nRowByteCount + j * 3; 
			m_lpImage[L] = 255 - m_lpImage[L]; 
			m_lpImage[L + 1] = 255 - m_lpImage[L + 1]; 
			m_lpImage[L + 2] = 255 - m_lpImage[L + 2]; 
		} 
	} 
} 
/******************************************************************************** 
*	函数名称: 
*		GamaTrans 
*	描述: 
*		图像灰度指数(伽马)变换操作 
*	参数: 
*		double r:幂次,为大于0的正数 
*	返回类型: 
*		void 
********************************************************************************/ 
/*void CMyDib::GamaTrans(double r) 
{ 
	int L, i, j; 
	if(r <= 0) 
		return; 
 
	nRowByteCount = GetDibSaveDim().cx;//图像每一行的字节数 
 
	for(i = 0; i < m_lpBMIH->biHeight; i++) 
	{ 
		for(j = 0; j < m_lpBMIH->biWidth; j++) 
		{ 
			L = i * nRowByteCount + j * 3; 
			m_lpImage[L] = (BYTE)(255 * pow(m_lpImage[L] / 255.0, r)); 
			m_lpImage[L+1] = (BYTE)(255 * pow(m_lpImage[L+1] / 255.0, r)); 
			m_lpImage[L+2] = (BYTE)(255 * pow(m_lpImage[L+2] / 255.0, r)); 
		} 
	} 
}*/ 
/******************************************************************************** 
*	函数名称: 
*		HistEq 
*	描述: 
*		对图像进行直方图均衡化 
*	参数: 
*		无 
*	返回类型: 
*		void 
********************************************************************************/ 
void CMyDib::HistEq() 
{ 
	int dwSizeImage, i, j, L; 
	BYTE pixel, newPixel;	//像素点灰度级 
	int n[256];	//个灰度级的像素个数 
	double s[256]; 
	 
	//图像每一行的字节数 
	int nRowByteCount = GetDibSaveDim().cx; 
	dwSizeImage = m_lpBMIH->biWidth * m_lpBMIH->biHeight; 
 
	//初始化 
	for(i = 0; i <= 255; i++) 
	{ 
		n[i] = 0; 
		s[i] = 0.0; 
	} 
 
	//求n[i], i = 0, 1, 2, ..., 255 
	for(i = 0; i < m_lpBMIH->biHeight; i++) 
		for(j = 0; j < m_lpBMIH->biWidth; j++) 
		{ 
			pixel = *(m_lpImage + i * nRowByteCount + j * 3); 
			n[pixel] += 1; 
		} 
 
	//求s[i], i = 0 --- 255, 即灰度级不大于i的概率 
	s[0] = (double)((double)n[0] / dwSizeImage); 
	for( i = 1; i <= 255; i++) 
	{ 
		s[i] = s[i -1] + (double)((double)n[i] / dwSizeImage); 
	} 
 
	//将转化后的数据写入图像 
	for(i = 0; i < m_lpBMIH->biHeight; i++) 
	{ 
		for(j = 0; j < m_lpBMIH->biWidth; j++) 
		{ 
			L = i * nRowByteCount + j * 3; 
			pixel = *(m_lpImage + L); 
			newPixel = (BYTE)(255 * s[pixel]); 
			*(m_lpImage + L) = newPixel; 
			*(m_lpImage + L + 1) = newPixel; 
			*(m_lpImage + L + 2) = newPixel; 
		} 
	} 
}  
void CMyDib::Haar() 
{    
    haarcount++; 
	BYTE** image; 
	BYTE** originimage; 
	LPBYTE temp; 
	int m=0,n=0; 
	int i; 
	int linewidth; 
/*	if(temp!=NULL) 
		HeapFree(GetProcessHeap(),0,temp);*/ 
	temp=(BYTE*)HeapAlloc(GetProcessHeap(),0,m_dwSizeImage); 
	linewidth=(m_lpBMIH->biWidth*m_lpBMIH->biBitCount+31)/32*4; 
	image=new BYTE*[m_lpBMIH->biHeight]; 
	originimage=new BYTE*[m_lpBMIH->biHeight]; 
	for(i=0;ibiHeight;i++) 
		originimage[i]=m_lpImage+i*linewidth; 
	for(i=0;ibiHeight;i++) 
//		image[i]=temp+i*m_lpBMIH->biSizeImage/m_lpBMIH->biHeight; 
        image[i]=temp+i*linewidth; 
	int startline=m_lpBMIH->biHeight-(m_lpBMIH->biHeight>>(haarcount-1)); 
	int endline=m_lpBMIH->biWidth>>(haarcount-1); 
if(m_lpBMIH->biBitCount==24) 
	{ 
		int x=(m_lpBMIH->biHeight-startline)/2+startline; 
		int y= endline/2; 
		for(i=startline,m=0;ibiHeight;i+=2,m++) 
			for(int j=0,n=0;jbiHeight;i++) 
			for(int j=0;jbiHeight-startline)/2+startline; 
		int y= endline/2; 
		for(i=startline,m=0;ibiHeight;i+=2,m++) 
			for(int j=0,n=0;jbiHeight;i++) 
			for(int j=0;jnow.x?now.x:origin.x; 
	x2=origin.xnow.y?now.y:origin.y; 
	y2=origin.ybiWidth*m_lpBMIH->biBitCount+31)/32*4; 
	 
	image=new BYTE*[m_lpBMIH->biHeight]; 
	originimage=new BYTE*[m_lpBMIH->biHeight]; 
	for(i=0;ibiHeight;i++) 
		originimage[i]=m_lpImage+i*linewidth; 
	for(i=0;ibiHeight;i++) 
        image[i]=temp+i*linewidth; 
	int startline=m_lpBMIH->biHeight-(m_lpBMIH->biHeight>>(haarcount-1)); 
	int endline=m_lpBMIH->biWidth>>(haarcount-1); 
if(m_lpBMIH->biBitCount==24) 
	{ 
		int x=(m_lpBMIH->biHeight-startline)/2+startline; 
		int y= endline/2; 
		if(x1<=0||x1>=y)x1=0; 
		if(x1>y)x1=y; 
		if(x2<=0||x2>=y)x2=y; 
		int p2=m_lpBMIH->biHeight-y2; 
		int p1=m_lpBMIH->biHeight-y1; 
		if(y2<=0&&y1<=0)p2=0; 
		if(p1biHeight; 
		if(p2biHeight;i+=2,m++) 
			for(int j=0,n=0;j=p2&&(x+m)<=p1&&n>=x1&&n<=x2) 
				{ 
					image[i][j*3]=FloatToByte((originimage[x+m][n*3]*2.0+originimage[x+m][y*3+n*3]-originimage[startline+m][n*3]-originimage[startline+m][y*3+n*3]+127.5)/2.0); 
				image[i][j*3+1]=FloatToByte((originimage[x+m][n*3+1]*2.0+originimage[x+m][y*3+n*3+1]-originimage[startline+m][n*3+1]-originimage[startline+m][y*3+n*3+1]+127.5)/2.0); 
				image[i][j*3+2]=FloatToByte((originimage[x+m][n*3+2]*2.0+originimage[x+m][y*3+n*3+2]-originimage[startline+m][n*3+2]-originimage[startline+m][y*3+n*3+2]+127.5)/2.0); 
			     
				image[i][(j+1)*3]=FloatToByte((originimage[x+m][n*3]*2.0-originimage[x+m][y*3+n*3]-originimage[startline+m][n*3]+originimage[startline+m][y*3+n*3]+127.5)/2.0); 
				image[i][(j+1)*3+1]=FloatToByte((originimage[x+m][n*3+1]*2.0-originimage[x+m][y*3+n*3+1]-originimage[startline+m][n*3+1]+originimage[startline+m][y*3+n*3+1]+127.5)/2.0); 
				image[i][(j+1)*3+2]=FloatToByte((originimage[x+m][n*3+2]*2.0-originimage[x+m][y*3+n*3+2]-originimage[startline+m][n*3+2]+originimage[startline+m][y*3+n*3+2]+127.5)/2.0); 
 
				image[i+1][j*3]=FloatToByte((originimage[x+m][y*3+n*3]+originimage[x+m][n*3]*2.0+originimage[startline+m][n*3]+originimage[startline+m][y*3+n*3]-382.5)/2.0); 
				image[i+1][j*3+1]=FloatToByte((originimage[x+m][y*3+n*3+1]+originimage[x+m][n*3+1]*2.0+originimage[startline+m][n*3+1]+originimage[startline+m][y*3+n*3+1]-382.5)/2.0); 
				image[i+1][j*3+2]=FloatToByte((originimage[x+m][y*3+n*3+2]+originimage[x+m][n*3+2]*2.0+originimage[startline+m][n*3+2]+originimage[startline+m][y*3+n*3+2]-382.5)/2.0); 
 
				image[i+1][(j+1)*3]=FloatToByte((originimage[x+m][n*3]*2.0-originimage[x+m][y*3+n*3]+originimage[startline+m][n*3]-originimage[startline+m][y*3+n*3]+127.5)/2.0); 
				image[i+1][(j+1)*3+1]=FloatToByte((originimage[x+m][n*3+1]*2.0-originimage[x+m][y*3+n*3+1]+originimage[startline+m][n*3+1]-originimage[startline+m][y*3+n*3+1]+127.5)/2.0); 
				image[i+1][(j+1)*3+2]=FloatToByte((originimage[x+m][n*3+2]*2.0-originimage[x+m][y*3+n*3+2]+originimage[startline+m][n*3+2]-originimage[startline+m][y*3+n*3+2]+127.5)/2.0); 
				} 
				else{ 
				image[i][j*3]=0; 
				image[i][j*3+1]=0; 
				image[i][j*3+2]=0; 
			     
				image[i][(j+1)*3]=0; 
				image[i][(j+1)*3+1]=0; 
				image[i][(j+1)*3+2]=0; 
 
				image[i+1][j*3]=0; 
				image[i+1][j*3+1]=0; 
				image[i+1][j*3+2]=0; 
 
				image[i+1][(j+1)*3]=0; 
				image[i+1][(j+1)*3+1]=0; 
				image[i+1][(j+1)*3+2]=0; 
 
				} 
				 
			} 
			for(i=startline;ibiHeight;i++) 
			for(int j=0;jbiHeight-startline)/2+startline; 
		int y= endline/2; 
		if(x1<=0||x1>=y)x1=0; 
		if(x1>y)x1=y; 
		if(x2<=0||x2>=y)x2=y; 
		int p2=m_lpBMIH->biHeight-y2; 
		int p1=m_lpBMIH->biHeight-y1; 
		if(y2<=0&&y1<=0)p2=0; 
		if(p1biHeight; 
		if(p2biHeight;i+=2,m++) 
			for(int j=0,n=0;j=p2&&(x+m)<=p1&&n>=x1&&n<=x2) 
				{ 
				image[i][j]=FloatToByte((originimage[x+m][n]*2.0+originimage[x+m][y+n]-originimage[startline+m][n]-originimage[startline+m][y+n]+127.5)/2.0); 
				//image[i][j*3+1]=FloatToByte((originimage[x+m][n*3+1]*2.0+originimage[x+m][y*3+n*3+1]-originimage[startline+m][n*3+1]-originimage[startline+m][y*3+n*3+1]+127.5)/2.0); 
				//image[i][j*3+2]=FloatToByte((originimage[x+m][n*3+2]*2.0+originimage[x+m][y*3+n*3+2]-originimage[startline+m][n*3+2]-originimage[startline+m][y*3+n*3+2]+127.5)/2.0); 
			     
				image[i][j+1]=FloatToByte((originimage[x+m][n]*2.0-originimage[x+m][y+n]-originimage[startline+m][n]+originimage[startline+m][y+n]+127.5)/2.0); 
				//image[i][(j+1)*3+1]=FloatToByte((originimage[x+m][n*3+1]*2.0-originimage[x+m][y*3+n*3+1]-originimage[startline+m][n*3+1]+originimage[startline+m][y*3+n*3+1]+127.5)/2.0); 
				//image[i][(j+1)*3+2]=FloatToByte((originimage[x+m][n*3+2]*2.0-originimage[x+m][y*3+n*3+2]-originimage[startline+m][n*3+2]+originimage[startline+m][y*3+n*3+2]+127.5)/2.0); 
 
				image[i+1][j]=FloatToByte((originimage[x+m][y+n]+originimage[x+m][n]*2.0+originimage[startline+m][n]+originimage[startline+m][y+n]-382.5)/2.0); 
				//image[i+1][j*3+1]=FloatToByte((originimage[x+m][y*3+n*3+1]+originimage[x+m][n*3+1]*2.0+originimage[startline+m][n*3+1]+originimage[startline+m][y*3+n*3+1]-382.5)/2.0); 
				//image[i+1][j*3+2]=FloatToByte((originimage[x+m][y*3+n*3+2]+originimage[x+m][n*3+2]*2.0+originimage[startline+m][n*3+2]+originimage[startline+m][y*3+n*3+2]-382.5)/2.0); 
 
				image[i+1][j+1]=FloatToByte((originimage[x+m][n]*2.0-originimage[x+m][y+n]+originimage[startline+m][n]-originimage[startline+m][y+n]+127.5)/2.0); 
				//image[i+1][(j+1)*3+1]=FloatToByte((originimage[x+m][n*3+1]*2.0-originimage[x+m][y*3+n*3+1]+originimage[startline+m][n*3+1]-originimage[startline+m][y*3+n*3+1]+127.5)/2.0); 
				//image[i+1][(j+1)*3+2]=FloatToByte((originimage[x+m][n*3+2]*2.0-originimage[x+m][y*3+n*3+2]+originimage[startline+m][n*3+2]-originimage[startline+m][y*3+n*3+2]+127.5)/2.0); 
				} 
				else{ 
				image[i][j]=0; 
				//image[i][j*3+1]=0; 
				//image[i][j*3+2]=0; 
			     
				image[i][(j+1)]=0; 
				//image[i][(j+1)*3+1]=0; 
				//image[i][(j+1)*3+2]=0; 
 
				image[i+1][j]=0; 
				//image[i+1][j*3+1]=0; 
				//image[i+1][j*3+2]=0; 
 
				image[i+1][(j+1)]=0; 
				//image[i+1][(j+1)*3+1]=0; 
				//image[i+1][(j+1)*3+2]=0; 
 
				} 
				 
			} 
			for(i=startline;ibiHeight;i++) 
			for(int j=0;j0) 
haarcount--; 
} 
BYTE CMyDib::FloatToByte(double f) 
{ 
	if (f<=0) return (BYTE)0; 
	else if (f>=255) return (BYTE)255; 
	else return (BYTE)(f+0.5); 
} 
void it() 
{ 
	AfxMessageBox("dk"); 
}