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