📄 demoview.cpp
字号:
//判断是否二值图像
int i, j;
CSize size=pDib->GetDimensions();
int lineByte=(size.cx+3)/4*4;
int flag=1;
for(i=0;i<size.cy;i++){
for(j=0; j<size.cx;j++){
//如果图像的数据像素灰度值既不为0也不为255,则非二值图像
if(*(pDib->m_pImgData+i*lineByte+j)!=0
&&*(pDib->m_pImgData+i*lineByte+j)!=255){
flag=0;
break;
}
}
}
//非二值图像
if(!flag){
::MessageBox(0,"需要输入二值图像",MB_OK,0);
return ;
}
//定义形态学类的对象morph,并用当前DIB为其初始化
Morphology morph(size,pDib->m_nBitCount,pDib->m_lpColorTable, pDib->m_pImgData);
//形态学结构元素选择对话框
MaskDefineDlg dlgPara;
//缺省的结构元素模板
dlgPara.m_defineMask[7]=1;
dlgPara.m_defineMask[11]=1;
dlgPara.m_defineMask[12]=1;
dlgPara.m_defineMask[13]=1;
dlgPara.m_defineMask[17]=1;
if(dlgPara.DoModal()==IDOK){
//验证结构元素的有效性
if(ValidBinaryMorphMask(dlgPara.m_defineMask,5,5)==0){
::MessageBox(0,"结构元素输入有误,只能是0和1的数,且至少有一个以上的1!",MB_OK,0);
return;
}
//输入结构元素
morph.InputMask(dlgPara.m_defineMask,5,5);
//二值开
morph.BinaryOpen();
//新建视图,显示处理结果
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
ImgCenterDib *dibNew=pDocNew->GetPDib();
dibNew->ReplaceDib(morph.GetDimensions(),morph.m_nBitCountOut,morph.m_lpColorTableOut, morph.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
}
void CDemoView::OnCloseForBinary()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度图像
if(pDib->m_nBitCount!=8){
::MessageBox(0,"只处理灰度图像",MB_OK,0);
return ;
}
//判断是否二值图像
int i, j;
CSize size=pDib->GetDimensions();
int lineByte=(size.cx+3)/4*4;
int flag=1;
for(i=0;i<size.cy;i++){
for(j=0; j<size.cx;j++){
//如果图像的数据像素灰度值既不为0也不为255,则非二值图像
if(*(pDib->m_pImgData+i*lineByte+j)!=0
&&*(pDib->m_pImgData+i*lineByte+j)!=255){
flag=0;
break;
}
}
}
//非二值图像
if(!flag){
::MessageBox(0,"需要输入二值图像",MB_OK,0);
return ;
}
//定义形态学类的对象morph,并用当前DIB为其初始化
Morphology morph(size,pDib->m_nBitCount,pDib->m_lpColorTable, pDib->m_pImgData);
//形态学结构元素选择对话框
MaskDefineDlg dlgPara;
//缺省的结构元素模板
dlgPara.m_defineMask[7]=1;
dlgPara.m_defineMask[11]=1;
dlgPara.m_defineMask[12]=1;
dlgPara.m_defineMask[13]=1;
dlgPara.m_defineMask[17]=1;
if(dlgPara.DoModal()==IDOK){
//验证结构元素的有效性
if(ValidBinaryMorphMask(dlgPara.m_defineMask,5,5)==0){
::MessageBox(0,"结构元素输入有误,只能是0和1的数,且至少有一个以上的1!",MB_OK,0);
return;
}
//输入结构元素
morph.InputMask(dlgPara.m_defineMask,5,5);
//二值闭
morph.BinaryClose();
//新建视图,显示处理结果
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
ImgCenterDib *dibNew=pDocNew->GetPDib();
dibNew->ReplaceDib(morph.GetDimensions(),morph.m_nBitCountOut,morph.m_lpColorTableOut, morph.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
}
void CDemoView::OnInnerEdgeForBinary()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度图像
if(pDib->m_nBitCount!=8){
::MessageBox(0,"只处理灰度图像",MB_OK,0);
return ;
}
//判断是否二值图像
int i, j;
CSize size=pDib->GetDimensions();
int lineByte=(size.cx+3)/4*4;
int flag=1;
for(i=0;i<size.cy;i++){
for(j=0; j<size.cx;j++){
//如果图像的数据像素灰度值既不为0也不为255,则非二值图像
if(*(pDib->m_pImgData+i*lineByte+j)!=0
&&*(pDib->m_pImgData+i*lineByte+j)!=255){
flag=0;
break;
}
}
}
//非二值图像
if(!flag){
::MessageBox(0,"需要输入二值图像",MB_OK,0);
return ;
}
//定义形态学类的对象morph,并用当前DIB为其初始化
Morphology morph(size,pDib->m_nBitCount,pDib->m_lpColorTable, pDib->m_pImgData);
//形态学结构元素选择对话框
MaskDefineDlg dlgPara;
//缺省的结构元素模板
dlgPara.m_defineMask[7]=1;
dlgPara.m_defineMask[11]=1;
dlgPara.m_defineMask[12]=1;
dlgPara.m_defineMask[13]=1;
dlgPara.m_defineMask[17]=1;
if(dlgPara.DoModal()==IDOK){
//验证结构元素的有效性
if(ValidBinaryMorphMask(dlgPara.m_defineMask,5,5)==0){
::MessageBox(0,"结构元素输入有误,只能是0和1的数,且至少有一个以上的1!",MB_OK,0);
return;
}
//输入结构元素
morph.InputMask(dlgPara.m_defineMask,5,5);
//二值形态学内边界
morph.BinaryInnerEdge();
//新建视图,显示处理结果
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
ImgCenterDib *dibNew=pDocNew->GetPDib();
dibNew->ReplaceDib(morph.GetDimensions(),morph.m_nBitCountOut,morph.m_lpColorTableOut, morph.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
}
void CDemoView::OnOuterEdgeForBinary()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度图像
if(pDib->m_nBitCount!=8){
::MessageBox(0,"只处理灰度图像",MB_OK,0);
return ;
}
//判断是否二值图像
int i, j;
CSize size=pDib->GetDimensions();
int lineByte=(size.cx+3)/4*4;
int flag=1;
for(i=0;i<size.cy;i++){
for(j=0; j<size.cx;j++){
//如果图像的数据像素灰度值既不为0也不为255,则非二值图像
if(*(pDib->m_pImgData+i*lineByte+j)!=0
&&*(pDib->m_pImgData+i*lineByte+j)!=255){
flag=0;
break;
}
}
}
//非二值图像
if(!flag){
::MessageBox(0,"需要输入二值图像",MB_OK,0);
return ;
}
//定义形态学类的对象morph,并用当前DIB为其初始化
Morphology morph(size,pDib->m_nBitCount,pDib->m_lpColorTable, pDib->m_pImgData);
//形态学结构元素选择对话框
MaskDefineDlg dlgPara;
//缺省的结构元素模板
dlgPara.m_defineMask[7]=1;
dlgPara.m_defineMask[11]=1;
dlgPara.m_defineMask[12]=1;
dlgPara.m_defineMask[13]=1;
dlgPara.m_defineMask[17]=1;
if(dlgPara.DoModal()==IDOK){
//验证结构元素的有效性
if(ValidBinaryMorphMask(dlgPara.m_defineMask,5,5)==0){
::MessageBox(0,"结构元素输入有误,只能是0和1的数,且至少有一个以上的1!",MB_OK,0);
return;
}
//输入结构元素
morph.InputMask(dlgPara.m_defineMask,5,5);
//二值形态学外边界
morph.BinaryOuterEdge();
//新建视图,显示处理结果
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
ImgCenterDib *dibNew=pDocNew->GetPDib();
dibNew->ReplaceDib(morph.GetDimensions(),morph.m_nBitCountOut,morph.m_lpColorTableOut, morph.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
}
void CDemoView::OnMorphoContourForBinary()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度图像
if(pDib->m_nBitCount!=8){
::MessageBox(0,"只处理灰度图像",MB_OK,0);
return ;
}
//判断是否二值图像
int i, j;
CSize size=pDib->GetDimensions();
int lineByte=(size.cx+3)/4*4;
int flag=1;
for(i=0;i<size.cy;i++){
for(j=0; j<size.cx;j++){
//如果图像的数据像素灰度值既不为0也不为255,则非二值图像
if(*(pDib->m_pImgData+i*lineByte+j)!=0
&&*(pDib->m_pImgData+i*lineByte+j)!=255){
flag=0;
break;
}
}
}
//非二值图像
if(!flag){
::MessageBox(0,"需要输入二值图像",MB_OK,0);
return ;
}
//定义形态学类的对象morph,并用当前DIB为其初始化
Morphology morph(size,pDib->m_nBitCount,pDib->m_lpColorTable, pDib->m_pImgData);
//形态学结构元素选择对话框
MaskDefineDlg dlgPara;
//缺省的结构元素模板
dlgPara.m_defineMask[7]=1;
dlgPara.m_defineMask[11]=1;
dlgPara.m_defineMask[12]=1;
dlgPara.m_defineMask[13]=1;
dlgPara.m_defineMask[17]=1;
if(dlgPara.DoModal()==IDOK){
//验证结构元素的有效性
if(ValidBinaryMorphMask(dlgPara.m_defineMask,5,5)==0){
::MessageBox(0,"结构元素输入有误,只能是0和1的数,且至少有一个以上的1!",MB_OK,0);
return;
}
//输入结构元素
morph.InputMask(dlgPara.m_defineMask,5,5);
//二值形态学边界
morph.BinaryContour();
//新建视图,显示处理结果
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
ImgCenterDib *dibNew=pDocNew->GetPDib();
dibNew->ReplaceDib(morph.GetDimensions(),morph.m_nBitCountOut,morph.m_lpColorTableOut, morph.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
}
void CDemoView::OnHitMissThinning()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度图像
if(pDib->m_nBitCount!=8){
::MessageBox(0,"只处理灰度图像",MB_OK,0);
return ;
}
//判断是否二值图像
int i, j;
CSize size=pDib->GetDimensions();
int lineByte=(size.cx+3)/4*4;
int flag=1;
for(i=0;i<size.cy;i++){
for(j=0; j<size.cx;j++){
//如果图像的数据像素灰度值既不为0也不为255,则非二值图像
if(*(pDib->m_pImgData+i*lineByte+j)!=0
&&*(pDib->m_pImgData+i*lineByte+j)!=255){
flag=0;
break;
}
}
}
//非二值图像
if(!flag){
::MessageBox(0,"需要输入二值图像",MB_OK,0);
return ;
}
//定义形态学类的对象morph,并用当前DIB为其初始化
Morphology morph(pDib->GetDimensions(),pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);
//击中击不中进行细化的结构元素是内部定义的,不需要输入
//morph.InputMask(mask);
//击中击不中变换进行细化
morph.MorphoThinning();
//新建视图,显示处理结果
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
ImgCenterDib *dibNew=pDocNew->GetPDib();
dibNew->ReplaceDib(morph.GetDimensions(),morph.m_nBitCountOut,morph.m_lpColorTableOut, morph.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
void CDemoView::OnErosionForGray()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度图像
if(pDib->m_nBitCount!=8){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -