www.pudn.com > ImgSeg.rar > ImgSegDoc.cpp


// ImgSegDoc.cpp : implementation of the CImgSegDoc class 
// 
 
#include "stdafx.h" 
#include "ImgSeg.h" 
#include "ImgSegDoc.h" 
#include "windowsx.h" 
#include "DlgIntensity.h" 
#include "DlgPalKing.h" 
#include "DlgImpPal.h" 
#include "DlgThreshold.h" 
#include "DlgSobelThin.h" 
#include "DlgLaplacThin.h" 
#include "ImgPro.h" 
#include "math.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CImgSegDoc 
 
IMPLEMENT_DYNCREATE(CImgSegDoc, CDocument) 
 
BEGIN_MESSAGE_MAP(CImgSegDoc, CDocument) 
	//{{AFX_MSG_MAP(CImgSegDoc) 
	ON_COMMAND(ID_CHRCT_INTENSITY, OnChrctIntensity) 
	ON_COMMAND(ID_EDGE_ROBERTS, OnEdgeRoberts) 
	ON_COMMAND(ID_EDGE_SOBEL, OnEdgeSobel) 
	ON_COMMAND(ID_AREA_ITERATIVETHRESH, OnAreaIterativethresh) 
	ON_COMMAND(ID_RESERVE, OnReserve) 
	ON_COMMAND(ID_EDGE_FACEFIT, OnEdgeFacefit) 
	ON_COMMAND(ID_EDGE_PREWITT, OnEdgePrewitt) 
	ON_COMMAND(ID_EDGE_GAUSS, OnEdgeGauss) 
	ON_COMMAND(ID_EDGE_KIRSCH, OnEdgeKirsch) 
	ON_COMMAND(ID_AREA_FUZZY, OnAreaFuzzy) 
	ON_COMMAND(ID_EDGE_LAPLACE, OnEdgeLaplace) 
	ON_COMMAND(ID_EDGE_SHENJUN, OnEdgeShenjun) 
	ON_COMMAND(ID_EDGE_COLORTH, OnEdgeColorth) 
	ON_COMMAND(ID_EDGE_EDGEMOD, OnEdgeEdgemod) 
	ON_COMMAND(ID_EDGE_POINTMOD, OnEdgePointmod) 
	ON_COMMAND(ID_EDGE_LINEMOD, OnEdgeLinemod) 
	ON_COMMAND(ID_AREA_OSTU, OnAreaOstu) 
	ON_COMMAND(ID_EDGE_PALKING, OnEdgePalking) 
	ON_COMMAND(ID_EDGE_IMPPAL, OnEdgeImppal) 
	ON_COMMAND(ID_BINARY, OnBinary) 
	ON_COMMAND(ID_THIN_SOBEL, OnThinSobel) 
	ON_COMMAND(ID_THIN_LAPLACIAN, OnThinLaplacian) 
	ON_COMMAND(ID_AREA_ENTROPY, OnAreaEntropy) 
	ON_COMMAND(ID_NORMALTHRESHOLD, OnNormalthreshold) 
	ON_COMMAND(ID_ENQUALTHRESHOLD, OnEnqualthreshold) 
	ON_COMMAND(ID_IMPROVEDTHRESHOLD, OnImprovedthreshold) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CImgSegDoc construction/destruction 
 
CImgSegDoc::CImgSegDoc() 
{ 
	// TODO: add one-time construction code here 
 
} 
 
CImgSegDoc::~CImgSegDoc() 
{ 
} 
 
BOOL CImgSegDoc::OnNewDocument() 
{ 
	if (!CDocument::OnNewDocument()) 
		return FALSE; 
 
	// TODO: add reinitialization code here 
	// (SDI documents will reuse this document) 
 
	return TRUE; 
} 
 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CImgSegDoc serialization 
 
