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

📄 cfunctiondlg.cpp

📁 影像融合与融合精度评价源码影像融合与融合精度评价源码
💻 CPP
字号:
// cFUNCTIONDLG.cpp : implementation file

//



#include "stdafx.h"

#include "MYFUSION.h"

#include "cFUNCTIONDLG.h"



#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif



/////////////////////////////////////////////////////////////////////////////

// cFUNCTIONDLG dialog





cFUNCTIONDLG::cFUNCTIONDLG(CWnd* pParent /*=NULL*/)

	: CDialog(cFUNCTIONDLG::IDD, pParent)

{

	//{{AFX_DATA_INIT(cFUNCTIONDLG)

		// NOTE: the ClassWizard will add member initialization here

	//}}AFX_DATA_INIT

}





void cFUNCTIONDLG::DoDataExchange(CDataExchange* pDX)

{

	CDialog::DoDataExchange(pDX);

	//{{AFX_DATA_MAP(cFUNCTIONDLG)

		// NOTE: the ClassWizard will add DDX and DDV calls here

	//}}AFX_DATA_MAP

}





BEGIN_MESSAGE_MAP(cFUNCTIONDLG, CDialog)

	//{{AFX_MSG_MAP(cFUNCTIONDLG)

	ON_WM_PAINT()

	//}}AFX_MSG_MAP

END_MESSAGE_MAP()



/////////////////////////////////////////////////////////////////////////////

// cFUNCTIONDLG message handlers



BOOL cFUNCTIONDLG::OnInitDialog() 

{

	// 指向源图像象素的指针

	unsigned char * lpSrc1;

	unsigned char * lpSrc2;

	unsigned char * lpSrc3;

	

	// 循环变量

	LONG i;

	LONG j;

		

	CDialog::OnInitDialog();

	// 获取绘制直方图的标签

	CWnd* pWnd = GetDlgItem(IDC_COORD2);



	CRect rect;

	GetClientRect(rect);

	ClientToScreen(&rect);



	// 重置计数为0

	for (i = 0; i < 256; i ++)

	{

		// 清零

		m_mRedCount[i] = 0;

		m_mGreenCount[i] = 0;

		m_mBlueCount[i] = 0;

		m_lBlueCount [i] = 0;

		m_lRedCount  [i] = 0;

        m_lGreenCount[i] = 0;



		m_mpRedCount[i] = 0;

		m_mpBlueCount[i] = 0;

		m_mpGreenCount[i] = 0;

	 	m_pBlueCount [i] = 0;

		m_pRedCount  [i] = 0;

		m_pGreenCount[i] = 0;



		m_mRed[i] = 0;

		m_mGreen[i] = 0;

		m_mBlue[i] = 0;

		m_pBlue [i] = 0;

		m_pGreen[i] = 0;

		m_pRed  [i] = 0;

	}

	

	// 图像每行的字节数

	LONG lLineBytes;



	//计算图像像素总数,因m_width与m_lHeight均等于图像的高和宽

      m_totalpixle=m_lWidth*m_lHeight;



	

	// 计算图像每行的字节数

	lLineBytes = WIDTHBYTES(m_lWidth * 8);

	



//////// 计算原多光谱图像各个灰度值的计数

	for (i = 0; i < m_lHeight; i ++)

	{

		for (j = 0; j < m_lWidth*3; j +=3)

		{

			lpSrc1 = (unsigned char *)m_lpDIBBits + lLineBytes* 3 * i + j  ;

	     	// 计数加1	

			m_mBlueCount[*(lpSrc1)]++;

			

			lpSrc2 = (unsigned char *)m_lpDIBBits + lLineBytes* 3 * i + j+1;

			m_mGreenCount[*(lpSrc2)]++;

			

			lpSrc3 = (unsigned char *)m_lpDIBBits + lLineBytes* 3 * i + j+2;

			m_mRedCount[*(lpSrc3)]++;

		

		}	

	}

	m_mpBlueCount[0]=(double)(m_mBlueCount[0]/m_totalpixle);

	m_mBlue[0] =m_mpBlueCount[0];

	m_mpGreenCount[0]=(double)(m_mGreenCount[0]/m_totalpixle);

	m_mGreen[0]=m_mpGreenCount[0];

	m_mpRedCount[0]=(double)(m_mRedCount[0]/m_totalpixle);

	m_mRed[0]  =m_mpRedCount[0];

	// 计算原多光谱图像各个灰度值的概率

	for(i = 1; i < 256; i ++ )

    {

		m_mpBlueCount[i]=(double)(m_mBlueCount[i]/m_totalpixle);

		m_mBlue[i] =m_mBlue[i-1]+m_mpBlueCount[i];

		m_mpGreenCount[i]=(double)(m_mGreenCount[i]/m_totalpixle);

		m_mGreen[i]=m_mGreen[i-1]+m_mpGreenCount[i];

		m_mpRedCount[i]=(double)(m_mRedCount[i]/m_totalpixle);

		m_mRed[i]  =m_mRed[i-1]+m_mpRedCount[i];

	}

/////////////计算融合图像各个灰度值的计数

	for (i = 0; i < m_lHeight; i ++)

	{

		for (j = 0; j < (m_lWidth*3); j +=3)

		{

			lpSrc1 = (unsigned char *)m_OutpDIBBits + lLineBytes* 3 * i + j  ;

		            m_lBlueCount[*(lpSrc1)]++;



			lpSrc2 = (unsigned char *)m_OutpDIBBits + lLineBytes* 3 * i + j+1;

					m_lGreenCount[*(lpSrc2)]++;



			lpSrc3 = (unsigned char *)m_OutpDIBBits + lLineBytes* 3 * i + j+2;

					m_lRedCount[*(lpSrc3)]++;

		}

	}

	// 计算红绿蓝波段各个灰度值的概率

	m_pBlueCount[0]=(double)(m_lBlueCount[0]/m_totalpixle);

	m_pBlue[0] =m_pBlueCount[0];

	m_pGreenCount[0]=(double)(m_lGreenCount[0]/m_totalpixle);

	m_pGreen[0]=m_pGreenCount[0];

	m_pRedCount[0]=(double)(m_lRedCount[0]/m_totalpixle);

	m_pRed[0]  =m_pRedCount[0];

	for(i = 1; i < 256; i ++ )

    {

		m_pBlueCount[i]=(double)(m_lBlueCount[i]/m_totalpixle);

		m_pBlue[i] =m_pBlue[i-1]+m_pBlueCount[i];

		m_pGreenCount[i]=(double)(m_lGreenCount[i]/m_totalpixle);

		m_pGreen[i]=m_pGreen[i-1]+m_pGreenCount[i];

		m_pRedCount[i]=(double)(m_lRedCount[i]/m_totalpixle);

		m_pRed[i]  =m_pRed[i-1]+m_pRedCount[i];

	}

	return TRUE;  

}



