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

📄 demoview.cpp

📁 将数字图像处理的一般算法都集中在一个MFC的框架中
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	
	//判断是否二值图像
	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 + -