void CImgSegDoc::Serialize(CArchive& ar) 
{ 
	if (ar.IsStoring()) 
	{ 
		// TODO: add storing code here 
	} 
	else 
	{ 
		// TODO: add loading code here 
	} 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CImgSegDoc diagnostics 
 
#ifdef _DEBUG 
void CImgSegDoc::AssertValid() const 
{ 
	CDocument::AssertValid(); 
} 
 
void CImgSegDoc::Dump(CDumpContext& dc) const 
{ 
	CDocument::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CImgSegDoc commands 
 
BOOL CImgSegDoc::OnOpenDocument(LPCTSTR lpszPathName)  
{ 
	if (!CDocument::OnOpenDocument(lpszPathName)) 
		return FALSE; 
	 
	// TODO: Add your specialized creation code here 
 
	////////////////// 
	//我的代码开始 
	////////////////// 
	 
	CFile file;                      //定义文件类的对象 
	DWORD dwBitsSize;                //文件大小 
	UINT lpPalSize;                //调色板大小 
 
	//打开文件 
	if(!file.Open(lpszPathName,CFile::modeRead)) 
	{ 
		//失败 
		MessageBox(NULL,"打开文件失败!","系统提示",MB_OK); 
		//返回FALSE 
		return FALSE; 
	} 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//读文件信息头 
	file.Read((LPSTR)&m_bmpHeader,sizeof(BITMAPFILEHEADER)); 
	//是否位图? 
	if(m_bmpHeader.bfType!=(WORD)('M'<<8|'B')) 
	{ 
		//否 
		MessageBox(NULL,"打开文件失败!不是位图文件或文件损坏。", 
			"系统提示",MB_OK); 
		//关闭文件 
		file.Close(); 
		//返回FALSE 
		return FALSE; 
	} 
 
	//确定文件大小 
	dwBitsSize=m_bmpHeader.bfSize; 
	//为m_lpBmpInf(信息头)分配内存 
	m_lpBmpInf=(BITMAPINFO*)GlobalAllocPtr(GHND,dwBitsSize- 
		sizeof(BITMAPFILEHEADER)); 
	if(m_lpBmpInf==0) 
	{ 
		//内存分配失败 
		MessageBox(NULL,"内存分配失败!","系统提示",MB_OK); 
		//返回FALSE 
		return FALSE; 
	} 
	file.Read(m_lpBmpInf,dwBitsSize-sizeof(BITMAPFILEHEADER)); 
 
	if(m_lpBmpInf->bmiHeader.biClrUsed==0) 
	{ 
		//所有颜色都用到 
		//按照象素的位数计算颜色数目 
		switch(m_lpBmpInf->bmiHeader.biBitCount) 
		{ 
		case 1: 
			lpPalSize=2*sizeof(RGBQUAD); 
			break; 
		case 4: 
			lpPalSize=16*sizeof(RGBQUAD); 
			break; 
		case 8: 
			lpPalSize=256*sizeof(RGBQUAD); 
			break; 
		default: 
			lpPalSize=0; 
			break; 
		} 
	} 
	else 
	{ 
		//只用实际颜色 
		if(m_lpBmpInf->bmiHeader.biBitCount<=8) 
			//非真彩色 
			lpPalSize=m_lpBmpInf->bmiHeader.biClrUsed*sizeof(RGBQUAD); 
		else 
			//真彩色 
			lpPalSize=0; 
	} 
	//得到指向图像数据的指针 
	m_lpBits=(LPBYTE)m_lpBmpInf+sizeof(BITMAPINFOHEADER)+lpPalSize; 
	//确定图像的宽和高 
	m_lWidth=m_lpBmpInf->bmiHeader.biWidth; 
	m_lHeight=m_lpBmpInf->bmiHeader.biHeight; 
	//图像实际宽度,4的倍数。 
	m_lWidth=m_lWidth+m_lWidth%4; 
 
	//关闭文件 
	file.Close(); 
 
	//恢复光标形状 
	EndWaitCursor(); 
 
	//设置未保存表记为FALSE 
	SetModifiedFlag(FALSE); 
	 
	return TRUE; 
} 
 
void CImgSegDoc::ShowBitmap(CDC *pDC) 
{ 
	//显示位图 
	::StretchDIBits(pDC->m_hDC,0,0,m_lWidth,m_lHeight, 
		0,0,m_lWidth,m_lHeight,m_lpBits,m_lpBmpInf, 
		DIB_RGB_COLORS,SRCCOPY); 
} 
 
void CImgSegDoc::OnChrctIntensity()  
{ 
	// TODO: Add your command handler code here 
	 
	// 查看当前图像灰度直方图 
			 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持查看256色非压缩位图的灰度直方图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
	 
	// 创建对话框 
	CDlgIntensity dlgPara; 
	 
	// 初始化变量值 
	dlgPara.m_lpBits=m_lpBits; 
	dlgPara.m_lWidth=m_lpBmpInf->bmiHeader.biWidth; 
	dlgPara.m_lHeight=m_lpBmpInf->bmiHeader.biHeight; 
	dlgPara.m_iLowGray=0; 
	dlgPara.m_iUpGray=255; 
	 
	// 显示对话框,提示用户设定平移量 
	if (dlgPara.DoModal() != IDOK) 
	{ 
		// 返回 
		return; 
	} 
	 
	// 恢复光标 
	EndWaitCursor(); 
} 
 
void CImgSegDoc::OnEdgeRoberts()  
{ 
	// TODO: Add your command handler code here 
 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
	//调用Robert算法 
	if(ImgPro.Roberts()) 
	{ 
		//更新视图 
		UpdateAllViews(NULL); 
		//设置未保存表记 
		SetModifiedFlag(); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnEdgeSobel()  
{ 
	// TODO: Add your command handler code here 
 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
	 
	//调用Sobel算法 
	if(ImgPro.Sobel()) 
	{ 
		//更新视图 
		UpdateAllViews(NULL); 
		//设置未保存表记 
		SetModifiedFlag(); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnAreaIterativethresh()  
{ 
	// TODO: Add your command handler code here 
 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
 
	//迭代阈值 
	unsigned char iThreshold; 
 
	//迭代求最大阈值 
	iThreshold=ImgPro.IterativeThreshold(); 
	 
	//调用阈值分割算法 
	if(ImgPro.Threshold(iThreshold)) 
	{ 
		//调用成功 
		//设置未保存表记 
		SetModifiedFlag(); 
		//更新视图 
		UpdateAllViews(NULL); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"阈值大小不正确!","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnReserve()  
{ 
	// TODO: Add your command handler code here 
 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
	 
	//调用反色算法 
	ImgPro.Reserve(); 
	//设置未保存表记 
	SetModifiedFlag(); 
	//更新视图 
	UpdateAllViews(NULL);	 
 
	// 恢复光标形状 
	EndWaitCursor(); 
} 
 
void CImgSegDoc::OnEdgeFacefit()  
{ 
	// TODO: Add your command handler code here 
 
		// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
	 
	//调用曲面拟合算法 
	if(ImgPro.FaceFit()) 
	{ 
		//更新视图 
		UpdateAllViews(NULL); 
		//设置未保存表记 
		SetModifiedFlag(); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
	}	 
} 
 
BOOL CImgSegDoc::OnSaveDocument(LPCTSTR lpszPathName)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
 
	CFile fp; 
	if(fp.Open(lpszPathName,CFile::modeWrite|CFile::modeCreate)) 
	{ 
		fp.Write((LPSTR)&m_bmpHeader,sizeof(BITMAPFILEHEADER)); 
		fp.Write(m_lpBmpInf,m_bmpHeader.bfSize-sizeof(BITMAPFILEHEADER)); 
		fp.Close(); 
	} 
	else 
	{ 
		MessageBox(NULL,"保存文件失败!","系统提示",MB_OK); 
		return FALSE; 
	} 
	 
	/*return CDocument::OnSaveDocument(lpszPathName);*/ 
	SetModifiedFlag(FALSE); 
	return TRUE; 
} 
 
void CImgSegDoc::OnEdgePrewitt()  
{ 
	// TODO: Add your command handler code here 
	 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
	 
	//调用Prewitt算法 
	if(ImgPro.Prewitt()) 
	{ 
		//更新视图 
		UpdateAllViews(NULL); 
		//设置未保存表记 
		SetModifiedFlag(); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnEdgeGauss()  
{ 
	// TODO: Add your command handler code here 
 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
	 
	//调用Gauss-Laplace算法 
	if(ImgPro.Gauss()) 
	{ 
		//更新视图 
		UpdateAllViews(NULL); 
		//设置未保存表记 
		SetModifiedFlag(); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnEdgeKirsch()  
{ 
	// TODO: Add your command handler code here 
 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
	 
	//调用Kirsch算法 
	if(ImgPro.Kirsch()) 
	{ 
		//更新视图 
		UpdateAllViews(NULL); 
		//设置未保存表记 
		SetModifiedFlag(); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnAreaFuzzy()  
{ 
	// TODO: Add your command handler code here 
 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//阈值 
	unsigned char iThreshold; 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
	 
	//求模糊阈值 
	iThreshold=ImgPro.FuzzyThreshold(250); 
	 
	//调用阈值分割算法 
	if(ImgPro.Threshold(iThreshold)) 
	{ 
		//设置未保存表记 
		SetModifiedFlag(); 
		//更新视图 
		UpdateAllViews(NULL); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"阈值大小不正确!","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnEdgeLaplace()  
{ 
	// TODO: Add your command handler code here 
 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
	 
	//调用Laplacian算法 
	if(ImgPro.Laplace()) 
	{ 
		//更新视图 
		UpdateAllViews(NULL); 
		//设置未保存表记 
		SetModifiedFlag(); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnEdgeShenjun()  
{ 
	// TODO: Add your command handler code here 
	 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
	 
	//调用沈俊边缘检测 
	if(ImgPro.ShenJun(0.5)) 
	{ 
		//更新视图 
		UpdateAllViews(NULL); 
		//设置未保存表记 
		SetModifiedFlag(); 
		// 恢复光标形状 
	    EndWaitCursor(); 
	} 
 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnEdgeColorth()  
{ 
	// TODO: Add your command handler code here 
	 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
	 
	//调用综合正交边缘检测算子 
	if(ImgPro.ColOrth()) 
	{ 
		//更新视图 
		UpdateAllViews(NULL); 
		//设置未保存表记 
		SetModifiedFlag(); 
		// 恢复光标形状 
	    EndWaitCursor(); 
	} 
 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnEdgeEdgemod()  
{ 
	// TODO: Add your command handler code here 
 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
	 
	//调用边缘模板匹配算法 
	if(ImgPro.EdgeMod()) 
	{ 
		//更新视图 
		UpdateAllViews(NULL); 
		//设置未保存表记 
		SetModifiedFlag(); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnEdgePointmod()  
{ 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
	 
	//调用点模板匹配算法 
	if(ImgPro.Laplace()) 
	{ 
		//更新视图 
		UpdateAllViews(NULL); 
		//设置未保存表记 
		SetModifiedFlag(); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnEdgeLinemod()  
{ 
	// TODO: Add your command handler code here 
	 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
	 
	//调用线模板匹配算法 
	if(ImgPro.LineMod()) 
	{ 
		//更新视图 
		UpdateAllViews(NULL); 
		//设置未保存表记 
		SetModifiedFlag(); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnAreaOstu()  
{ 
	// TODO: Add your command handler code here 
 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
 
	//阈值 
	unsigned char iThreshold; 
 
	//类间最大方差求最佳阈值 
	iThreshold=ImgPro.OstuThreshold(); 
	 
	//调用阈值分割算法 
	if(ImgPro.Threshold(iThreshold)) 
	{ 
		//调用成功 
		//设置未保存表记 
		SetModifiedFlag(); 
		//更新视图 
		UpdateAllViews(NULL); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"阈值大小不正确!","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnEdgePalking()  
{ 
	// TODO: Add your command handler code here 
	 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	//创建一个CDlgPalKing对象 
	CDlgPalKing DlgPalKing; 
	//渡越点与增强次数 
	int pass; 
	int supnum; 
	//fd的值 
	float fd; 
 
	if(DlgPalKing.DoModal()==IDOK) 
	{ 
		//获取渡越点与增强次数的值 
		pass=DlgPalKing.m_pass; 
		supnum=DlgPalKing.m_supnum; 
		//判断渡越点的值是否合法 
		unsigned char mingray=255,maxgray=0; 
		long i,j; 
		//确定最大最小灰度级 
		for(i=0;imaxgray) 
					maxgray=(unsigned char)*(m_lpBits+i*m_lWidth+j); 
			} 
		 
		//判断渡越点值是否合法 
		if(pass<=mingray || pass>=maxgray) 
		{ 
			//不合法,提示用户 
			MessageBox(NULL,"渡越点值不合法!","系统提示",MB_OK); 
		} 
		else 
		{	 
			//确定fd 
			fd=(float)((maxgray-pass)/(sqrt(2)-1)); 
			 
			// 更改光标形状 
			BeginWaitCursor(); 
			 
			//创建一个CImgPro对象 
			CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
 
			//计算运算时间 
			clock_t start,finish; 
			//显示所用时间的字符串 
			CString strTime; 
			//所用时间 
			double duration; 
 
			//开始计时 
			start=clock(); 
			 
			//调用Pal.King算法 
			if(ImgPro.PalKing(fd,supnum)) 
			{ 
				//结束计时 
				finish=clock(); 
				//计算运算时间 
				duration=(double)(finish-start)/(CLOCKS_PER_SEC/1000); 
 
				//更新视图 
				UpdateAllViews(NULL); 
				//设置未保存表记 
				SetModifiedFlag(); 
				// 恢复光标形状 
				EndWaitCursor(); 
				//显示运算时间 
				strTime.Format("本次运算用了%f毫秒",duration); 
				MessageBox(NULL,strTime,"时间",MB_OK); 
			} 
			else 
			{ 
				//失败 
				// 恢复光标形状 
				EndWaitCursor(); 
				//提示用户 
				MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
			} 
		} 
	} 
} 
 
void CImgSegDoc::OnEdgeImppal()  
{ 
	// TODO: Add your command handler code here 
 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	//创建一个CDlgImpPal对象 
	CDlgImpPal DlgImpPal; 
	//图象增强次数 
	int ehcnum; 
 
	if(DlgImpPal.DoModal()==IDOK) 
	{ 
		// 更改光标形状 
		BeginWaitCursor(); 
 
		//创建一个CImgPro对象 
		CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
		 
		//获取增强次数 
		ehcnum=DlgImpPal.m_ehcnum; 
 
		//计算运算时间 
		clock_t start,finish; 
		//显示所用时间的字符串 
		CString strTime; 
		//所用时间 
		double duration; 
 
		//开始计时 
		start=clock(); 
 
		//调用改进的Pal.King算法 
		if(ImgPro.ImpPalking(ehcnum)) 
		{ 
			//结束计时 
			finish=clock(); 
			//计算运算时间 
			duration=(double)(finish-start)/(CLOCKS_PER_SEC/1000); 
 
			UpdateAllViews(NULL); 
			//设置未保存表记 
			SetModifiedFlag(); 
			// 恢复光标形状 
			EndWaitCursor(); 
			//显示运算时间 
			strTime.Format("本次运算用了%f毫秒",duration); 
			MessageBox(NULL,strTime,"时间",MB_OK); 
		} 
		else 
		{ 
			//失败 
			// 恢复光标形状 
			EndWaitCursor(); 
			//提示用户 
			MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
		} 
	} 
} 
 
void CImgSegDoc::OnBinary()  
{ 
	// TODO: Add your command handler code here 
 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	//创建一个CDlgThreshold对象 
	CDlgThreshold DlgThreshold; 
	//阈值 
	int iThreshold; 
 
	if(DlgThreshold.DoModal()==IDOK) 
	{ 
		// 更改光标形状 
		BeginWaitCursor(); 
 
		//创建一个CImgPro对象 
		CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
		 
		//获取阈值 
		iThreshold=DlgThreshold.m_iThreshold; 
 
		//调用阈值化函数 
		if(ImgPro.Threshold(iThreshold)) 
		{ 
			//二值化 
			/*OnAreaIterativethresh();*/ 
			UpdateAllViews(NULL); 
			//设置未保存表记 
			SetModifiedFlag(); 
			// 恢复光标形状 
			EndWaitCursor(); 
		} 
		else 
		{ 
			//失败 
			// 恢复光标形状 
			EndWaitCursor(); 
			//提示用户 
			MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
		} 
	} 
} 
 
void CImgSegDoc::OnThinSobel()  
{ 
	// TODO: Add your command handler code here 
 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	//创建一个CDlgSobelThin对象 
	CDlgSobelThin DlgSobelThin; 
	//图象增强次数 
	int ThinNum; 
 
	if(DlgSobelThin.DoModal()==IDOK) 
	{ 
		// 更改光标形状 
		BeginWaitCursor(); 
 
		//创建一个CImgPro对象 
		CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
		 
		//获取增强次数 
		ThinNum=DlgSobelThin.m_ThinNum; 
 
		//调用改进的Sobel边缘细化算法 
		if(ImgPro.SobelThin(ThinNum)) 
		{ 
			UpdateAllViews(NULL); 
			//设置未保存表记 
			SetModifiedFlag(); 
			// 恢复光标形状 
			EndWaitCursor(); 
		} 
		else 
		{ 
			//失败 
			// 恢复光标形状 
			EndWaitCursor(); 
			//提示用户 
			MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
		} 
	} 
} 
 
void CImgSegDoc::OnThinLaplacian()  
{ 
	// TODO: Add your command handler code here 
 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	//创建一个CDlgSobelThin对象 
	CDlgLaplacThin DlgLaplacThin; 
	//图象增强次数 
	int ThinNum; 
 
	if(DlgLaplacThin.DoModal()==IDOK) 
	{ 
		// 更改光标形状 
		BeginWaitCursor(); 
 
		//创建一个CImgPro对象 
		CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
		 
		//获取增强次数 
		ThinNum=DlgLaplacThin.m_ThinNum; 
 
		//调用改进的Sobel边缘细化算法 
		if(ImgPro.LaplacianThin(ThinNum)) 
		{ 
			UpdateAllViews(NULL); 
			//设置未保存表记 
			SetModifiedFlag(); 
			// 恢复光标形状 
			EndWaitCursor(); 
		} 
		else 
		{ 
			//失败 
			// 恢复光标形状 
			EndWaitCursor(); 
			//提示用户 
			MessageBox(NULL,"分配内存失败","系统提示",MB_ICONINFORMATION|MB_OK); 
		} 
	} 
} 
 
void CImgSegDoc::OnAreaEntropy()  
{ 
	// TODO: Add your command handler code here 
 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
 
	//阈值 
	unsigned char iThreshold; 
 
	//一维最大熵求最佳阈值 
	iThreshold=ImgPro.EntropyThreshold(); 
	 
	//调用阈值分割算法 
	if(ImgPro.Threshold(iThreshold)) 
	{ 
		//调用成功 
		//设置未保存表记 
		SetModifiedFlag(); 
		//更新视图 
		UpdateAllViews(NULL); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"阈值大小不正确!","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnNormalthreshold()  
{ 
	// TODO: Add your command handler code here 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
 
	//阈值 
	unsigned char iThreshold; 
 
	//一维最大熵求最佳阈值 
	iThreshold=ImgPro.NormalThreshold()+50; 
 
	/*CString str; 
	str.Format("%d",iThreshold); 
	MessageBox(NULL,str,"阈值",MB_OK);*/ 
	 
	//调用阈值分割算法 
	if(ImgPro.Threshold(iThreshold)) 
	{ 
		//调用成功 
		//设置未保存表记 
		SetModifiedFlag(); 
		//更新视图 
		UpdateAllViews(NULL); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"阈值大小不正确!","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnEnqualthreshold()  
{ 
	// TODO: Add your command handler code here 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
 
	//阈值 
	unsigned char iThreshold; 
 
	//一维最大熵求最佳阈值 
	iThreshold=ImgPro.EqualityThreshold(); 
 
	CString str; 
	str.Format("%d",iThreshold); 
	MessageBox(NULL,str,"阈值",MB_OK); 
	 
	//调用阈值分割算法 
	if(ImgPro.Threshold(iThreshold)) 
	{ 
		//调用成功 
		//设置未保存表记 
		SetModifiedFlag(); 
		//更新视图 
		UpdateAllViews(NULL); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"阈值大小不正确!","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
} 
 
void CImgSegDoc::OnImprovedthreshold()  
{ 
	// TODO: Add your command handler code here 
	// 判断是否是8-bpp位图 
	if ((m_lpBmpInf->bmiHeader.biBitCount!=8)| 
		(m_lpBmpInf->bmiHeader.biCompression!=BI_RGB)) 
	{ 
		// 提示用户 
		MessageBox(NULL,"目前只支持256色非压缩位图!",  
			"系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 返回 
		return; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	//创建一个CImgPro对象 
	CImgPro ImgPro(m_lpBits,m_lWidth,m_lHeight); 
 
	//阈值 
	unsigned char iThreshold; 
 
	//一维最大熵求最佳阈值 
	iThreshold=ImgPro.ImprovedThreshold(); 
 
	CString str; 
	str.Format("%d",iThreshold); 
	MessageBox(NULL,str,"阈值",MB_OK); 
	 
	//调用阈值分割算法 
	if(ImgPro.Threshold(iThreshold)) 
	{ 
		//调用成功 
		//设置未保存表记 
		SetModifiedFlag(); 
		//更新视图 
		UpdateAllViews(NULL); 
		// 恢复光标形状 
		EndWaitCursor(); 
	} 
 
	else 
	{ 
		//失败 
		// 恢复光标形状 
		EndWaitCursor(); 
		//提示用户 
		MessageBox(NULL,"阈值大小不正确!","系统提示",MB_ICONINFORMATION|MB_OK); 
	} 
}