void cFUNCTIONDLG::OnPaint() 

{

	CPaintDC dc(this); // device context for painting

	

	CString str;

	LONG i;



	// 获取绘制坐标的文本框

	CWnd* pWnd = GetDlgItem(IDC_COORD2);



	// 指针

	CDC* pDC = pWnd->GetDC();

	pWnd->Invalidate();

	pWnd->UpdateWindow();

	pDC->Rectangle(0,0,330,300);



	// 创建画笔对象

	CPen* pPenBlack = new CPen;

	// 黑色画笔

	pPenBlack->CreatePen(PS_DASH,1,RGB(0,0,0));



	// 创建画笔对象

	CPen* pPenRed = new CPen;

	// 红色画笔

	pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));

	

	// 创建画笔对象

	CPen* pPenGreen = new CPen;

	//绿色画笔

    pPenGreen->CreatePen(PS_SOLID,1,RGB(0,255,0));

	// 创建画笔对象

	CPen* pPenBlue = new CPen;

	// 蓝色画笔

	pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0, 255));

	// 选中当前红色画笔,并保存以前的画笔

	CGdiObject* pOldPen = pDC->SelectObject(pPenRed);

	// 绘制坐标轴

	pDC->MoveTo(10,10);

	// 垂直轴

	pDC->LineTo(10,280);

	// 水平轴

	pDC->LineTo(320,280);

	// 写X轴刻度值

	str.Format("0");

	pDC->TextOut(10, 283, str);

	str.Format("50");

	pDC->TextOut(60, 283, str);

	str.Format("100");

	pDC->TextOut(110, 283, str);

	str.Format("150");

	pDC->TextOut(160, 283, str);

	str.Format("200");

	pDC->TextOut(210, 283, str);

	str.Format("255");

	pDC->TextOut(265, 283, str);

	str.Format("灰度值i");

	pDC->TextOut(270, 250, str);

	str.Format("F(i)");

	pDC->TextOut(20, 10, str);	

	// 绘制X轴刻度

	for (i = 0; i < 256; i += 5)

	{
		if ((i & 1) == 0)

		{

			// 10的倍数

			pDC->MoveTo(i + 10, 280);

			pDC->LineTo(i + 10, 284);

		}

		else

		{

			// 10的倍数

			pDC->MoveTo(i + 10, 280);

			pDC->LineTo(i + 10, 282);

		}

	}
	// 绘制X轴箭头

	pDC->MoveTo(315,275);

	pDC->LineTo(320,280);

	pDC->LineTo(315,285);

	

	// 绘制X轴箭头

	pDC->MoveTo(10,10);

	pDC->LineTo(5,15);

	pDC->MoveTo(10,10);

	pDC->LineTo(15,15);


   	// 输出最大计数值

	pDC->MoveTo(10, 25);

	pDC->LineTo(14, 25);

	str.Format("1");

	pDC->TextOut(11, 26, str);

	//找出算法名称///
	
	if (m_algrithm==1)
		str.Format("多光谱图像与相关系数加权平均融合图像的分布函数");
	else if (m_algrithm==2)
		str.Format("多光谱图像与BROVEY变换融合图像的分布函数");
	else if (m_algrithm==3)
		str.Format("多光谱图像与四系数小波变换融合图像的分布函数");
	else if (m_algrithm==4)
		str.Format("多光谱图像与直接加权平均融合图像的分布函数");
	else if (m_algrithm==5)
		str.Format("多光谱图像与HIS变换融合图像的分布函数");
	else if (m_algrithm==6)
		str.Format("多光谱图像与高通滤波融合图像的分布函数");
	else if (m_algrithm==7)
		str.Format("多光谱图像与PCA变换融合图像的分布函数");
	else if (m_algrithm==8)
		str.Format("多光谱图像与YIQ变换融合图像的分布函数");
	else str.Format("");
	pDC->TextOut(20,310,str);

	// 绘制原高分辩率图像的分布函数	
	// 更改成黑色画笔

	pDC->SelectObject(pPenBlack);
	pDC->MoveTo(10, 280);

	for (i = 0; i <= 255; i ++)
	{
		pDC->LineTo(i + 10, (int)(280-255* m_mRed[i] ));
	}

	pDC->MoveTo(10, 280);
	for (i = 0; i <= 255; i ++)
	{
		pDC->LineTo(i + 10, (int)(280-255* m_mBlue[i] ));
	}

	pDC->MoveTo(10, 280);
	for (i = 0; i <= 255; i ++)
	{
		pDC->LineTo(i + 10, (int)(280-255* m_mGreen[i] ));
	}

	// 绘制融合图像的红色分量分布函数

	// 更改成红色画笔

	pDC->SelectObject(pPenRed);
	pDC->MoveTo(10, 280);

	for (i = 0; i <= 255; i ++)
	{
		pDC->LineTo(i + 10, (int)(280-255* m_pRed[i] ));
	}
	// 绘制融合图像的绿色分量分布函数
	// 更改成绿色画笔
	pDC->SelectObject(pPenGreen);
	pDC->MoveTo(10, 280);
	for (i = 0; i <= 255; i ++)
	{
		pDC->LineTo(i + 10, (int)(280-255* m_pGreen[i] ));
	}

	// 绘制融合图像的蓝色分量分布函数
	// 更改成蓝色画笔
	pDC->SelectObject(pPenBlue);
	pDC->MoveTo(10, 280);
	for (i = 0; i <= 255; i ++)
	{
		pDC->LineTo(i + 10, (int)(280-255* m_pBlue[i] ));
	}
	// 恢复以前的画笔
	pDC->SelectObject(pOldPen);	
	// 删除新的画笔

	delete pPenRed;
	delete pPenBlue;
	delete pPenBlack;
	delete pPenGreen;

}
































































⌨️ 快捷键说明

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