www.pudn.com > MyImageDB(imageobject).rar > MyTexture.cpp


// MyTexture.cpp: implementation of the CMyTexture class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "myimagedb.h" 
#include "MyTexture.h" 
#include  
#include "mymath.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
//#define NEIRADIUS 16//邻域半径,必须与DOC中的同样定义一致; 
#define DHISNORM ( sqrt( 4. * (pow(((pow(((NEIRADIUS*2+1)-1), 2. ) )/4.), 2.)) ) )//可能的最大距离,用于归一化方向直方图距离; 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
CMyTexture::CMyTexture() 
{ 
 
} 
 
CMyTexture::~CMyTexture() 
{ 
 
} 
 
FLOAT CMyTexture::CalcuEntropy(BYTE* inMatrix, INT width, INT height) 
//计算输入图像块信息熵; 
{ 
	//计算输入图像总的灰度值; 
	INT ptcount = width * height; 
	DOUBLE maxen = -1; 
	DOUBLE allitensity = 0; 
	for (INT i=0; itempmax) 
		{ 
			tempmax = dhisarr[i].count; 
			direction = i; 
		}		 
	} 
 
	delete [] dhisarr; dhisarr = NULL; 
 
	//以下计算均值和方差,以方差的倒数作为强度; 
	FLOAT tempmean, temperr; 
	myMath.ClacuMean(countarr, binsinhis, tempmean, temperr); 
	itensity = (FLOAT) ( 1. / temperr ); 
 
	delete [] countarr; countarr = NULL; 
 
	return TRUE;	 
} 
 
BOOL CMyTexture::CalcuDirectionHis(BYTE* inMatrix, INT width, INT height, DirectionHis** outHis, INT& binsInHis) 
//计算输入块的方向直方图,如有明确方向,则返回TRUE,否则返回FALSE; 
{ 
	//首先计算各像素的deltaX和deltaY; 
	//然后计算各像素点处的梯度方向以及模; 
	//将它们聚类到指定的四个方向上去得到方向直方图; 
	//以下计算梯度方向与模; 
	FLOAT* deltasita; 
	FLOAT* deltar; 
	INT deltacount = width * height; 
	deltasita = new FLOAT[deltacount]; 
	deltar = new FLOAT[deltacount]; 
    GetGradient(inMatrix, width, height, deltar, deltasita); 
 
	DirectionHis* dhis = new DirectionHis[5];//方向直方图,最后一个为无效方向; 
	//赋初值; 
	for (INT i=0; i<4; i++) 
	{ 
		dhis[i].count = 0; 
		dhis[i].sita = (FLOAT) ( PI/4 * i );//每隔45度取一个方向; 
	} 
	dhis[4].sita = -1; 
	dhis[4].count = 0; 
 
	//以下计算方向直方图; 
	FLOAT bias = (FLOAT) (0.1);//模阈值; 
	for (INT y=0; y3 || deltar[temppos]==0) 
			{ 
				j = 4; 
			} 
			dhis[j].count++; 
		} 
	} 
 
	delete [] deltar; deltar = NULL; 
	delete [] deltasita; deltasita = NULL; 
 
	*outHis = dhis; 
	binsInHis = 4; 
 
    if ( dhis[4].count>(deltacount - width) ) 
	{ 
		return FALSE; 
	} 
	return TRUE; 
} 
 
void CMyTexture::GetGradient(BYTE* image, INT width, INT height 
		, FLOAT* deltar, FLOAT* deltasita) 
//得到输入图像的梯度; 
{ 
	//下面计算各像素在水平和垂直方向上的梯度,边缘点梯度计为0; 
	INT* deltaxarr; 
	INT* deltayarr; 
	INT grawidth = width; 
	INT graheight = height; 
	INT deltacount = grawidth * graheight; 
	deltaxarr = new INT[deltacount]; 
	deltayarr = new INT[deltacount]; 
	for (INT y=0; y