?? grayshow.cpp
字號:
//////////////////////////////////////////////////////////////////////
// GrayShow.cpp: implementation of the CGrayShow class.
// 灰度共現矩陣算法實現
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Texture.h"
#include "GrayShow.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGrayShow::CGrayShow()
{
PMatrixRD = NULL; //45度方向上的灰度共現矩陣
PMatrixLD = NULL; //135度方向上的灰度共現矩陣
PMatrixV = NULL; //90度方向上的灰度共現矩陣
PMatrixH = NULL; //0度方向上的灰度共現矩陣
ImageArray = NULL; //原始的圖像數據數組
m_tOriPixelArray = NULL;//原始位圖數據
m_tResPixelArray = NULL;//參考位圖數據
m_dib = new CDib();
distance = 5;
FilterWindowWidth = 16;
GrayLayerNum = 8; //初始化設為8個灰度層,可以修改
//這樣共現矩陣均為GrayLayerNum×GrayLayerNum
int i;
PMatrixH = new int*[GrayLayerNum];
PMatrixLD= new int*[GrayLayerNum];
PMatrixRD= new int*[GrayLayerNum];
PMatrixV = new int*[GrayLayerNum];
for(i=0; i<GrayLayerNum; i++)
{
PMatrixH[i] = new int[GrayLayerNum];
PMatrixLD[i]= new int[GrayLayerNum];
PMatrixRD[i]= new int[GrayLayerNum];
PMatrixV[i] = new int[GrayLayerNum];
}
}
CGrayShow::~CGrayShow()
{
}
////////////////////////////////////////////////////////////////////
//功能:裝載圖像
//參數:FilePathName-圖像文件路徑名
void CGrayShow::LoadImage(CString &FilePathName)
{
int i,j;
//檢測是否為空,不為空則要釋放內存
if(m_tOriPixelArray !=NULL)
{
for(i=0; i<ImageHeight; i++)
{
delete m_tOriPixelArray[i];
delete m_tResPixelArray[i];
delete ImageArray[i];
}
}
m_dib->Open(FilePathName);
ImageWidth = m_dib->GetWidth();
ImageHeight = m_dib->GetHeight();
BYTE *colorTable;
colorTable = (BYTE *)m_dib->m_pDibBits;
int byteBitCount = m_dib->GetBiBitCount()/8;
m_tOriPixelArray = new RGBQUAD*[ImageHeight];
m_tResPixelArray = new RGBQUAD*[ImageHeight];
ImageArray = new BYTE*[ImageHeight];
for(int l=0 ; l<ImageHeight; l++)
{
m_tOriPixelArray[l] = new RGBQUAD[ImageWidth];
m_tResPixelArray[l] = new RGBQUAD[ImageWidth];
ImageArray[l] = new BYTE[ImageWidth];
}
int count = 0;
for(i=ImageHeight-1; i>=0; i--)
{
for(j=0; j<ImageWidth; j++)
{
m_tOriPixelArray[i][j].rgbBlue =colorTable[count++];
m_tOriPixelArray[i][j].rgbGreen=colorTable[count++];
m_tOriPixelArray[i][j].rgbRed =colorTable[count++];
m_tOriPixelArray[i][j].rgbReserved = 0;
m_tResPixelArray[i][j]=m_tOriPixelArray[i][j];
ImageArray[i][j] = (BYTE)(((unsigned int)m_tOriPixelArray[i][j].rgbBlue
+(unsigned int)m_tOriPixelArray[i][j].rgbGreen
+(unsigned int)m_tOriPixelArray[i][j].rgbRed)/3);
count += byteBitCount-3;
}
count += (4-(ImageWidth*byteBitCount)%4)%4;
}
}
////////////////////////////////////////////////////////////////////////////////////
//函數功能:計算紋理特征
//參數:FeatureEnergy-能量
// FeatureEntropy-熵
// FeatureInertiaQuadrature-慣性矩
// FeatureCorrelation-相關
// FeatureLocalCalm-局部平穩
// pMatrix-共現矩陣
// dim-共現矩陣的維數
///////////////////////////////////////////////////////////////////////////////////
void CGrayShow::ComputeFeature(double &FeatureEnergy, double &FeatureEntropy,
double &FeatureInertiaQuadrature, double &FeatureCorrelation,
double &FeatureLocalCalm, int** pMatrix, int dim)
{
int i,j;
double **pdMatrix;
pdMatrix = new double*[dim];
for(i=0; i<dim; i++)
pdMatrix[i] = new double[dim];
int total = 0;
for(i=0; i<dim; i++)
{
for(j=0; j<dim; j++)
{
total += pMatrix[i][j];
}
}
for(i=0; i<dim; i++)
{
for(j=0; j<dim; j++)
{
pdMatrix[i][j] = (double)pMatrix[i][j]/(double)total;
}
}
FeatureEnergy = 0.0;
FeatureEntropy = 0.0;
FeatureInertiaQuadrature = 0.0;
FeatureLocalCalm = 0.0;
//計算能量、熵、慣性矩、局部平穩
for(i=0; i<dim; i++)
{
for(j=0; j<dim; j++)
{
//能量
FeatureEnergy += pdMatrix[i][j]*pdMatrix[i][j];
//熵
if(pdMatrix[i][j]>1e-12)
{
FeatureEntropy -= pdMatrix[i][j]*log(pdMatrix[i][j]);
}
//慣性矩
FeatureInertiaQuadrature += (double)(i-j)*(double)(i-j)*pdMatrix[i][j];
//局部平穩
FeatureLocalCalm += pdMatrix[i][j]/(1+(double)(i-j)*(double)(i-j));
}
}
//計算ux
double ux = 0.0;
double localtotal = 0.0;
for(i=0; i<dim; i++)
{
localtotal = 0.0;
for(j=0; j<dim; j++)
{
localtotal += pdMatrix[i][j];
}
ux += (double)i * localtotal;
}
//計算uy
double uy = 0.0;
for(j=0; j<dim; j++)
{
localtotal = 0.0;
for(i=0; i<dim; i++)
{
localtotal += pdMatrix[i][j];
}
uy += (double)j * localtotal;
}
//計算sigmax
double sigmax = 0.0;
for(i=0; i<dim; i++)
{
localtotal = 0.0;
for(j=0; j<dim; j++)
{
localtotal += pdMatrix[i][j];
}
sigmax += (double)(i-ux) * (double)(i-ux) * localtotal;
}
//計算sigmay
double sigmay = 0.0;
for(j=0; j<dim; j++)
{
localtotal = 0.0;
for(i=0; i<dim; i++)
{
localtotal += pdMatrix[i][j];
}
sigmay += (double)(j-uy) * (double)(j-uy) * localtotal;
}
//計算相關
FeatureCorrelation = 0.0;
for(i=0; i<dim; i++)
{
for(j=0; j<dim; j++)
{
FeatureCorrelation += (double)(i-ux) * (double)(j-uy) * pdMatrix[i][j];
}
}
FeatureCorrelation /= sigmax;
FeatureCorrelation /= sigmay;
}
/////////////////////////////////////////////////////////////////////////////////////
//功能:計算共現矩陣
//參數:LocalImage-用來計算的局部紋理區域圖像
// LocalImageWidth-局部紋理區域寬度
////////////////////////////////////////////////////////////////////////////////////
void CGrayShow::ComputeMatrix(BYTE **LocalImage, int LocalImageWidth)
{
BYTE **NewImage;
NewImage = new BYTE*[LocalImageWidth];
int i,j;
for(i=0; i<LocalImageWidth; i++)
NewImage[i] = new BYTE[LocalImageWidth];
for(i=0; i<LocalImageWidth; i++)
{
for(j=0; j<LocalImageWidth; j++)
{
//分成GrayLayerNum個灰度級
NewImage[i][j] = LocalImage[i][j] / (256/GrayLayerNum);
}
}
for(i=0; i<GrayLayerNum; i++)
{
//
for(j=0; j<GrayLayerNum; j++)
{
PMatrixH[i][j] = 0;
PMatrixLD[i][j] = 0;
PMatrixRD[i][j] = 0;
PMatrixV[i][j] = 0;
}
}
//計算0度的灰度共現陣
for(i=0; i<LocalImageWidth; i++)
{
for(j=0; j<LocalImageWidth-distance; j++)
{
PMatrixH[(unsigned int)NewImage[i][j]][(unsigned int)NewImage[i][j+distance]] += 1;
PMatrixH[(unsigned int)NewImage[i][j+distance]][(unsigned int)NewImage[i][j]] += 1;
}
}
//計算90度的灰度共現陣
for(i=0; i<LocalImageWidth-distance; i++)
{
for(j=0; j<LocalImageWidth; j++)
{
PMatrixV[(unsigned int)NewImage[i][j]][(unsigned int)NewImage[i+distance][j]] += 1;
PMatrixV[(unsigned int)NewImage[i+distance][j]][(unsigned int)NewImage[i][j]] += 1;
}
}
//計算135度的灰度共現陣
for(i=0; i<LocalImageWidth-distance; i++)
{
for(j=0; j<LocalImageWidth-distance; j++)
{
int newi, newj;
newi = i+distance;
newj = j+distance;
PMatrixLD[(unsigned int)NewImage[i][j]][(unsigned int)NewImage[newi][newj]] += 1;
PMatrixLD[(unsigned int)NewImage[newi][newj]][(unsigned int)NewImage[i][j]] += 1;
}
}
//計算45度的灰度共現陣
for(i=distance; i<LocalImageWidth; i++)
{
for(j=0; j<LocalImageWidth-distance; j++)
{
int newi, newj;
newi = i-distance;
newj = j+distance;
PMatrixRD[(unsigned int)NewImage[i][j]][(unsigned int)NewImage[newi][newj]] += 1;
PMatrixRD[(unsigned int)NewImage[newi][newj]][(unsigned int)NewImage[i][j]] += 1;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -