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; i tempmax) { 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; y 3 || 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