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( ); 
}