📄 dipdoc.cpp
字号:
}
void CDipDoc::OnGeomRota()
{
//旋转角度
int nRotateAngle;
int nIntorType;
BOOL bIntorType;
//创建对话框
CDlgGeoRota dlgPara;
//初始化变量值
dlgPara.m_iRotateAngle = 90;
dlgPara.m_nIntorType = 0;
//显示对话框,提示用户设定旋转角度
if(dlgPara.DoModal() != IDOK)
{
//返回
return;
}
//获取用户设定的角度
nRotateAngle = dlgPara.m_iRotateAngle;
nIntorType = dlgPara.m_nIntorType;
//删除对话框
delete dlgPara;
if(nIntorType == 0)
{
bIntorType = FALSE;
}
else
{
bIntorType = TRUE;
}
//创建点处理CImageGeoTrans类对象
CGeoTrans GeoTrans( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
//调用Mirror()函数进行垂直镜像
GeoTrans.Rotate(nRotateAngle, bIntorType);
// 设置脏标记
// SetModifiedFlag(TRUE);
// 更新视图
UpdateAllViews(NULL);
// 恢复光标
EndWaitCursor();
}
void CDipDoc::OnGeomTran()
{
// 创建对话框
CDlgGeoTran dlgPara;
// 初始化变量值
dlgPara.m_XOffset = 0;
dlgPara.m_YOffset = 0;
dlgPara.m_nTransType = 0;
// 显示对话框,提示用户设定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的平移量
LONG lXOffset = dlgPara.m_XOffset;
LONG lYOffset = dlgPara.m_YOffset;
int nTransType = dlgPara.m_nTransType;
// 删除对话框
delete dlgPara;
//创建点处理CImageGeoTrans类对象
CGeoTrans GeoTrans( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
if(nTransType == 0)
{
// 调用TranslationPixel()函数进行平移
GeoTrans.TranslationPixel(lXOffset, lYOffset);
}
else if(nTransType == 1)
{
// 调用TranslationLine()函数进行平移
GeoTrans.TranslationLine(lXOffset, lYOffset);
}
// 设置脏标记
// SetModifiedFlag(TRUE);
// 更新视图
UpdateAllViews(NULL);
// 恢复光标
EndWaitCursor();
}
void CDipDoc::OnGeomTrpo()
{
//创建点处理CImageGeoTrans类对象
CGeoTrans GeoTrans( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
//调用Mirror()函数进行垂直镜像
GeoTrans.Transpose();
// 设置脏标记
// SetModifiedFlag(TRUE);
// 更新视图
UpdateAllViews(NULL);
// 恢复光标
EndWaitCursor();
}
void CDipDoc::OnGeomZoom()
{
// 缩放比率
float fXZoomRatio;
float fYZoomRatio;
int nIntorType;
BOOL bIntorType;
// 创建对话框
CDlgGeoZoom dlgPara;
// 初始化变量值
dlgPara.m_XZoom = 4.0;
dlgPara.m_YZoom = 4.0;
dlgPara.m_nIntorType = 0;
// 显示对话框,提示用户设定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的平移量
fXZoomRatio = dlgPara.m_XZoom;
fYZoomRatio = dlgPara.m_YZoom;
nIntorType = dlgPara.m_nIntorType;
// 删除对话框
delete dlgPara;
if(nIntorType == 0)
{
bIntorType = FALSE;
}
else
{
bIntorType = TRUE;
}
//创建点处理CImageGeoTrans类对象
CGeoTrans GeoTrans( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
//调用Mirror()函数进行垂直镜像
GeoTrans.ZoomImage(fXZoomRatio, fYZoomRatio, bIntorType);
// 设置脏标记
// SetModifiedFlag(TRUE);
// 更新视图
UpdateAllViews(NULL);
// 恢复光标
EndWaitCursor();
}
//以下六个命令更新消息映射,保证图像几何变换只对8位以上的图像进行操作。
void CDipDoc::OnUpdateGeomMirh(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnUpdateGeomMirv(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnUpdateGeomRota(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnUpdateGeomTran(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnUpdateGeomTrpo(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnUpdateGeomZoom(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnFreqDct()
{
//创建点处理CImagePro类对象
CFreqPro FreqPro( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
m_matTransed = FreqPro.DCT2() ;
if(!isempty(m_matTransed)) m_bDct = TRUE;
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnFreqNdct()
{
//创建点处理CImagePro类对象
CFreqPro FreqPro( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
if(FreqPro.NDCT2(m_matTransed)) m_bDct = FALSE;
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnFreqFft()
{
//创建点处理CImagePro类对象
CFreqPro FreqPro( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
m_matTransed = FreqPro.FFT2() ;
if(!isempty(m_matTransed)) m_bFft = TRUE;
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnFreqNfft()
{
//创建点处理CImagePro类对象
CFreqPro FreqPro( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
if(FreqPro.NFFT2(m_matTransed)) m_bFft = FALSE;
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnFreqFftFilte()
{
// 创建对话框
CDlgFouriorFilte dlgPara;
// 初始化变量值
dlgPara.m_nFitleParaA = 0.0;
dlgPara.m_nFilteType = 0;
// 显示对话框,提示用户设定滤波参数
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的滤波参数
double a = dlgPara.m_nFitleParaA;
int nType = dlgPara.m_nFilteType;
// 删除对话框
delete dlgPara;
if(nType == 0)
{
//低通滤波
Mm matSize = size(m_matTransed);
Mm matTemp = mabs(m_matTransed);
Mm matVector = reshape(m_matTransed, matSize.r(1,1)*matSize.r(1,2) , 1);
Mm matMax = mmax(matVector);
matTemp = matTemp / matMax;
Mm matL = matTemp >= (double)a;
m_matTransed = times(m_matTransed, matL);
}
else if(nType == 1)
{
//高通滤波
Mm matSize = size(m_matTransed);
Mm matTemp = mabs(m_matTransed);
Mm matVector = reshape(m_matTransed, matSize.r(1,1)*matSize.r(1,2) , 1);
Mm matMax = mmax(matVector);
matTemp = matTemp / matMax;
Mm matL = matTemp <= (double)a;
m_matTransed = times(m_matTransed, matL);
}
//创建点处理CImagePro类对象
CFreqPro FreqPro( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
if(FreqPro.NFFT2(m_matTransed)) m_bFft = FALSE;
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnFreqWalh()
{
//创建点处理CImagePro类对象
CFreqPro FreqPro( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
m_matTransed = FreqPro.WHT2() ;
if(!isempty(m_matTransed)) m_bWht = TRUE;
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnFreqNwalh()
{
//创建点处理CImagePro类对象
CFreqPro FreqPro( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
if(FreqPro.NWHT2(m_matTransed)) m_bWht = FALSE;
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
//以下七个命令更新消息映射,保证频域变换只对8位图像进行操作。
void CDipDoc::OnUpdateFreqDct(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() == 8);
}
void CDipDoc::OnUpdateFreqNdct(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() == 8 && m_bDct);
}
void CDipDoc::OnUpdateFreqFft(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() == 8);
}
void CDipDoc::OnUpdateFreqNfft(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() == 8 && m_bFft);
}
void CDipDoc::OnUpdateFreqFftFilte(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() == 8 && m_bFft);
}
void CDipDoc::OnUpdateFreqWalh(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() == 8);
}
void CDipDoc::OnUpdateFreqNwalh(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() == 8 && m_bWht);
}
void CDipDoc::OnMorphClose()
{
//结构元素数组指针(存储的是各结构元素相对于结构中心的坐标)
int *nMask;
//结构元素的大小(以结构元素中的点数为单位)
int nMaskLen = 0;
// 创建对话框
CDlgMorph dlgPara;
// 显示对话框,提示用户设定腐蚀方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
nMask = dlgPara.m_npMask;
nMaskLen = dlgPara.m_nMaskLen;
// 删除对话框
delete dlgPara;
//创建形态学处理CMorphPro类对象
CMorphPro MorphProcesses( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
MorphProcesses.Closing(nMask, nMaskLen);
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnMorphDilation()
{
//结构元素数组指针(存储的是各结构元素相对于结构中心的坐标)
int *nMask;
//结构元素的大小(以结构元素中的点数为单位)
int nMaskLen = 0;
// 创建对话框
CDlgMorph dlgPara;
// 显示对话框,提示用户设定腐蚀方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
nMask = dlgPara.m_npMask;
nMaskLen = dlgPara.m_nMaskLen;
// 删除对话框
delete dlgPara;
//创建形态学处理CMorphPro类对象
CMorphPro MorphProcesses( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
MorphProcesses.Dilation(nMask, nMaskLen);
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnMorphErosion()
{
//结构元素数组指针(存储的是各结构元素相对于结构中心的坐标)
int *nMask;
//结构元素的大小(以结构元素中的点数为单位)
int nMaskLen = 0;
// 创建对话框
CDlgMorph dlgPara;
// 显示对话框,提示用户设定腐蚀方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
nMask = dlgPara.m_npMask;
nMaskLen = dlgPara.m_nMaskLen;
// 删除对话框
delete dlgPara;
//创建形态学处理CMorphPro类对象
CMorphPro MorphProcesses( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
MorphProcesses.Erosion(nMask, nMaskLen);
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnMorphOpen()
{
//结构元素数组指针(存储的是各结构元素相对于结构中心的坐标)
int *nMask;
//结构元素的大小(以结构元素中的点数为单位)
int nMaskLen = 0;
// 创建对话框
CDlgMorph dlgPara;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -