⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zhiliang.cpp

📁 本程序基于Visual C++6.0环境编写
💻 CPP
字号:
// ZhiLiang.cpp : implementation file
//

#include "stdafx.h"
#include "wavelets.h"
#include "ZhiLiang.h"
#include "WvltDoc.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CZhiLiang dialog


CZhiLiang::CZhiLiang(CWnd* pParent /*=NULL*/)
	: CDialog(CZhiLiang::IDD, pParent)
{
	//{{AFX_DATA_INIT(CZhiLiang)
	m_biaozhun = 0.0f;
	m_xinxishang = 0.0f;
	m_qingxidu = 0.0f;
	m_jiaocha = 0.0f;
	m_lianhe = 0.0f;
	m_junfang = 0.0f;
	m_fengzhi = 0.0f;
	m_1xinxishang = 0.0f;
	m_1biaozhun = 0.0f;
	m_1qingxidu = 0.0f;
	m_2biaozhun = 0.0f;
	m_2xinxishang = 0.0f;
	m_pBitmap=NULL;
    m_pTransfered=NULL;
    m_pTransfered1=NULL;
	m_2qingxidu = 0.0f;
	//}}AFX_DATA_INIT
}


void CZhiLiang::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CZhiLiang)
	DDX_Text(pDX, IDC_EDIT1, m_biaozhun);
	DDV_MinMaxFloat(pDX, m_biaozhun, 0.f, 255.f);
	DDX_Text(pDX, IDC_EDIT2, m_xinxishang);
	DDX_Text(pDX, IDC_EDIT3, m_qingxidu);
	DDX_Text(pDX, IDC_EDIT6, m_jiaocha);
	DDX_Text(pDX, IDC_EDIT17, m_lianhe);
	DDX_Text(pDX, IDC_EDIT4, m_junfang);
	DDX_Text(pDX, IDC_EDIT18, m_fengzhi);
	DDX_Text(pDX, IDC_EDIT8, m_1xinxishang);
	DDX_Text(pDX, IDC_EDIT7, m_1biaozhun);
	DDX_Text(pDX, IDC_EDIT9, m_1qingxidu);
	DDX_Text(pDX, IDC_EDIT12, m_2biaozhun);
	DDX_Text(pDX, IDC_EDIT13, m_2xinxishang);
	DDX_Text(pDX, IDC_EDIT14, m_2qingxidu);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CZhiLiang, CDialog)
	//{{AFX_MSG_MAP(CZhiLiang)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CZhiLiang message handlers

