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

📄 myfusionview.cpp

📁 影像融合与融合精度评价源码影像融合与融合精度评价源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	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.BROVEYFUSION (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[Brovey]");
	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();
}

void CMYFUSIONView::OnFeatureSobel() 
{
	// 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 ;
	}

	m_image=(BYTE *)FindDIBBits(m_view);

	//判断是否为全色图像?// 判断是否是8-bpp位图
	if (DIBBitCount(hdib) != 8)
	{
		
		MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
			MB_ICONINFORMATION | MB_OK);
		return;
	}
	
	//获取图像的尺寸
	int wide,height,WIDE;
	int x,y;
	wide=::DIBWidth(m_view);//取宽的像素个数
	height=::DIBHeight(m_view);
	WIDE=((wide*8)+31)/32*4;//取宽为4的整数倍 
	// 开辟内存,存储图象数据
	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];
		}
	}
	
	// SOBEL算子计算后的结果
	LPSTR outview;
	BYTE * outimage;  //输出图像的数据区位置
	HDIB HOUT;
	
	HOUT=(HDIB)::GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)+256*4+WIDE*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);

	// 指向梯度数据的指针
	double * pdGrad;
	
	// 按照图像的大小开辟内存空间,存储梯度计算的结果
	pdGrad=new double[height*WIDE];
	// 调用EL函数进行边界提取
    CFeatureAlgrithm  feature;
	feature.SobelOperator(m_view,pdGrad);
	
	for(y=0; y<height ; y++ )
		for(x=0 ; x<WIDE ; x++ )
		{
			if(*(pdGrad+y*WIDE+x)>50)
				*(	outimage+y*WIDE+x	)=0;
			else
				*(	outimage+y*WIDE+x	)=255;			
		}

		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("SobelResult");
		pDoc->SetTitle(caption);
		pDoc->lpPathName=_T("SobelResult");
		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::OnFeatureRoberts() 
{
	// TODO: Add your command handler code here
	//更改光标形状
	BeginWaitCursor(); 
	
	// 循环控制变量
	int y;
	int x;
	//只能处理全色图像
	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 ;
	}
	//图像数据的指针
	m_image=(BYTE *)FindDIBBits(m_view);
	//判断是否为全色图像?// 判断是否是8-bpp位图
	if (DIBBitCount(hdib) != 8)
	{
		
		MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
			MB_ICONINFORMATION | MB_OK);
		return;
	}
	
	//获取图像的尺寸
	int wide,height,WIDE;
	wide=::DIBWidth(m_view);//取宽的像素个数
	height=::DIBHeight(m_view);
	WIDE=((wide*8)+31)/32*4;//取宽为4的整数倍 
	LPSTR outview;
	BYTE * outimage;  //输出图像的数据区位置
	HDIB HOUT;
	
	HOUT=(HDIB)::GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)+256*4+WIDE*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);

	
	// 指向梯度数据的指针
	double * pdGrad;
	
	// 按照图像的大小开辟内存空间,存储梯度计算的结果
	pdGrad=new double[height*WIDE];

	
	// 应用Roberts算子求梯度
	CFeatureAlgrithm  feature;
	feature.RobertsOperator(m_view, pdGrad);
	
	
	for(y=0; y<height ; y++ )
		for(x=0 ; x<WIDE ; x++ )
		{
			if(*(pdGrad+y*WIDE+x)>50)
				*(	outimage+y*WIDE+x	)=0;
			else
				*(	outimage+y*WIDE+x	)=255;			
		}
		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("RobertsResult");
		pDoc->SetTitle(caption);
		pDoc->lpPathName=_T("RobertsResult");
		pDoc->ReplaceHDIB( HOUT );  
		pDoc->InitDIBData();
		Invalidate(FALSE);
		pFrame = (CMDIFrameWnd  *) AfxGetApp()->m_pMainWnd ;
		pChild = (CMDIChildWnd  *) pFrame->GetActiveFrame();
		pView  = (CMYFUSIONView *) pChild->GetActiveView() ;
		pView->OnInitialUpdate();
		//释放梯度结果使用的内存空间
		delete []pdGrad;
		pdGrad=NULL;
		
		// 恢复光标形状
		EndWaitCursor(); 
		
		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);
		
		// 更新视图
		pDoc->UpdateAllViews(NULL);
}

void CMYFUSIONView::OnFusionCansobl() 
{
	// 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.CANNYSOBELFUSION(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)) ;
	}
	pDoc->lpPathName=_T("FusionResult");
	pDoc->ReplaceHDIB( hpan );  
	pDoc->InitDIBData();
	m_isfusion=TRUE;
	Invalidate(FALSE);
	pFrame = (CMDIFrameWnd  *) AfxGetApp()->m_pMainWnd ;
	pChild = (CMDIChildWnd  *) pFrame->GetActiveFrame();
	pView  = (CMYFUSIONView *) pChild->GetActiveView() ;
	pView->OnInitialUpdate();
}

void CMYFUSIONView::OnFusionHpf() 
{
	// 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.HPFFUSION (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[HPF]");
	pDoc->SetTitle(caption);
	pDoc->lpPathName=_T("FusionResult");
	pDoc->ReplaceHDIB( hDib );  
	pDoc->InitDIBData();
	Invalidate(FALSE);
	m_algrithm=6;
	m_isfusion=TRUE;
	pFrame = (CMDIFrameWnd  *) AfxGetApp()->m_pMainWnd ;
	pChild = (CMDIChildWnd  *) pFrame->GetActiveFrame();
	pView  =

⌨️ 快捷键说明

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