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

📄 myfusionview.cpp

📁 影像融合与融合精度评价源码影像融合与融合精度评价源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	CString str;
	str.Format ("图像灰度标准差为  %f",standerd);
	AfxMessageBox(str);
}

void CMYFUSIONView::OnFusionHis() 
{
	//分别获取两个图像的指针
	CMYFUSIONApp* app=(CMYFUSIONApp*)AfxGetApp();//获得当前APP
	POSITION p = app->GetFirstDocTemplatePosition(); //p是第一个文档模板的首位置
	while(p!= NULL) 
	{ 
		CDocTemplate * pDocTemplate = app->GetNextDocTemplate(p);// 获取第一个文档模板的首位置指针
		POSITION p1 = pDocTemplate->GetFirstDocPosition(); //p1是第一个文档模板中第一个文档的首位置
		while(p1 != NULL) 
		{ 
			CMYFUSIONDoc * pDocument = (CMYFUSIONDoc*)pDocTemplate->GetNextDoc(p1); //pDocument是第一个文档模板中第一个文档的首位置指针
			if(pDocument->GetPathName()==app->pathname1)
			{
		    	hpan=pDocument->m_hDIB;
			}
	    	 if(pDocument->GetPathName()==app->pathname2)
			{
				hmul=pDocument->m_hDIB;
			}
		} 
	}
	if(hmul==NULL || hpan==NULL)
	{
		AfxMessageBox("必须选择两幅影像!",MB_ICONSTOP);	
		return ;
	}
	if(hmul==hpan)
	{
		AfxMessageBox("不可以出现两幅相同的影像!",MB_ICONSTOP);
		return ;
	}

	LPSTR  mulDIB,panDIB; //指向图像的指针
	BYTE * colorimage;//指向彩色图像的数据区位置
	BYTE * panimage;//指向全色图像的数据区位置
	mulDIB= (LPSTR) ::GlobalLock((HGLOBAL) hmul);
	colorimage=(BYTE *)FindDIBBits(mulDIB);
	panDIB= (LPSTR) ::GlobalLock((HGLOBAL) hpan);
	panimage =(BYTE *)FindDIBBits(panDIB);
	
	CFusionAlgrithm  imageFusion;
	HDIB hDib=imageFusion.HISFUSION (hmul,hpan);
	if(hDib == NULL)
	{
		AfxMessageBox("融合失败!",MB_ICONSTOP);
		return ;
	}

	CMultiDocTemplate	*	pDocTemplate;
	POSITION				pos;
	CMDIFrameWnd		*	pFrame;
	CMDIChildWnd		*	pChild;
	CMYFUSIONView       *	pView;
	CMYFUSIONDoc	*	pDoc = GetDocument();
	((CMYFUSIONApp*)AfxGetApp())->OnNewNullFile();	
	pDocTemplate =	(CMultiDocTemplate*)pDoc->GetDocTemplate();
	pos		  	 =	pDocTemplate->GetFirstDocPosition( );
	while(pos)
	{
		pDoc = (CMYFUSIONDoc*)pDocTemplate->GetNextDoc(*(&pos)) ;
	}
	CString caption;
	caption=_T("FusionResult[HIS]");
	pDoc->SetTitle(caption);
	pDoc->lpPathName=_T("FusionResult");
	pDoc->ReplaceHDIB( hDib );  
	pDoc->InitDIBData();
	m_isfusion=TRUE;
	Invalidate(FALSE);
	pFrame = (CMDIFrameWnd  *) AfxGetApp()->m_pMainWnd ;
	pChild = (CMDIChildWnd  *) pFrame->GetActiveFrame();
	pView  = (CMYFUSIONView *) pChild->GetActiveView() ;
 	pView->OnInitialUpdate();
	m_algrithm=5;
//	OnEnvalueFuction();
}

void CMYFUSIONView::OnFusionYiq() 
{
	// TODO: Add your command handler code here
		CMYFUSIONApp* app=(CMYFUSIONApp*)AfxGetApp();//获得当前APP
	POSITION p = app->GetFirstDocTemplatePosition(); //p是第一个文档模板的首位置
	while(p!= NULL) 
	{ 
		CDocTemplate * pDocTemplate = app->GetNextDocTemplate(p);// 获取第一个文档模板的首位置指针
		POSITION p1 = pDocTemplate->GetFirstDocPosition(); //p1是第一个文档模板中第一个文档的首位置
		while(p1 != NULL) 
		{ 
			CMYFUSIONDoc * pDocument = (CMYFUSIONDoc*)pDocTemplate->GetNextDoc(p1); //pDocument是第一个文档模板中第一个文档的首位置指针
			if(pDocument->GetPathName()==app->pathname1)
			{
		    	hpan=pDocument->m_hDIB;
			}
	    	 if(pDocument->GetPathName()==app->pathname2)
			{
				hmul=pDocument->m_hDIB;
			}
		} 
	}
	if(hmul==NULL || hpan==NULL)
	{
		AfxMessageBox("必须选择两幅影像!",MB_ICONSTOP);	
		return ;
	}
	if(hmul==hpan)
	{
		AfxMessageBox("不可以出现两幅相同的影像!",MB_ICONSTOP);
		return ;
	}
	
	LPSTR  mulDIB,panDIB; //指向图像的指针
	BYTE * colorimage;//指向彩色图像的数据区位置
	BYTE * panimage;//指向全色图像的数据区位置
	mulDIB= (LPSTR) ::GlobalLock((HGLOBAL) hmul);
	colorimage=(BYTE *)FindDIBBits(mulDIB);
	panDIB= (LPSTR) ::GlobalLock((HGLOBAL) hpan);
	panimage =(BYTE *)FindDIBBits(panDIB);
	CFusionAlgrithm  imageFusion;
	HDIB hDib=imageFusion.YIQFUSION (hmul,hpan);
	if(hDib == NULL)
	{
		AfxMessageBox("融合失败!",MB_ICONSTOP);
		return ;
	}
	CMultiDocTemplate	*	pDocTemplate;
	POSITION				pos;
	CMDIFrameWnd		*	pFrame;
	CMDIChildWnd		*	pChild;
	CMYFUSIONView       *	pView;
   	CMYFUSIONDoc	*	pDoc = GetDocument();
	
	((CMYFUSIONApp*)AfxGetApp())->OnNewNullFile();
	pDocTemplate	=	(CMultiDocTemplate*)pDoc->GetDocTemplate();
	pos				=	pDocTemplate->GetFirstDocPosition( );
	while(pos)
	{
		pDoc = (CMYFUSIONDoc*)pDocTemplate->GetNextDoc(*(&pos)) ;
	}
	CString caption;
	caption=_T("FusionResult[YIQ]");
	pDoc->SetTitle(caption);
	pDoc->lpPathName=_T("FusionResult");
	pDoc->ReplaceHDIB( hDib );  
	pDoc->InitDIBData();
	m_algrithm=8;
	m_isfusion=TRUE;
	Invalidate(FALSE);
	pFrame = (CMDIFrameWnd  *) AfxGetApp()->m_pMainWnd ;
	pChild = (CMDIChildWnd  *) pFrame->GetActiveFrame();
	pView  = (CMYFUSIONView *) pChild->GetActiveView() ;
	pView->OnInitialUpdate();
	
}

void CMYFUSIONView::OnFusionAverage() 
{
	//系数加权平均法
	//分别获取两个图像的指针
	CMYFUSIONApp* app=(CMYFUSIONApp*)AfxGetApp();//获得当前APP
	POSITION p = app->GetFirstDocTemplatePosition(); //p是第一个文档模板的首位置
	while(p!= NULL) 
	{ 
		CDocTemplate * pDocTemplate = app->GetNextDocTemplate(p);// 获取第一个文档模板的首位置指针
		POSITION p1 = pDocTemplate->GetFirstDocPosition(); //p1是第一个文档模板中第一个文档的首位置
		while(p1 != NULL) 
		{ 
			CMYFUSIONDoc * pDocument = (CMYFUSIONDoc*)pDocTemplate->GetNextDoc(p1); //pDocument是第一个文档模板中第一个文档的首位置指针
			if(pDocument->GetPathName()==app->pathname1)
			{
		    	hpan=pDocument->m_hDIB;
			}
	    	 if(pDocument->GetPathName()==app->pathname2)
			{
				hmul=pDocument->m_hDIB;
			}
		} 
	}
	if(hmul==hpan)
	{
		AfxMessageBox("不可以出现两幅相同的影像!",MB_ICONSTOP);
		return ;
	}
	
	LPSTR  mulDIB,panDIB; //指向图像的指针
	BYTE * colorimage;//指向彩色图像的数据区位置
	BYTE * panimage;//指向全色图像的数据区位置
	mulDIB= (LPSTR) ::GlobalLock((HGLOBAL) hmul);	
	panDIB= (LPSTR) ::GlobalLock((HGLOBAL) hpan);
	if(mulDIB==NULL || mulDIB==NULL)
	{
		AfxMessageBox("必须选择两幅影像!",MB_ICONSTOP);	
		return ;
	}
	colorimage=(BYTE *)FindDIBBits(mulDIB);
	panimage =(BYTE *)FindDIBBits(panDIB);
	CFusionAlgrithm  imageFusion;
	HDIB hDib=imageFusion.AVERAGEFUSION (hmul,hpan);
	if(hDib == NULL)
	{
		AfxMessageBox("融合失败!",MB_ICONSTOP);
		return ;
	}

	CMultiDocTemplate	*	pDocTemplate;
	POSITION				pos;
	CMDIFrameWnd		*	pFrame;
	CMDIChildWnd		*	pChild;
	CMYFUSIONView       *	pView;
   	CMYFUSIONDoc	*	pDoc = GetDocument();
 	((CMYFUSIONApp*)AfxGetApp())->OnNewNullFile();
	pDocTemplate =	(CMultiDocTemplate*)pDoc->GetDocTemplate();
	pos		  	 =	pDocTemplate->GetFirstDocPosition( );
	while(pos)
	{
		pDoc = (CMYFUSIONDoc*)pDocTemplate->GetNextDoc(*(&pos)) ;
	}
	CString caption;
	caption=_T("FusionResult[Average]");
	pDoc->SetTitle(caption);
	pDoc->lpPathName=_T("FusionResult");
	pDoc->ReplaceHDIB( hDib );  
	pDoc->InitDIBData();
	Invalidate(FALSE);
	m_isfusion=TRUE;
	m_algrithm=1;
	pFrame = (CMDIFrameWnd  *) AfxGetApp()->m_pMainWnd ;
	pChild = (CMDIChildWnd  *) pFrame->GetActiveFrame();
	pView  = (CMYFUSIONView *) pChild->GetActiveView() ;
	pView->OnInitialUpdate();
}




void CMYFUSIONView::OnFusionOpenimage() 
{
	// TODO: Add your command handler code here
	CDLGOPEN dlg;
	if(dlg.DoModal() == IDOK)
	{
		CMYFUSIONApp* app=(CMYFUSIONApp*)AfxGetApp();//获得当前APP
		app->OpenDocumentFile(dlg.m_pan);//打开全色图像
        app->OpenDocumentFile(dlg.m_mul );//打开多光谱图像
		app->pathname1=dlg.m_pan;
		app->pathname2=dlg.m_mul;
//		m_isfusion=FALSE;
	}

}

void CMYFUSIONView::OnFeatureCanny() 
{
	// TODO: Add your command handler code here
	//更改光标形状
	BeginWaitCursor(); 
	
	//只能处理全色图像
     CMYFUSIONDoc* pDoc = GetDocument();
	 ASSERT_VALID(pDoc);
     LPSTR m_view;
	 BYTE * m_image;
	 HDIB hdib;
	 hdib=pDoc->GetHDIB();
	 m_view= (LPSTR) ::GlobalLock((HGLOBAL) hdib);
	 if( m_view == NULL )
	 {
		 AfxMessageBox("该图象为空!",MB_ICONSTOP);
		 return ;
	 } 

	 //判断是否为全色图像?// 判断是否是8-bpp位图
	 if (DIBBitCount(hdib) != 8)
	 {
		
		 MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
			 MB_ICONINFORMATION | MB_OK);
		 return;
	 }

	 //获取图像的尺寸
	 int wide,height,WIDE,DibWidth;
	 int x,y;
	 m_image=(BYTE *)FindDIBBits(m_view);
	 wide=::DIBWidth(m_view);//取宽的像素个数
	 height=::DIBHeight(m_view);
	 WIDE=((wide*8)+31)/32*4;//取宽为4的整数倍 
	 DibWidth=3*wide+( sizeof(DWORD)- 3*wide %sizeof(DWORD) )%sizeof(DWORD);//取得原图的每行总位数
	 
	 // 开辟内存,存储图象数据
	 unsigned char  * pUnchImage = new unsigned char[WIDE*height];	
	 for( y=0; y<height; y++)
	 {
		 for( x=0; x<WIDE; x++)
		 {
			 pUnchImage[y*WIDE+x] = m_image[y*WIDE+x];
		 }
	 }
	 
	 // canny算子计算后的结果

	 LPSTR outview;
	 BYTE * outimage;  //输出图像的数据区位置
	 HDIB HOUT;
	 
	 HOUT=(HDIB)::GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)+256*4+DibWidth*height);//生成一个新的图像句柄
	 if(!HOUT){	return ;	}
	 
	 outview	= (LPSTR)::GlobalLock((HGLOBAL)HOUT);
	 memcpy(outview,m_view,sizeof(BITMAPINFOHEADER)+256*4);//sizeof(BITMAPINFOHEADER)=40,颜色表长度为356*4
	 outimage= (BYTE *) FindDIBBits (outview);


	 
	 // 调用canny函数进行边界提取
    CFeatureAlgrithm  feature;
	 feature.CCanny (pUnchImage, WIDE, height, 0.4, 0.4, 0.79, outimage);

	 for(y=0; y<height; y++)
	 {
		 for(x=0; x<WIDE; x++)
		 {
			outimage[y*WIDE+x]=(unsigned char)(255-outimage[y*WIDE+x]);
		 }
	 }

	 CMultiDocTemplate	*	pDocTemplate;
	 POSITION				pos;
	 CMDIFrameWnd		*	pFrame;
	 CMDIChildWnd		*	pChild;
	 CMYFUSIONView       *	pView;
	 pDoc = GetDocument();
	 
	 ((CMYFUSIONApp*)AfxGetApp())->OnNewNullFile();
	 pDocTemplate =	(CMultiDocTemplate*)pDoc->GetDocTemplate();
	 pos		  	 =	pDocTemplate->GetFirstDocPosition( );
	 while(pos)
	 {
		 pDoc = (CMYFUSIONDoc*)pDocTemplate->GetNextDoc(*(&pos)) ;
	 }
	 CString caption;
	 caption=_T("CannyResult");
	 pDoc->SetTitle(caption);
	 pDoc->lpPathName=_T("CannyResult");
	 pDoc->ReplaceHDIB( HOUT );  
	 pDoc->InitDIBData();
	 Invalidate(FALSE);
	 pFrame = (CMDIFrameWnd  *) AfxGetApp()->m_pMainWnd ;
	 pChild = (CMDIChildWnd  *) pFrame->GetActiveFrame();
	 pView  = (CMYFUSIONView *) pChild->GetActiveView() ;
	 pView->OnInitialUpdate();

	 delete []pUnchImage;
	 pUnchImage = NULL  ;
	 
	 // 恢复光标形状
	 EndWaitCursor(); 
	 
	 // 设置脏标记
	 pDoc->SetModifiedFlag(TRUE);
	 
	 // 更新视图
	 pDoc->UpdateAllViews(NULL);
	 


}

