📄 dipdoc.cpp
字号:
// 显示对话框,提示用户设定腐蚀方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
nMask = dlgPara.m_npMask;
nMaskLen = dlgPara.m_nMaskLen;
// 删除对话框
delete dlgPara;
//创建形态学处理CMorphPro类对象
CMorphPro MorphProcesses( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
MorphProcesses.Opening(nMask, nMaskLen);
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnMorphHitmissing()
{
//结构元素数组指针(存储的是各结构元素相对于结构中心的坐标)
int *nHmask, *nMmask;
//结构元素的大小(以结构元素中的点数为单位)
int nHmaskLen = 0, nMmaskLen = 0;
// 创建对话框
CDlgHitMiss dlgPara;
// 显示对话框,提示用户设定腐蚀方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
nHmask = dlgPara.m_npHmask;
nHmaskLen = dlgPara.m_nHmaskLen;
nMmask = dlgPara.m_npMmask;
nMmaskLen = dlgPara.m_nMmaskLen;
/*CString s;
s.Format("nHmaskLen=%d\nnMmaskLen=%d\n",nHmaskLen,nMmaskLen);
AfxMessageBox(s);
for(int i = 0; i < 2 * nHmaskLen; i = i + 2)
{
s.Format("Num=%d\n(%d, %d)",i/2,nHmask[i],nHmask[i+1]);
AfxMessageBox(s);
}
for(i = 0; i < 2 * nMmaskLen; i = i + 2)
{
s.Format("Num=%d\n(%d, %d)",i/2,nMmask[i],nMmask[i+1]);
AfxMessageBox(s);
}*/
// 删除对话框
delete dlgPara;
//创建形态学处理CMorphPro类对象
CMorphPro MorphProcesses( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
MorphProcesses.HitMissTran(nHmask, nHmaskLen, nMmask, nMmaskLen);
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnMorphThining()
{
//创建形态学处理CMorphPro类对象
CMorphPro MorphProcesses( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
MorphProcesses.ThiningDIB(m_pDibObject);
//恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnUpdateMorphClose(CCmdUI* pCmdUI)
{
//创建点处理CPointPro类对象
CPointPro PointOperation( m_pDibObject );
pCmdUI->Enable(PointOperation.IsBlackandWhite256());
}
void CDipDoc::OnUpdateMorphDilation(CCmdUI* pCmdUI)
{
//创建点处理CPointPro类对象
CPointPro PointOperation( m_pDibObject );
pCmdUI->Enable(PointOperation.IsBlackandWhite256());
}
void CDipDoc::OnUpdateMorphErosion(CCmdUI* pCmdUI)
{
//创建点处理CPointPro类对象
CPointPro PointOperation( m_pDibObject );
pCmdUI->Enable(PointOperation.IsBlackandWhite256());
}
void CDipDoc::OnUpdateMorphOpen(CCmdUI* pCmdUI)
{
//创建点处理CPointPro类对象
CPointPro PointOperation( m_pDibObject );
pCmdUI->Enable(PointOperation.IsBlackandWhite256());
}
void CDipDoc::OnUpdateMorphThining(CCmdUI* pCmdUI)
{
//创建点处理CPointPro类对象
CPointPro PointOperation( m_pDibObject );
pCmdUI->Enable(PointOperation.IsBlackandWhite256());
}
void CDipDoc::OnUpdateMorphHitmissing(CCmdUI* pCmdUI)
{
//创建点处理CPointPro类对象
CPointPro PointOperation( m_pDibObject );
pCmdUI->Enable(PointOperation.IsBlackandWhite256());
}
void CDipDoc::OnAnalyseFeature()
{
//判断当前是否有图像对象
if(m_pDibObject == NULL ) return;
CImgAnalyse ImgAnalyse(m_pDibObject);
m_bIsTraced = FALSE;
m_bIsLabeled = FALSE;
if(ImgAnalyse.GetEdgePointNum()<1)
{
AfxMessageBox("在特征分析前没有跟踪轮廓或跟踪不正确!\n\n请重新进行轮廓跟踪!!!");
return;
}
CDlgFeature dlgFeature;
dlgFeature.DoModal();
}
void CDipDoc::OnAnalyseLabel()
{
if(m_pDibObject==NULL)return;
CImgAnalyse ImgAnalyse(m_pDibObject);
ImgAnalyse.LabelArea();
m_bIsLabeled = TRUE;
//更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnAnalyseTrace()
{
//判断当前是否有图像对象
if(m_pDibObject == NULL ) return;
//边界跟踪
CImgAnalyse ImgAnalyse(m_pDibObject);
ImgAnalyse.EdgeTrace();
m_bIsTraced = TRUE;
m_bIsLabeled = FALSE;
//更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnUpdateAnalyseFeature(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bIsTraced);
}
void CDipDoc::OnUpdateAnalyseLabel(CCmdUI* pCmdUI)
{
//创建点处理CPointPro类对象
CPointPro PointOperation( m_pDibObject );
pCmdUI->Enable(PointOperation.IsBlackandWhite256());
}
void CDipDoc::OnUpdateAnalyseTrace(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bIsLabeled);
}
void CDipDoc::OnCodeArith()
{
CDlgStrInput InputBox;
if(InputBox.DoModal() == IDOK)
{
CString strTemp,strNew,strCodeL,strCodeR;
int i,j,s;
BYTE *uCodeNum;
FLOAT *fFreq,*fInterval;
strTemp = InputBox.m_strInput;
//分配内存
uCodeNum = new BYTE[strTemp.GetLength()];
s = 0;
i = 0;
while( strTemp.GetLength() > 0 )
{
strNew += strTemp.GetAt(0);
//各个符号的数目
s = strTemp.Remove(strTemp.GetAt(0));
uCodeNum[i] = (BYTE)s;
//统计字符串中的符号数
i++;
}
//分配内存
fFreq = new FLOAT[i];
//各符号的初始区间的左端
fInterval = new FLOAT[i];
//按照字符串中出现的字符依次计算字符串的所处的间隔
float fStart = 0.0f,fEnd = 0.0f,fStartB = 0.0f,fLeft = 0.0f,fRight = 0.0f,fLen = 0.0f;
strTemp = InputBox.m_strInput;
//统计各个符号的频率
for(j=0;j<i;j++)
{
fFreq[j] = (float)uCodeNum[j]/strTemp.GetLength();
}
//确定各符号的初始区间的左端
fInterval[0] = 0.0f;
i = 1;
while(i < strNew.GetLength())
{
fInterval[i] = fInterval[i-1] + fFreq[i-1];
i++;
}
//前一间隔的起始位置
fStartB = 0.0f;
fLen = fFreq[0];
for(i=1;i<strTemp.GetLength();i++)
{
//确定字符串中各字符在新字符串中的位置
j = strNew.Find(strTemp.GetAt(i));
//当前编码符号的初始区间的左端和右端
fLeft = fInterval[j];
fRight = fLeft + fFreq[j];
//新区间的起始位置
fStart = fStartB +fLeft*fLen;
fEnd = fStartB + fRight*fLen;
//更新前一间隔的起始位置和间隔长度
fStartB = fStart;
fLen = fEnd - fStart;
}
//对最后的新间隔(即fStart,fEnd)转换为二进制
FLOAT fTemp1,fTemp2;
fTemp1 = fStart;
fTemp2 = fEnd;
while(((fTemp1*2 >= 1.0) && (fTemp2*2 >= 1.0)) || ((fTemp1*2 < 1.0) && (fTemp2*2 < 1.0)))
{
//如果两个数都被完全转换,则退出循环
if((fTemp1 == 0.0) && (fTemp2 == 0.0)) break;
//将fStart转换为二进制
if( fTemp1*2 >= 1.0 )
{
strCodeL += "1";
fTemp1 = fTemp1*2 - 1;
}
else
{
strCodeL += "0";
fTemp1 = fTemp1 * 2;
}
//将fEnd转换为二进制
if( fTemp2*2 >= 1.0 )
{
strCodeR += "1";
fTemp2 = fTemp2*2 - 1;
}
else
{
strCodeR += "0";
fTemp2 = fTemp2 * 2;
}
}
//最后取两者二进制的中间值
if( fTemp2*2 >= 1.0 )
{
strCodeL += "1";
}
//输出编码结果
AfxMessageBox(strCodeL);
delete [] uCodeNum;
delete [] fInterval;
delete [] fFreq;
}
}
void CDipDoc::OnCodeHuffman()
{
int imgSize;
imgSize = m_pDibObject->GetWidth()*m_pDibObject->GetHeight();
//在点处理CPointPro类中创建用来绘制直方图的数据
CPointPro PointOperation(m_pDibObject );
int *pHistogram = PointOperation.GetHistogram();
//生成一个对话框CHistDlg类的实例
CDlgHuffman HuffmanDlg;
//将绘制直方图的数据传递给CHistDlg对话框类的公有成员变量m_pnHistogram
if( pHistogram != NULL )
{
//设置直方图数据指针
HuffmanDlg.m_fFreq = pHistogram;
HuffmanDlg.m_iSizeImage = imgSize;
if(m_pDibObject->GetNumBits() >= 8)
HuffmanDlg.m_iLeafNum=256;
else
HuffmanDlg.m_iLeafNum=m_pDibObject->GetNumBits();
}
//显示对话框
if ( HuffmanDlg.DoModal() != IDOK)
return;
delete [] pHistogram;
}
void CDipDoc::OnCodeShannon()
{
/* int i,j,imgSize;
FLOAT *fFreq;
BYTE *uMap;
int *pHist;
//在点处理CPointPro类中创建直方图数据,并定义指向该数据的指针
CPointPro PointOperation(m_pDibObject);
pHist = PointOperation.GetHistogram();
//图像大小
imgSize = m_pDibObject->GetWidth()*m_pDibObject->GetHeight();
//统计频率不为0的灰度数
j = 0;
for(i=0;i<256;i++)
{
if(pHist[i] > 0) j++;
}
// 分配内存
fFreq = new FLOAT[j];
uMap = new BYTE[j];
//计算图像中亮度数据的各灰度的频率
j = 0;
for(i=0;i<256;i++)
{
if(pHist[i] > 0)
{
fFreq[j] = (float)pHist[i]/imgSize;
//记住频率不为0的灰度的映射关系
uMap[j] = i;
j++;
}
}
//创建香农编码对话框实例
CDlgShannon Shannon;
//传递灰度频率数据、灰度级数给对话框
Shannon.m_fFreq = fFreq;
Shannon.m_uMap = uMap;
Shannon.m_iColorNum = j;
//显示对话框
Shannon.DoModal();
//释放内存
delete[] fFreq;
delete[] uMap;
*/
//***************
//把上面的代码替换为下面的代码可以对指定的信源符号进行香农编码
FLOAT fFreq[8];
BYTE uMap[8];
fFreq[0] = 0.4f;
fFreq[1] = 0.18f;
fFreq[2] = 0.10f;
fFreq[3] = 0.10f;
fFreq[4] = 0.07f;
fFreq[5] = 0.06f;
fFreq[6] = 0.05f;
fFreq[7] = 0.04f;
for(int i=0;i<8;i++) uMap[i] = i;
CDlgShannon Shannon;
Shannon.m_fFreq = fFreq;
Shannon.m_iColorNum = 8;
Shannon.m_uMap = uMap;
Shannon.DoModal();
/****************/
}
void CDipDoc::OnUpdateCodeArith(CCmdUI* pCmdUI)
{
//判断当前是否有图像对象
if( m_pDibObject == NULL ) return;
//在点处理CPointPro类中创建用来绘制直方图的数据
CPointPro PointOperation( m_pDibObject );
//判断是否为256色灰度图像
pCmdUI->Enable(PointOperation.IsGray256());
}
void CDipDoc::OnUpdateCodeHuffman(CCmdUI* pCmdUI)
{
//判断当前是否有图像对象
if( m_pDibObject == NULL ) return;
//在点处理CPointPro类中创建用来绘制直方图的数据
CPointPro PointOperation( m_pDibObject );
//判断是否为256色灰度图像
pCmdUI->Enable(PointOperation.IsGray256());
}
void CDipDoc::OnUpdateCodeShannon(CCmdUI* pCmdUI)
{
//判断当前是否有图像对象
if( m_pDibObject == NULL ) return;
//在点处理CPointPro类中创建用来绘制直方图的数据
CPointPro PointOperation( m_pDibObject );
//判断是否为256色灰度图像
pCmdUI->Enable(PointOperation.IsGray256());
}
void CDipDoc::OnRestoreBlur()
{
//判断当前是否载入图像
if( m_pDibObject == NULL ) return;
//定义一个图像复原对象
CRestore Restore( m_pDibObject );
//调用卷积模糊函数
Restore.ConvBlur();
//更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnRestoreConvnoise()
{
//判断当前是否载入图像
if( m_pDibObject == NULL ) return;
//定义一个图像复原对象
CRestore Restore( m_pDibObject );
//调用卷积器噪音模糊函数
Restore.ConvNoiseBlur();
//更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnRestoreInvfilt()
{
//判断当前是否载入图像
if( m_pDibObject == NULL ) return;
//定义一个图像复原对象
CRestore Restore( m_pDibObject );
//调用逆滤波复原函数
Restore.InvFilter();
//更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnRestoreWinner()
{
//判断当前是否载入图像
if( m_pDibObject == NULL ) return;
//定义一个图像复原对象
CRestore Restore( m_pDibObject );
//调用维纳滤波复原函数
Restore.Wiener();
//更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnUpdateRestoreBlur(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() == 8);
}
void CDipDoc::OnUpdateRestoreConvnoise(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() == 8);
}
void CDipDoc::OnUpdateRestoreInvfilt(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() == 8);
}
void CDipDoc::OnUpdateRestoreWinner(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() == 8);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -