📄 zhiliang.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 + -