void CMYFUSIONView::OnFusionDaverage() 
{
	// TODO: Add your command handler code here
	CMYFUSIONApp* app=(CMYFUSIONApp*)AfxGetApp();//获得当前APP
	POSITION p = app->GetFirstDocTemplatePosition(); //p是第一个文档模板的首位置
	while(p!= NULL) 
	{ 
		CDocTemplate * pDocTemplate = app->GetNextDocTemplate(p);// 获取第一个文档模板的首位置指针
		POSITION p1 = pDocTemplate->GetFirstDocPosition(); //p1是第一个文档模板中第一个文档的首位置
		while(p1 != NULL) 
		{ 
			CMYFUSIONDoc * pDocument = (CMYFUSIONDoc*)pDocTemplate->GetNextDoc(p1); //pDocument是第一个文档模板中第一个文档的首位置指针
			if(pDocument->GetPathName()==app->pathname1)
			{
				hpan=pDocument->m_hDIB;
			}
			if(pDocument->GetPathName()==app->pathname2)
			{
				hmul=pDocument->m_hDIB;
			}
		} 
	}
	if(hmul==NULL || hpan==NULL)
	{
		AfxMessageBox("必须选择两幅影像!",MB_ICONSTOP);	
		return ;
	}
	if(hmul==hpan)
	{
		AfxMessageBox("不可以出现两幅相同的影像!",MB_ICONSTOP);
		return ;
	}
	
	LPSTR  mulDIB,panDIB; //指向图像的指针
	BYTE * colorimage;//指向彩色图像的数据区位置
	BYTE * panimage;//指向全色图像的数据区位置
	mulDIB= (LPSTR) ::GlobalLock((HGLOBAL) hmul);
	colorimage=(BYTE *)FindDIBBits(mulDIB);
	panDIB= (LPSTR) ::GlobalLock((HGLOBAL) hpan);
	panimage =(BYTE *)FindDIBBits(panDIB);
	CFusionAlgrithm  imageFusion;
	HDIB hDib=imageFusion.DAVERAGEFUSION (hmul,hpan);
	if(hDib == NULL)
	{
		AfxMessageBox("融合失败!",MB_ICONSTOP);
		return ;
	}
	
	CMultiDocTemplate	*	pDocTemplate;
	POSITION				pos;
	CMDIFrameWnd		*	pFrame;
	CMDIChildWnd		*	pChild;
	CMYFUSIONView       *	pView;
   	CMYFUSIONDoc	*	pDoc = GetDocument();
	((CMYFUSIONApp*)AfxGetApp())->OnNewNullFile();
	pDocTemplate =	(CMultiDocTemplate*)pDoc->GetDocTemplate();
	pos		  	 =	pDocTemplate->GetFirstDocPosition( );
	while(pos)
	{
		pDoc = (CMYFUSIONDoc*)pDocTemplate->GetNextDoc(*(&pos)) ;
	}
	CString caption;
	caption=_T("FusionResult[DirectAverage]");
	pDoc->SetTitle(caption);
	pDoc->lpPathName=_T("FusionResult");
	pDoc->ReplaceHDIB( hDib );  
	pDoc->InitDIBData();
	m_algrithm=4;
	Invalidate(FALSE);
	m_isfusion=TRUE;
	pFrame = (CMDIFrameWnd  *) AfxGetApp()->m_pMainWnd ;
	pChild = (CMDIChildWnd  *) pFrame->GetActiveFrame();
	pView  = (CMYFUSIONView *) pChild->GetActiveView() ;
	pView->OnInitialUpdate();
}

void CMYFUSIONView::OnFusionBrovey() 
{
	// TODO: Add your command handler code here

⌨️ 快捷键说明

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