void CZhiLiang::OnButton1() 
{
	// TODO: Add your control notification handler code here
   if(m_pTransfered == NULL)
	  AfxMessageBox("请首先进行图像融合"); 
   else
   {
    LPBITMAPINFOHEADER lpBitmapInfoHeader = (LPBITMAPINFOHEADER)(m_pBitmap+14);
	LPBITMAPFILEHEADER lpBitmapFileHeader = (LPBITMAPFILEHEADER)m_pBitmap;
	unsigned char* lpData = m_pBitmap + lpBitmapFileHeader->bfOffBits;
	unsigned long biHeight = lpBitmapInfoHeader->biHeight;
	unsigned long biWidth = lpBitmapInfoHeader->biWidth;
    unsigned long biAlign = (biWidth)/4 *4;
	unsigned long bmSize = biHeight * biAlign;
	//定义图像的内存数据空间指针
	short **pData; //**pDataFusion;
//	CString cstrFileName = m_strFileFusion;
	//图像矩阵的坐标与像素数据
	int x, y, cur;
 //分配图像的数据空间
	pData = new short * [biHeight];
	//pDataFusion = new short * [biHeight];
	for(int i = 0; i < biWidth; i ++)
	{
		//pDataFusion[i] = new short [biWidth];
		pData[i] = new short [biWidth];
	}
	//从设备的显示缓存中获取原始图像的数据
	for(y = 0; y < (int) biHeight; y ++)
	{
		for(x = 0; x < (int) biWidth; x ++)
		{
			cur = y * biAlign + x;
	         pData[biHeight - 1 - y][x] =lpData[cur];
		}
	}
	
//计算信息熵
//计算像素灰度比
float s[256];
  double ss; 
  ss=0.0;
   
  unsigned long n;
  n=0;
 float p[256];
 for(int j=0; j<256;j++)
 {    for(y = 0; y <(int) biHeight; y ++)
	 {
		for (x = 0; x < (int)biWidth; x++)
		{
			if(j==pData[biHeight - 1 - y][x])
			  n=n+1;
			   
		}   
			
	 }
      p[j]=n;
	  n=0;
 }

for(j=0; j<256;j++)
	 s[j]=float(p[j]/(biHeight*biWidth));
 
for(j=0; j<256;j++)
  if(s[j]>0)
   ss=ss+s[j]*(log10(s[j])/log10(2));
 ss=-ss;
m_xinxishang=ss;

 // 进行标准差处理
 unsigned long SUM,SUM1,AVE1,AVE;
    SUM=0;SUM1=0;
	 AVE1=0;AVE=0;
	 
   for(y = 0; y <(int) biHeight; y ++)
	{
		for (x = 0; x < (int)biWidth; x++)
		{
			SUM=SUM+pData[biHeight - 1 - y][x];
		}   
			
	}
    
   AVE=SUM/(int)(biHeight*biWidth);

   for(y = 0; y <(int)biHeight; y ++)
	{
		for (x = 0; x <(int)biWidth; x++)
		{
			SUM1=SUM1+(pData[biHeight - 1 - y][x]-AVE)*(pData[biHeight - 1 - y][x]-AVE);
		}   
			
	}
	AVE1=SUM1/(int)(biHeight*biWidth);
    m_biaozhun=(float)sqrt(AVE1);

//计算清晰度
float a,b,c,sum;
sum=0.0;
for(y = 0; y <(int) biHeight-1; y ++)
{
		for (x = 0; x < (int)biWidth-1; x++)
		{    a=(pData[biHeight - 1 - y][x]-pData[biHeight - 1 - y-1][x])*(pData[biHeight - 1 - y][x]-pData[biHeight - 1 - y-1][x]);
             b=(pData[biHeight - 1 - y][x]-pData[biHeight - 1 - y][x+1])*(pData[biHeight - 1 - y][x]-pData[biHeight - 1 - y][x+1]);
             c=sqrt((a+b)/2);
             sum=sum+c;
		}
}
sum=sum/((biHeight-1)*(biWidth-1));

m_qingxidu=sum;


//读取第二幅图像
    LPBITMAPINFOHEADER lpBitmapInfoHeader1 = (LPBITMAPINFOHEADER)(m_pTransfered1+14);
	LPBITMAPFILEHEADER lpBitmapFileHeader1 = (LPBITMAPFILEHEADER)m_pTransfered1;
	unsigned char* lpData1 = m_pTransfered1 + lpBitmapFileHeader1->bfOffBits;
//	unsigned long biHeight1 = lpBitmapInfoHeader1->biHeight;
//	unsigned long biWidth1 = lpBitmapInfoHeader1->biWidth;
 //    unsigned long biAlign1 = (biWidth1)/4 *4;
//	unsigned long bmSize1 = biHeight1 * biAlign1;
	//定义图像的内存数据空间指针
	short **pData1;//**pDataFusion1;
//	CString cstrFileName = m_strFileFusion;
	//图像矩阵的坐标与像素数据
//	int x1, y1, cur1;
 //分配图像的数据空间
	pData1 = new short * [biHeight];
	//pDataFusion1 = new short * [biHeight1];
	for( i = 0; i < biWidth; i ++)
	{
		//pDataFusion1[i] = new short [biWidth1];
		pData1[i] = new short [biWidth];
	}
	//从设备的显示缓存中获取原始图像的数据
	for(y = 0; y < (int) biHeight; y ++)
	{
		for(x = 0; x < (int) biWidth; x ++)
		{
			cur= y * biAlign + x;
	        pData1[biHeight - 1 - y][x] =lpData1[cur];
		}
	}

//读取第三副图像
    //LPBITMAPINFOHEADER lpBitmapInfoHeader2 = (LPBITMAPINFOHEADER)(m_pTransfered+14);
	//LPBITMAPFILEHEADER lpBitmapFileHeader2 = (LPBITMAPFILEHEADER)m_pTransfered;
	unsigned char* lpData2 = m_pTransfered; //+ lpBitmapFileHeader2->bfOffBits;
	//unsigned long biHeight2 = lpBitmapInfoHeader2->biHeight;
	//unsigned long biWidth2 = lpBitmapInfoHeader2->biWidth;
     //unsigned long biAlign2 = (biWidth2)/4 *4;
	//unsigned long bmSize2 = biHeight2 * biAlign2;
	//定义图像的内存数据空间指针
	short **pData2;//**pDataFusion1;
//	CString cstrFileName = m_strFileFusion;
	//图像矩阵的坐标与像素数据
	//int x2, y2, cur2;
 //分配图像的数据空间
	pData2 = new short * [biHeight];
	//pDataFusion1 = new short * [biHeight1];
	for( i = 0; i < biWidth; i ++)
	{
		//pDataFusion1[i] = new short [biWidth1];
		pData2[i] = new short [biWidth];
	}
	//从设备的显示缓存中获取原始图像的数据
	for(y = 0; y < (int) biHeight; y ++)
	{
		for(x = 0; x < (int) biWidth; x++)
		{
			cur = y * biAlign + x;
	        pData2[biHeight - 1 - y][x] =lpData2[cur];
		}
	}
    
//计算交叉熵
 float s1[256],s2[256];
  double ss1,ss2; 
  ss1=0.0;
  ss2=0.0;
  unsigned long m;
  m=0;
 float p1[256],p2[256];
 for( j=0; j<256;j++)
 {    for(y = 0; y <(int) biHeight; y ++)
	 {
		for (x = 0; x < (int)biWidth; x++)
		{
			if(j==pData1[biHeight - 1 - y][x])
			  n=n+1;
            if(j==pData2[biHeight - 1 - y][x])
			  m=m+1;
		}   
			
	 }
      p1[j]=n;
	  n=0;
	  p2[j]=m;
	  m=0;
 }

for(j=0; j<256;j++)
{    
	s1[j]=float(p1[j]/(biHeight*biWidth));
    s2[j]=float(p2[j]/(biHeight*biWidth));
}
for(j=0; j<256;j++)
{
  if((s2[j]>0)&&(s[j]>0))
   ss1=ss1+s[j]*((log10(s[j])/log10(2))-(log10(s2[j])/log10(2)));
  if((s2[j]>0)&&(s1[j]>0))
   ss2=ss2+s1[j]*((log10(s1[j])/log10(2))-(log10(s2[j])/log10(2)));
}

m_jiaocha=(ss2+ss1)/2;

//计算均方根误差
float asum,bsum,absum;
 asum=0.0;bsum=0.0;
 for(y = 0; y <(int) biHeight; y ++)
 {
		for (x = 0; x < (int)biWidth; x++)
		{	asum=asum+(pData[biHeight - 1 - y][x]-pData2[biHeight - 1 - y][x])*(pData[biHeight - 1 - y][x]-pData2[biHeight - 1 - y][x]);
		    bsum=bsum+(pData1[biHeight - 1 - y][x]-pData2[biHeight - 1 - y][x])*(pData1[biHeight - 1 - y][x]-pData2[biHeight - 1 - y][x]);

        }
 }
 asum=sqrt(asum/(biHeight*biWidth));
 bsum=sqrt(bsum/(biHeight*biWidth));

 absum=(asum+bsum)/2;
 m_junfang=absum;
//计算峰值信噪比
float R1,R2,R;
int Max1,Max2;
Max1=0;Max2=0;
for(y = 0; y <(int) biHeight; y ++)
 {
		for (x = 0; x < (int)biWidth; x++)
		{	if(pData[biHeight - 1 - y][x]>Max1)
		       Max1=pData[biHeight - 1 - y][x];
		    if(pData1[biHeight - 1 - y][x]>Max2)
		       Max2=pData1[biHeight - 1 - y][x];


        }
 }
R1=10*log10((Max1*Max1)/(asum*asum));
R2=10*log10((Max2*Max2)/(bsum*bsum));
R=(R1+R2)/2;

m_fengzhi=R;
//联合熵
float G;
G=0.0;
for(j=0;j<256;j++)
{  if((s2[j]>0)&&(s[j]>0)&&(s1[j]>0))
   G=G+(log10(s[j]*s1[j]*s2[j])/log10(2));
}
G=-G;
m_lianhe=G;


//计算第二幅信息熵
//计算像素灰度比
//float s[256];
  //double ss; 
  ss=0.0;
   
  //unsigned long n;
  n=0;
 //float p[256];
 for( j=0; j<256;j++)
 {    for(y = 0; y <(int) biHeight; y ++)
	 {
		for (x = 0; x < (int)biWidth; x++)
		{
			if(j==pData1[biHeight - 1 - y][x])
			  n=n+1;
			   
		}   
			
	 }
      p[j]=n;
	  n=0;
 }

for(j=0; j<256;j++)
	 s[j]=float(p[j]/(biHeight*biWidth));
 
for(j=0; j<256;j++)
  if(s[j]>0)
   ss=ss+s[j]*(log10(s[j])/log10(2));
 ss=-ss;
m_1xinxishang=ss;

 // 进行第二幅标准差处理
 
    SUM=0;SUM1=0;
	 AVE1=0;AVE=0;
	 
   for(y = 0; y <(int) biHeight; y ++)
	{
		for (x = 0; x < (int)biWidth; x++)
		{
			SUM=SUM+pData1[biHeight - 1 - y][x];
		}   
			
	}
    
   AVE=SUM/(int)(biHeight*biWidth);

   for(y = 0; y <(int)biHeight; y ++)
	{
		for (x = 0; x <(int)biWidth; x++)
		{
			SUM1=SUM1+(pData1[biHeight - 1 - y][x]-AVE)*(pData1[biHeight - 1 - y][x]-AVE);
		}   
			
	}
	AVE1=SUM1/(int)(biHeight*biWidth);
    m_1biaozhun=(float)sqrt(AVE1);

//计算第二副清晰度

sum=0.0;
for(y = 0; y <(int) biHeight-1; y ++)
{
		for (x = 0; x < (int)biWidth-1; x++)
		{    a=(pData1[biHeight - 1 - y][x]-pData1[biHeight - 1 - y-1][x])*(pData1[biHeight - 1 - y][x]-pData1[biHeight - 1 - y-1][x]);
             b=(pData1[biHeight - 1 - y][x]-pData1[biHeight - 1 - y][x+1])*(pData1[biHeight - 1 - y][x]-pData1[biHeight - 1 - y][x+1]);
             c=sqrt((a+b)/2);
             sum=sum+c;
		}
}
sum=sum/((biHeight-1)*(biWidth-1));

m_1qingxidu=sum;

//计算融合信息熵
//计算像素灰度比
//float s[256];
  //double ss; 
  ss=0.0;
   
  //unsigned long n;
  n=0;
 //float p[256];
 for( j=0; j<256;j++)
 {    for(y = 0; y <(int) biHeight; y ++)
	 {
		for (x = 0; x < (int)biWidth; x++)
		{
			if(j==pData2[biHeight - 1 - y][x])
			  n=n+1;
			   
		}   
			
	 }
      p[j]=n;
	  n=0;
 }

for(j=0; j<256;j++)
	 s[j]=float(p[j]/(biHeight*biWidth));
 
for(j=0; j<256;j++)
  if(s[j]>0)
   ss=ss+s[j]*(log10(s[j])/log10(2));
 ss=-ss;
m_2xinxishang=ss;

 // 进行融合标准差处理
 
    SUM=0;SUM1=0;
	 AVE1=0;AVE=0;
	 
   for(y = 0; y <(int) biHeight; y ++)
	{
		for (x = 0; x < (int)biWidth; x++)
		{
			SUM=SUM+pData2[biHeight - 1 - y][x];
		}   
			
	}
    
   AVE=SUM/(int)(biHeight*biWidth);

   for(y = 0; y <(int)biHeight; y ++)
	{
		for (x = 0; x <(int)biWidth; x++)
		{
			SUM1=SUM1+(pData2[biHeight - 1 - y][x]-AVE)*(pData2[biHeight - 1 - y][x]-AVE);
		}   
			
	}
	AVE1=SUM1/(int)(biHeight*biWidth);
    m_2biaozhun=(float)sqrt(AVE1);

//计算融合清晰度

sum=0.0;
for(y = 0; y <(int) biHeight-1; y ++)
{
		for (x = 0; x < (int)biWidth-1; x++)
		{    a=(pData2[biHeight - 1 - y][x]-pData2[biHeight - 1 - y-1][x])*(pData2[biHeight - 1 - y][x]-pData2[biHeight - 1 - y-1][x]);
             b=(pData2[biHeight - 1 - y][x]-pData2[biHeight - 1 - y][x+1])*(pData2[biHeight - 1 - y][x]-pData2[biHeight - 1 - y][x+1]);
             c=sqrt((a+b)/2);
             sum=sum+c;
		}
}
sum=sum/((biHeight-1)*(biWidth-1));

m_2qingxidu=sum;




}
UpdateData(FALSE);

	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -