📄 myfusionview.cpp
字号:
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 + -