www.pudn.com > 医学图像处理示例源代码.rar > ImageLABDoc.cpp
// ImageLABDoc.cpp : implementation of the CImageLABDoc class // #include "stdafx.h" #include "ImageLAB.h" #include "AllImage.h" #include "ImageLABDoc.h" #include "ImageLABView.h" #include "UseDlgs.h" #include "CommonProc.h" #include "ImageProcess.h" #include "MainFrm.h" #include#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // CImageLABDoc IMPLEMENT_DYNCREATE(CImageLABDoc, CDocument) BEGIN_MESSAGE_MAP(CImageLABDoc, CDocument) //{{AFX_MSG_MAP(CImageLABDoc) ON_COMMAND(ID_CCWROTATE, OnCcwrotate) ON_COMMAND(ID_CWROTATE, OnCwrotate) ON_COMMAND(ID_HORFLIP, OnHorflip) ON_COMMAND(ID_VERTFLIP, OnVertflip) ON_COMMAND(ID_SHOWBLUECOMPONENT, OnShowbluecomponent) ON_UPDATE_COMMAND_UI(ID_SHOWBLUECOMPONENT, OnUpdateShowbluecomponent) ON_COMMAND(ID_SHOWGREENCOMPONENT, OnShowgreencomponent) ON_UPDATE_COMMAND_UI(ID_SHOWGREENCOMPONENT, OnUpdateShowgreencomponent) ON_COMMAND(ID_SHOWHUECOMPONENT, OnShowhuecomponent) ON_UPDATE_COMMAND_UI(ID_SHOWHUECOMPONENT, OnUpdateShowhuecomponent) ON_COMMAND(ID_SHOWINTCOMPONENT, OnShowintcomponent) ON_UPDATE_COMMAND_UI(ID_SHOWINTCOMPONENT, OnUpdateShowintcomponent) ON_COMMAND(ID_SHOWREDCOMPONENT, OnShowredcomponent) ON_UPDATE_COMMAND_UI(ID_SHOWREDCOMPONENT, OnUpdateShowredcomponent) ON_COMMAND(ID_SHOWRGBIMAGE, OnShowrgbimage) ON_UPDATE_COMMAND_UI(ID_SHOWRGBIMAGE, OnUpdateShowrgbimage) ON_COMMAND(ID_SHOWSATCOMPONENT, OnShowsatcomponent) ON_UPDATE_COMMAND_UI(ID_SHOWSATCOMPONENT, OnUpdateShowsatcomponent) ON_COMMAND(ID_INVERSEIMAGE, OnInverseimage) ON_COMMAND(ID_IMAGEINFO, OnImageinfo) ON_COMMAND(ID_YCL_SHARPEN_SOBEL, OnYclSharpenSobel) ON_COMMAND(ID_EDIT_UNDO, OnEditUndo) ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo) ON_COMMAND(ID_YCL_SHARPEN_PREWITT, OnYclSharpenPrewitt) ON_COMMAND(ID_YCL_SHARPEN_ROBERTS, OnYclSharpenRoberts) ON_COMMAND(ID_YCL_SEGMENT_MANUALBINARY, OnYclSegmentManualbinary) ON_COMMAND(ID_YCL_ENHANCEMENT_LAPLACIAN, OnYclEnhancementLaplacian) ON_COMMAND(ID_YCL_ENHANCEMENT_WALLIS, OnYclEnhancementWallis) ON_COMMAND(ID_YCL_SMOOTHING_MEAN, OnYclSmoothingMean) ON_COMMAND(ID_YCL_SMOOTHING_NONRMIDDLE, OnYclSmoothingNonrmiddle) ON_COMMAND(ID_YCL_SMOOTHING_RMIDDLE, OnYclSmoothingRmiddle) ON_COMMAND(ID_YCL_SMOOTHING_SUSAN, OnYclSmoothingSusan) ON_COMMAND(ID_YCL_SMOOTHING_FASTMIDDLE, OnYclSmoothingFastmiddle) ON_COMMAND(ID_YCL_ENHANCEMENT_LINEAR, OnYclEnhancementLinear) ON_COMMAND(ID_YCL_ENHANCEMENT_NONLINEAR, OnYclEnhancementNonlinear) ON_COMMAND(ID_YCL_ENHANCEMENT_HISTOGRAM, OnYclEnhancementHistogram) ON_COMMAND(ID_EDIT_UNDOALL, OnEditUndoall) ON_UPDATE_COMMAND_UI(ID_EDIT_UNDOALL, OnUpdateEditUndoall) ON_COMMAND(ID_YCL_SEGMENT_EDGE_SUSANNORMAL, OnYclSegmentEdgeSusannormal) ON_COMMAND(ID_YCL_SEGMENT_PRINCIPLE_NORMAL, OnYclSegmentPrincipleNormal) ON_COMMAND(ID_YCL_DESCRIPTION_BINARYHOUGH, OnYclDescriptionBinaryhough) ON_COMMAND(ID_YCL_DESCRIPTION_BINARYRADON, OnYclDescriptionBinaryradon) ON_COMMAND(ID_IMAGE_SHOWHISTOGRAM, OnImageShowhistogram) ON_UPDATE_COMMAND_UI(ID_YCL_DESCRIPTION_BINARYHOUGH, OnUpdate8BitImage) ON_COMMAND(ID_YCL_MORPHOLOGY_CLOSING, OnYclMorphologyClosing) ON_COMMAND(ID_YCL_MORPHOLOGY_DILATION, OnYclMorphologyDilation) ON_COMMAND(ID_YCL_MORPHOLOGY_EROSION, OnYclMorphologyErosion) ON_COMMAND(ID_YCL_MORPHOLOGY_OPENING, OnYclMorphologyOpening) ON_COMMAND(ID_YCL_SEGMENT_ROINVAROPERATOR, OnYclSegmentRoinvaroperator) ON_COMMAND(ID_YCL_SHARPEN_SOBEL_ANGLE, OnYclSharpenSobelAngle) ON_COMMAND(ID_YCL_DESCRIPTION_EDGEORENTION_ROI, OnYclDescriptionEdgeorentionRoi) ON_COMMAND(ID_YCL_DESCRIPTION_BINARY_AREALABEL, OnYclDescriptionBinaryArealabel) ON_COMMAND(ID_CONVERTTOGRAYIMAGE, OnConverttograyimage) ON_UPDATE_COMMAND_UI(ID_CONVERTTOGRAYIMAGE, OnUpdateConverttograyimage) ON_COMMAND(ID_IMAGE_SHOWPYRAMIDIMAGE, OnImageShowpyramidimage) ON_COMMAND(ID_YCL_ENHANCEMENT_GAUSSRING, OnYclEnhancementGaussring) ON_COMMAND(ID_YCL_SMOOTHING_GAUSSBLUR, OnYclSmoothingGaussblur) ON_COMMAND(ID_YCL_SEGMENT_EDGE_MARRHILDRETH, OnYclSegmentEdgeMarrhildreth) ON_COMMAND(ID_YCL_SEGMENT_THIN_HILIDITCH, OnYclSegmentThinHiliditch) ON_COMMAND(ID_YCL_SEGMENT_THIN_SOMENEW, OnYclSegmentThinSomenew) ON_COMMAND(ID_YCL_SEGMENT_THIN_ZHANGSUEN, OnYclSegmentThinZhangsuen) ON_COMMAND(ID_YCL_BINARY_EDGE, OnYclBinaryEdge) ON_COMMAND(ID_IMAGE_SHOWMOSAICIMAGE, OnImageShowmosaicimage) ON_COMMAND(ID_YCL_DESCRIPTION_GRAY_DILATION, OnYclDescriptionGrayDilation) ON_COMMAND(ID_YCL_DESCRIPTION_GRAY_EROSION, OnYclDescriptionGrayErosion) ON_COMMAND(ID_YCL_DESCRIPTION_GRAY_CLOSING, OnYclDescriptionGrayClosing) ON_COMMAND(ID_YCL_DESCRIPTION_GRAY_OPENING, OnYclDescriptionGrayOpening) ON_COMMAND(ID_YCL_SEGMENT_AUTOBINARY, OnYclSegmentAutobinary) ON_COMMAND(ID_YCL_SEGMENT_AUTOBINARY1, OnYclSegmentAutobinary1) ON_COMMAND(ID_YCL_SEGMENT_AUTOBINARY2, OnYclSegmentAutobinary2) ON_COMMAND(ID_IMAGE_SHOWHISTOGRAM2, OnImageShowhistogram2) ON_COMMAND(ID_YCL_SEGMENT_EDGE_CANNY, OnYclSegmentEdgeCanny) ON_COMMAND(ID_YCL_SEGMENT_AUTOBINARY3, OnYclSegmentAutobinary3) ON_COMMAND(ID_YCL_SEGMENT_EDGE_SPATIAL_ZERNIKEMOMENT, OnYclSegmentEdgeSpatialZernikemoment) ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs) ON_COMMAND(ID_FILE_SAVE, OnFileSave) ON_UPDATE_COMMAND_UI(ID_YCL_DESCRIPTION_GRAY_DILATION, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_DESCRIPTION_GRAY_EROSION, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_DESCRIPTION_GRAY_CLOSING, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_DESCRIPTION_GRAY_OPENING, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_DESCRIPTION_BINARYRADON, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_ENHANCEMENT_HISTOGRAM, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_ENHANCEMENT_LAPLACIAN, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_ENHANCEMENT_LINEAR, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_ENHANCEMENT_NONLINEAR, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_ENHANCEMENT_WALLIS, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SEGMENT_AUTOBINARY, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SEGMENT_EDGE_SUSANNORMAL, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SEGMENT_MANUALBINARY, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SEGMENT_PRINCIPLE_NORMAL, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SHARPEN_PREWITT, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SHARPEN_ROBERTS, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SHARPEN_SOBEL, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SMOOTHING_FASTMIDDLE, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SMOOTHING_MEAN, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SMOOTHING_NONRMIDDLE, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SMOOTHING_RMIDDLE, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SMOOTHING_SPIN, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SMOOTHING_SUSAN, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_MORPHOLOGY_DILATION, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_MORPHOLOGY_EROSION, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_MORPHOLOGY_CLOSING, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_MORPHOLOGY_OPENING, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_ENHANCEMENT_GAUSSRING, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SMOOTHING_GAUSSBLUR, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SEGMENT_EDGE_MARRHILDRETH, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SEGMENT_THIN_HILIDITCH, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SEGMENT_THIN_SOMENEW, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SEGMENT_THIN_ZHANGSUEN, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_BINARY_EDGE, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_IMAGE_SHOWPYRAMIDIMAGE, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_IMAGE_SHOWMOSAICIMAGE, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_SHARPEN_SOBEL_ANGLE, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_DESCRIPTION_EDGEORENTION_ROI, OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_IMAGE_DES_INVARIANT_MOMENTS , OnUpdate8BitImage) ON_UPDATE_COMMAND_UI(ID_YCL_ENHANCEMENT_AUTOLEVELS , OnUpdate8BitImage) ON_COMMAND(ID_YCL_ENHANCEMENT_AUTOLEVELS, OnYclEnhancementAutolevels) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CImageLABDoc construction/destruction CImageLABDoc::CImageLABDoc() { Channel = 0; LineNum = 0; MetalLineGeted = FALSE; ImageFileName = "未命名图像文件"; //SaveFileDir = "ImageLAB Files"; } CImageLABDoc::~CImageLABDoc() { if(ImageFileName != "未命名图像文件") SetPathName(LPCTSTR(ImageFileName)); } BOOL CImageLABDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; // TODO: add reinitialization code here // (SDI documents will reuse this document) return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CImageLABDoc serialization void CImageLABDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: add storing code here } else { // TODO: add loading code here } } ///////////////////////////////////////////////////////////////////////////// // CImageLABDoc diagnostics #ifdef _DEBUG void CImageLABDoc::AssertValid() const { CDocument::AssertValid(); } void CImageLABDoc::Dump(CDumpContext& dc) const { CDocument::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CImageLABDoc commands //打开图像的消息响应函数 BOOL CImageLABDoc::OnOpenDocument(LPCTSTR lpszPathName) { if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; ImageFileName = lpszPathName; ImageDesFileName = ImageFileName + ".txt"; ImageName = GetNameformFullPathName(ImageFileName); if( Image.ReadImageFromFile(lpszPathName) ) { Image.BackUp(); return true; } else return false; } //保存图像的消息响应函数 BOOL CImageLABDoc::OnSaveDocument(LPCTSTR lpszPathName) { ImageFileName = lpszPathName; ImageDesFileName = ImageFileName + ".txt"; ImageName = GetNameformFullPathName(ImageFileName); return Image.SaveImageToFile(lpszPathName); } //撤销上一步命令的函数 void CImageLABDoc::OnEditUndo() { Image.ImgSwap(); UpdateAllViews(NULL); } void CImageLABDoc::OnUpdateEditUndo(CCmdUI* pCmdUI) { pCmdUI->Enable( IsModified() ); } //恢复到图像刚调入的时刻 void CImageLABDoc::OnEditUndoall() { Image.ReadImageFromFile((LPCTSTR)ImageFileName); UpdateAllViews(NULL); SetModifiedFlag(FALSE); } void CImageLABDoc::OnUpdateEditUndoall(CCmdUI* pCmdUI) { pCmdUI->Enable(IsModified( )); } //逆时针旋转图像 void CImageLABDoc::OnCcwrotate() { Image.Rotate90(FALSE); SmallImage.DeleteMe(); int tx, w = m_pView->ScrollSize.cx - 1; for(int i= 0; i< MAXPINNUM; i++) { if( m_pView->m_Pin[i] == NULL ) continue; tx = m_pView->m_PinPos[i].x; m_pView->m_PinPos[i].x = m_pView->m_PinPos[i].y; m_pView->m_PinPos[i].y = w - tx; m_pView->m_Pin[i]->MoveToPt(m_pView->m_PinPos[i]); } UpdateAllViews(NULL); SetModifiedFlag(); } //顺时针旋转图像 void CImageLABDoc::OnCwrotate() { Image.Rotate90(); SmallImage.DeleteMe(); int ty, h = m_pView->ScrollSize.cy - 1; for(int i= 0; i< MAXPINNUM; i++) { if( m_pView->m_Pin[i] == NULL ) continue; ty = m_pView->m_PinPos[i].y; m_pView->m_PinPos[i].y = m_pView->m_PinPos[i].x; m_pView->m_PinPos[i].x = h - ty; m_pView->m_Pin[i]->MoveToPt(m_pView->m_PinPos[i]); } UpdateAllViews(NULL); SetModifiedFlag(); } //水平翻转图像 void CImageLABDoc::OnHorflip() { Image.HorizontalFlip(); SmallImage.DeleteMe(); int w = m_pView->ScrollSize.cx; for(int i= 0; i< MAXPINNUM; i++) { if( m_pView->m_Pin[i] == NULL ) continue; m_pView->m_PinPos[i].x = w - m_pView->m_PinPos[i].x; m_pView->m_Pin[i]->MoveToPt(m_pView->m_PinPos[i]); } UpdateAllViews(NULL); SetModifiedFlag( ); } //竖直翻转图像 void CImageLABDoc::OnVertflip() { Image.VerticalFlip(); SmallImage.DeleteMe(); int h = m_pView->ScrollSize.cy; for(int i= 0; i< MAXPINNUM; i++) { if( m_pView->m_Pin[i] == NULL ) continue; m_pView->m_PinPos[i].y = h - m_pView->m_PinPos[i].y; m_pView->m_Pin[i]->MoveToPt(m_pView->m_PinPos[i]); } UpdateAllViews(NULL); SetModifiedFlag( ); } //图像负片显示 void CImageLABDoc::OnInverseimage() { Image.Inverse(); SmallImage.DeleteMe(); UpdateAllViews(NULL); SetModifiedFlag( ); } //正常显示RGB图像 void CImageLABDoc::OnShowrgbimage() { if(Channel&(REDCOMPONENT|BLUECOMPONENT|GREENCOMPONENT)) { Channel = 0; } else { Channel|= REDCOMPONENT; } Image.SelectChannel(Channel); UpdateAllViews(NULL); SetModifiedFlag( ); } void CImageLABDoc::OnUpdateShowrgbimage(CCmdUI* pCmdUI) { pCmdUI->Enable(Image.m_wImageDepth==24); pCmdUI->SetCheck(Channel==0); } //显示图像的红色分量 void CImageLABDoc::OnShowbluecomponent() { if(Channel&BLUECOMPONENT) { Channel&=~BLUECOMPONENT; } else { Channel|= BLUECOMPONENT; if( (Channel&REDCOMPONENT)&&(Channel&BLUECOMPONENT)&&(Channel&GREENCOMPONENT) ) Channel&=~(GREENCOMPONENT|REDCOMPONENT); } Image.SelectChannel(Channel); UpdateAllViews(NULL); SetModifiedFlag( ); } void CImageLABDoc::OnUpdateShowbluecomponent(CCmdUI* pCmdUI) { pCmdUI->Enable(Image.m_wImageDepth==24); pCmdUI->SetCheck(Channel&BLUECOMPONENT?TRUE:FALSE); } //显示图像的绿色分量 void CImageLABDoc::OnShowgreencomponent() { if(Channel&GREENCOMPONENT) { Channel&=~GREENCOMPONENT; } else { Channel|= GREENCOMPONENT; if( (Channel&REDCOMPONENT)&&(Channel&BLUECOMPONENT)&&(Channel&GREENCOMPONENT) ) Channel&=~(BLUECOMPONENT|REDCOMPONENT); } Image.SelectChannel(Channel); UpdateAllViews(NULL); SetModifiedFlag( ); } void CImageLABDoc::OnUpdateShowgreencomponent(CCmdUI* pCmdUI) { pCmdUI->Enable(Image.m_wImageDepth==24); pCmdUI->SetCheck(Channel&GREENCOMPONENT?TRUE:FALSE); } //显示图像的红色分量 void CImageLABDoc::OnShowredcomponent() { if(Channel&REDCOMPONENT) { Channel&=~REDCOMPONENT; } else { Channel|= REDCOMPONENT; if( (Channel&REDCOMPONENT)&&(Channel&BLUECOMPONENT)&&(Channel&GREENCOMPONENT) ) Channel&=~(BLUECOMPONENT|GREENCOMPONENT); } Image.SelectChannel(Channel); UpdateAllViews(NULL); SetModifiedFlag( ); } void CImageLABDoc::OnUpdateShowredcomponent(CCmdUI* pCmdUI) { pCmdUI->Enable(Image.m_wImageDepth==24); pCmdUI->SetCheck(Channel&REDCOMPONENT?TRUE:FALSE); } //显示图像的hue分量 void CImageLABDoc::OnShowhuecomponent() { if(Channel&HUEIMAGE) { Channel =0; } else { Channel = HUEIMAGE; } Image.SelectChannel(Channel); UpdateAllViews(NULL); SetModifiedFlag( ); } void CImageLABDoc::OnUpdateShowhuecomponent(CCmdUI* pCmdUI) { pCmdUI->Enable(Image.m_wImageDepth==24); pCmdUI->SetCheck(Channel&HUEIMAGE?TRUE:FALSE); } //显示图像的intensity分量 void CImageLABDoc::OnShowintcomponent() { if(Channel&INTENSITYIMAGE) { Channel =0; } else { Channel = INTENSITYIMAGE; } Image.SelectChannel(Channel); UpdateAllViews(NULL); SetModifiedFlag( ); } void CImageLABDoc::OnUpdateShowintcomponent(CCmdUI* pCmdUI) { pCmdUI->Enable(Image.m_wImageDepth==24); pCmdUI->SetCheck(Channel&INTENSITYIMAGE?TRUE:FALSE); } //显示图像的saturation分量 void CImageLABDoc::OnShowsatcomponent() { if(Channel&SATURATIONIMAGE) { Channel =0; } else { Channel = SATURATIONIMAGE; } Image.SelectChannel(Channel); UpdateAllViews(NULL); SetModifiedFlag( ); } void CImageLABDoc::OnUpdateShowsatcomponent(CCmdUI* pCmdUI) { pCmdUI->Enable(Image.m_wImageDepth==24); pCmdUI->SetCheck(Channel&SATURATIONIMAGE?TRUE:FALSE); } //显示图像信息 void CImageLABDoc::OnImageinfo() { Image.ImageInfo(); } //控制菜单的函数 void CImageLABDoc::OnUpdate8BitImage(CCmdUI* pCmdUI) { // pCmdUI->Enable(Image.m_wImageDepth==24); pCmdUI->Enable(Image.m_wImageDepth==8); } //Sobel 算子提取图像边缘 void CImageLABDoc::OnYclSharpenSobel() { DoGrayProcess(PT_Sharpen_Sobel); } //Prewitt 算子提取图像边缘 void CImageLABDoc::OnYclSharpenPrewitt() { DoGrayProcess(PT_Sharpen_Prewitt); } //Roberts 算子提取图像边缘 void CImageLABDoc::OnYclSharpenRoberts() { DoGrayProcess(PT_Sharpen_Roberts); } //Laplacian 算子增强图像 void CImageLABDoc::OnYclEnhancementLaplacian() { DoGrayProcess(PT_Sharpen_Laplacian); } //Wallis 算子增强图像 void CImageLABDoc::OnYclEnhancementWallis() { Image.BackUp(); CWallisParam dlg(this); if(dlg.DoModal()==IDCANCEL) { Image.ImgSwap(); Image.BackUp(); UpdateAllViews(NULL); } SetModifiedFlag(); } // 手动分割灰度图像为二值图像 void CImageLABDoc::OnYclSegmentManualbinary() { Image.BackUp(); CManualBinaryDlg dlg(this); if(dlg.DoModal()==IDCANCEL) { Image.ImgSwap(); Image.BackUp(); UpdateAllViews(NULL); } SetModifiedFlag(); } // 自动分割灰度图像为二值图像 void CImageLABDoc::OnYclSegmentAutobinary() { DoGrayProcess(PT_Segment_AutoBinary); } void CImageLABDoc::OnYclSegmentAutobinary1() { DoGrayProcess(PT_Segment_AutoBinary_ME); } void CImageLABDoc::OnYclSegmentAutobinary2() { DoGrayProcess(PT_Segment_AutoBinary_Qtsu); } void CImageLABDoc::OnYclSegmentAutobinary3() { DoGrayProcess(PT_Segment_AutoBinary_EC); } //显示图像的一维直方图 void CImageLABDoc::OnImageShowhistogram() { CHistBinDlg dlg(this); dlg.DoModal(); } //显示图像的二维直方图 void CImageLABDoc::OnImageShowhistogram2() { // TODO: Add your command handler code here C2DHistogram dlg(this); dlg.DoModal(); } //均值滤波 void CImageLABDoc::OnYclSmoothingMean() { DoNeedMaskGrayProcess(PT_Smoothing_Mean); } //非递归中值滤波 void CImageLABDoc::OnYclSmoothingNonrmiddle() { DoNeedMaskGrayProcess(PT_Smoothing_NonRecursiveMiddle); } //递归中值滤波 void CImageLABDoc::OnYclSmoothingRmiddle() { DoNeedMaskGrayProcess(PT_Smoothing_RecursiveMiddle); } //快速中值滤波 void CImageLABDoc::OnYclSmoothingFastmiddle() { DoNeedMaskGrayProcess(PT_Smoothing_FastMiddle); } //SUSAN 滤波 void CImageLABDoc::OnYclSmoothingSusan() { CSusanPramDlg InputParmDlg; if(InputParmDlg.DoModal()==IDOK) { BeginWaitCursor(); Image.BackUp(); if(m_pView!=NULL&&m_pView->DashRectDrawed) { CPoint p1, p2; m_pView->GetSelectArea(p1, p2); Image.SusanNormalFilter2(InputParmDlg.m_bt, InputParmDlg.m_dt, p1, p2 ); } else { Image.SusanNormalFilter2(InputParmDlg.m_bt, InputParmDlg.m_dt); } EndWaitCursor(); UpdateAllViews(NULL); SetModifiedFlag(); } } //线性增强图像 void CImageLABDoc::OnYclEnhancementLinear() { Image.BackUp(); CEhanceLinearDlg dlg(this); if(dlg.DoModal()==IDCANCEL) { Image.ImgSwap(); Image.BackUp(); UpdateAllViews(NULL); } SetModifiedFlag(); } //非线性增强图像 void CImageLABDoc::OnYclEnhancementNonlinear() { } //直方图均横化增强图像 void CImageLABDoc::OnYclEnhancementHistogram() { DoGrayProcess(PT_Enhance_Histogram); } // SUSAN 算法提取图像边缘(在原图显示) void CImageLABDoc::OnYclSegmentEdgeSusannormal() { CSusanPramDlg InputParmDlg; if(InputParmDlg.DoModal()==IDOK) { Image.BackUp(); if(m_pView!=NULL&&m_pView->DashRectDrawed) { CPoint p1, p2; m_pView->GetSelectArea(p1, p2); Image.SusanNormalEdge2(InputParmDlg.m_bt, p1, p2 ); } else { Image.SusanNormalEdge2(InputParmDlg.m_bt); } UpdateAllViews(NULL); SetModifiedFlag( ); } } // SUSAN 算法提取图像边缘(初始响应) void CImageLABDoc::OnYclSegmentPrincipleNormal() { CSusanPramDlg InputParmDlg; if(InputParmDlg.DoModal()==IDOK) { Image.BackUp(); if(m_pView!=NULL&&m_pView->DashRectDrawed) { CPoint p1, p2; m_pView->GetSelectArea(p1, p2); Image.SusanPrinciple2(InputParmDlg.m_bt, p1, p2 ); } else { Image.SusanPrinciple2(InputParmDlg.m_bt); } UpdateAllViews(NULL); SetModifiedFlag(); EndWaitCursor(); } } // 二值图像的hough变换 void CImageLABDoc::OnYclDescriptionBinaryhough() { DoBinaryProcess(PT_Binary_Transform_Hough); } // 二值图像的radon变换 void CImageLABDoc::OnYclDescriptionBinaryradon() { DoBinaryProcess(PT_Binary_Transform_Radon); } // 二值图像的 "膨胀" 运算 void CImageLABDoc::OnYclMorphologyDilation() { DoMorphProcess(0); } // 二值图像的 "腐蚀" 运算 void CImageLABDoc::OnYclMorphologyErosion() { DoMorphProcess(1); } // 二值图像的 "开" 运算 void CImageLABDoc::OnYclMorphologyOpening() { DoMorphProcess(2); } // 二值图像的 "闭" 运算 void CImageLABDoc::OnYclMorphologyClosing() { DoMorphProcess(3); } // 灰度图像的 "膨胀" 运算 void CImageLABDoc::OnYclDescriptionGrayDilation() { DoMorphProcess(0, false); } // 灰度图像的 "腐蚀" 运算 void CImageLABDoc::OnYclDescriptionGrayErosion() { DoMorphProcess(1, false); } // 灰度图像的 "开" 运算 void CImageLABDoc::OnYclDescriptionGrayOpening() { DoMorphProcess(2, false); } // 灰度图像的 "闭" 运算 void CImageLABDoc::OnYclDescriptionGrayClosing() { DoMorphProcess(3, false); } // 显示FFT变化后的频谱图像 void CImageLABDoc::OnImageShowfftmagniyude() { BeginWaitCursor(); Image.BackUp(); Image.ImageProcess(PT_ShowFFTMagnitude); UpdateAllViews(NULL); SetModifiedFlag( ); EndWaitCursor(); } //旋转不变量算子 提取图像的边缘 void CImageLABDoc::OnYclSegmentRoinvaroperator() { DoNeedMaskGrayProcess(PT_Segment_RoInvarOperator); } //图像边缘局部方向角的显示 (SOBEL) void CImageLABDoc::OnYclSharpenSobelAngle() { DoGrayProcess(PT_EdgeOrention_Sobel); } //图像边缘局部方向角的显示(旋转不变量算子) void CImageLABDoc::OnYclDescriptionEdgeorentionRoi() { DoNeedMaskGrayProcess(PT_EdgeOrention_RoInvarOperator); } //二值图像上区域的标记 void CImageLABDoc::OnYclDescriptionBinaryArealabel() { CTargetgrayDlg dlg; if(dlg.DoModal()==IDOK) { BeginWaitCursor(); Image.BackUp(); if(m_pView!=NULL&&m_pView->DashRectDrawed) { CPoint p1, p2; m_pView->GetSelectArea(p1, p2); Image.Binary_AreaLabel(p1, p2, dlg.TargetGray ); } else { Image.Binary_AreaLabel(dlg.TargetGray, MetalLinePt, LineNum); //MetalLineGeted = TRUE; } EndWaitCursor(); UpdateAllViews(NULL); SetModifiedFlag( ); } } //转换图像为灰度图像 void CImageLABDoc::OnConverttograyimage() { Image.ConvertToGrayImage(); UpdateAllViews(NULL); } void CImageLABDoc::OnUpdateConverttograyimage(CCmdUI* pCmdUI) { pCmdUI->Enable(Image.GetImageType() != IndexGrayImage); } // 以金字塔形式显示图像 void CImageLABDoc::OnImageShowpyramidimage() { DoGrayProcess(PT_ShowPyramidImage); } // 图像马赛克显示 void CImageLABDoc::OnImageShowmosaicimage() { DoNeedMaskGrayProcess(PT_ShowMosaicImage); } // Guass 算子增强图像 void CImageLABDoc::OnYclEnhancementGaussring() { CGaussSigmaDlg dlg; if(dlg.DoModal()==IDOK) { Image.BackUp(); if(m_pView!=NULL&&m_pView->DashRectDrawed) { CPoint p1, p2; m_pView->GetSelectArea(p1, p2); Image.Gauss_Sharpen2(dlg.m_Sigma, p1, p2); } else { Image.Gauss_Sharpen2(dlg.m_Sigma); } UpdateAllViews(NULL); SetModifiedFlag( ); } } // Guass 算子模糊图像 void CImageLABDoc::OnYclSmoothingGaussblur() { CGaussSigmaDlg dlg; if(dlg.DoModal()==IDOK) { Image.BackUp(); if(m_pView!=NULL&&m_pView->DashRectDrawed) { CPoint p1, p2; m_pView->GetSelectArea(p1, p2); Image.Gauss_Blur2(dlg.m_Sigma, p1, p2); } else { Image.Gauss_Blur2(dlg.m_Sigma); } UpdateAllViews(NULL); SetModifiedFlag( ); } } // Marr Hildreth 算子提取边缘 void CImageLABDoc::OnYclSegmentEdgeMarrhildreth() { CGaussSigmaDlg dlg; if(dlg.DoModal()==IDOK) { Image.BackUp(); if(m_pView!=NULL&&m_pView->DashRectDrawed) { CPoint p1, p2; m_pView->GetSelectArea(p1, p2); Image.Marr_Hildreth2(dlg.m_Sigma, p1, p2); } else { Image.Marr_Hildreth2(dlg.m_Sigma); } UpdateAllViews(NULL); SetModifiedFlag( ); } } //Hiliditch 方法细化二值图像 void CImageLABDoc::OnYclSegmentThinHiliditch() { DoBinaryProcess(PT_Binary_Thin_Hilditch); } //somebody 方法细化二值图像 void CImageLABDoc::OnYclSegmentThinSomenew() { DoBinaryProcess(PT_Binary_Thin_Somebody); } //ZhangSuen 方法细化二值图像 void CImageLABDoc::OnYclSegmentThinZhangsuen() { DoBinaryProcess(PT_Binary_Thin_ZhangSuen); } //提取二值图像的边缘 void CImageLABDoc::OnYclBinaryEdge() { DoBinaryProcess(PT_Binary_Edge_Simple); } //二值图像形态学处理的执行函数 void CImageLABDoc::DoMorphProcess(int type, BOOL IsBinaryImage) { Image.BackUp(); CMorphparam dlg(this, IsBinaryImage); dlg.m_Type = type; if(dlg.DoModal()==IDCANCEL) { Image.ImgSwap(); Image.BackUp(); UpdateAllViews(NULL); } SetModifiedFlag(); } //二值图像处理的执行函数 void CImageLABDoc::DoBinaryProcess(eProcessType type) { CTargetgrayDlg dlg; if(dlg.DoModal()==IDOK) { BeginWaitCursor(); Image.BackUp(); if(m_pView!=NULL&&m_pView->DashRectDrawed) { CPoint p1, p2; m_pView->GetSelectArea(p1, p2); Image.Binary_Process(type, dlg.TargetGray, p1, p2); } else { Image.Binary_Process(type, dlg.TargetGray); } EndWaitCursor(); UpdateAllViews(NULL); SetModifiedFlag( ); } } //灰度图像处理的执行函数 void CImageLABDoc::DoGrayProcess(eProcessType type) { Image.BackUp(); //BeginWaitCursor(); if(m_pView!=NULL&&m_pView->DashRectDrawed) { CPoint p1, p2; m_pView->GetSelectArea(p1, p2); Image.ImageProcess(p1, p2, type); } else { Image.ImageProcess(type); } UpdateAllViews(NULL); SetModifiedFlag( ); //EndWaitCursor(); } //需要模板的灰度图像处理执行函数 void CImageLABDoc::DoNeedMaskGrayProcess(eProcessType type) { CMaskSizeDlg MaskSizedlg; if(MaskSizedlg.DoModal()==IDOK) { BeginWaitCursor(); Image.BackUp(); if(m_pView!=NULL&&m_pView->DashRectDrawed) { CPoint p1, p2; m_pView->GetSelectArea(p1, p2); Image.ImageNeedMaskProcess(type, MaskSizedlg.m_MaskSize, p1, p2 ); } else { Image.ImageNeedMaskProcess(type, MaskSizedlg.m_MaskSize); } EndWaitCursor(); UpdateAllViews(NULL); SetModifiedFlag(); } } void CImageLABDoc::OnJgimageRadon() { Image.BackUp(); Image.VerticalFlip(); Image_Improve_Radon(Image.m_lpDibArray, Image.m_nDibWidth, Image.m_nDibHeight, 5); Image.VerticalFlip(); UpdateAllViews(NULL); SetModifiedFlag(); } void CImageLABDoc::OnUpdateJgimageRadon(CCmdUI* pCmdUI) { } void CImageLABDoc::OnYclSegmentEdgeCanny() { CCannyParam dlg; if(dlg.DoModal()==IDOK) { BeginWaitCursor(); Image.BackUp(); float sigma = float( dlg.m_sigma ); float noise = 0.1f; Image_Edge_Canny(Image, sigma, noise, dlg.m_lambda, dlg.m_tau, dlg.m_Operator_Type); UpdateAllViews(NULL); SetModifiedFlag(); EndWaitCursor(); } } void CImageLABDoc::OnYclSegmentEdgeSpatialZernikemoment() { DoGrayProcess(PT_Edge_Spatial_Zernike_Moment); } void CImageLABDoc::OnFileSaveAs() { CLABSaveDlg dlgFile(CImageLABApp::DriveNum); if(dlgFile.DoModal()==IDOK) { CString FullDir, FileFullName; FullDir.Format("%c:\\%s", 'C'+ dlgFile.SelectDrive, CImageLABApp::SaveFileDir); if(!IsExistFile(FullDir)) { _mkdir(FullDir); } FileFullName.Format("%c:\\%s\\%s.jpg", 'C'+ dlgFile.SelectDrive, CImageLABApp::SaveFileDir, dlgFile.m_FileName); if(IsExistFile(FileFullName)) { int Answer; CString Warning; Warning.Format("%s已经存在!\n要替换吗?", FileFullName); Answer = AfxMessageBox(Warning, MB_OKCANCEL|MB_ICONINFORMATION ); if(Answer != IDOK) return; } OnSaveDocument(FileFullName); ImageFileName = FileFullName; SetPathName(FileFullName); SetModifiedFlag(false); } } void CImageLABDoc::OnFileSave() { if( ImageFileName == "未命名图像文件" ) { CLABSaveDlg dlgFile(CImageLABApp::DriveNum); if(dlgFile.DoModal()==IDOK) { CString FullDir, FileFullName; FullDir.Format("%c:\\%s", 'C'+ dlgFile.SelectDrive, CImageLABApp::SaveFileDir); if(!IsExistFile(FullDir)) { _mkdir(FullDir); } CString m_FileNameExt; if (dlgFile.m_FileNameExt=="压缩格式") m_FileNameExt="jpg"; else m_FileNameExt="bmp"; FileFullName.Format("%c:\\%s\\%s.%s", 'C'+ dlgFile.SelectDrive, CImageLABApp::SaveFileDir, dlgFile.m_FileName, m_FileNameExt); if(IsExistFile(FileFullName)) { int Answer; CString Warning; Warning.Format("%s已经存在!\n要替换吗?", FileFullName); Answer = AfxMessageBox(Warning, MB_OKCANCEL|MB_ICONINFORMATION ); if(Answer != IDOK) return; } OnSaveDocument(FileFullName); ImageFileName = FileFullName; SetPathName(FileFullName); SetModifiedFlag(false); } } else DoFileSave(); } void CImageLABDoc::OnYclEnhancementAutolevels() { Image.BackUp(); if(m_pView!=NULL&&m_pView->DashRectDrawed) { CPoint p1, p2; m_pView->GetSelectArea(p1, p2); Image.EnhaceLinear(p1, p2, 0, 255, 1); } else { Image.EnhaceLinear( 0, 255, 1); } UpdateAllViews(NULL); SetModifiedFlag( ); }