📄 data_compress_systemview.cpp
字号:
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 计算灰度分布密度
CGrayProc clsGrayProc;
clsGrayProc.GetIntensity(pDoc->GetHDIB(), fPs_Y);
// 创建对话框
CDlgPointDZ dlg;
dlg.m_pDoc = pDoc;
// 传递灰度分布密度数据给面板类
for (i = 0; i <256; i++)
dlg.m_fIntensity[i] = fPs_Y[i];
// 显示对话框,由用户进行灰度折线变换
dlg.DoModal();
}
///////////////////////////////////////////
// 规定灰度直方图分布 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnSetIntensity()
{
}
///////////////////////////////////////////
// 单映射规则进行直方图规定化 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnPointSml()
{
//--------调试代码 开始------------------------------------------
int nu[64];
float pu[64];
float a=1.0f/(32.0f*63.0f);
for(int i=0;i<64;i++)
{
nu[i]=i*4;
pu[i]=a*i;
}
//--------调试代码 结束------------------------------------------
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 计算灰度分布密度
CGrayProc clsGrayProc;
clsGrayProc.PointSML(pDoc->GetHDIB(), 64,nu, pu);
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////////////////////
// 组映射规则进行直方图规定化 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnPointGml()
{
//--------调试代码 开始------------------------------------------
int nu[64];
float pu[64];
float a=1.0f/(32.0f*63.0f);
for(int i=0;i<64;i++)
{
nu[i]=i*4;
pu[i]=a*i;
}
//--------调试代码 结束------------------------------------------
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 计算灰度分布密度
CGrayProc clsGrayProc;
clsGrayProc.PointGML(pDoc->GetHDIB(), 64,nu, pu);
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////////////////////
// 对灰度进行动态范围压缩 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnDynamicCompress()
{
// 创建对话框
CDynamicCompressParam dlg;
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
dlg.m_pDoc = pDoc;
// 显示对话框,由用户进行尺度比例常数设定
dlg.DoModal();
}
///////////////////////////////////////////
// 对灰度进行削波处理 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnCutWave()
{
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 对图象进行巴特沃斯低通滤波
CGrayProc clsGrayProc;
clsGrayProc.CutWave(pDoc->GetHDIB());
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////[图像分割部分]////////////////////////////////////////////
///////////////////////////////////////////
// 对图像实施区域生长处理 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnRgnGrow()
{
// 区域生长种子RGB值
COLORREF clrSeed_I, clrSeed_II;
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 操作导航
if (pDoc->m_ptPoint_I == CPoint(0, 0))
{
MessageBox("请先双击图像以设置种子点一!", "系统提示" , MB_ICONINFORMATION | MB_OK);
return;
}
if (pDoc->m_ptPoint_II == CPoint(0, 0))
{
MessageBox("请先双击图像以设置种子点二!", "系统提示" , MB_ICONINFORMATION | MB_OK);
return;
}
// 获取设备DC
CDC* pDC = GetDC();
// 获取种子一的RGB值
clrSeed_I = pDC->GetPixel(pDoc->m_ptPoint_I);
// 获取种子二的RGB值
clrSeed_II = pDC->GetPixel(pDoc->m_ptPoint_II);
// 释放资源
ReleaseDC(pDC);
// 调用区域生长函数对图象进行分割
CSplitProc clsSplitProc;
clsSplitProc.RgnGrow(pDoc->GetHDIB(), clrSeed_I, clrSeed_II);
// 清除种子点
pDoc->m_ptPoint_I = CPoint(0, 0);
pDoc->m_ptPoint_II = CPoint(0, 0);
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////////////////////
// 对图像进行轮廓提取 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnContourdib()
{
// 区域生长种子RGB值
COLORREF clrSeed_I, clrSeed_II;
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 操作导航
if (pDoc->m_ptPoint_I == CPoint(0, 0))
{
MessageBox("请先双击图像以设置种子点一!", "系统提示" , MB_ICONINFORMATION | MB_OK);
return;
}
if (pDoc->m_ptPoint_II == CPoint(0, 0))
{
MessageBox("请先双击图像以设置种子点二!", "系统提示" , MB_ICONINFORMATION | MB_OK);
return;
}
// 获取设备DC
CDC* pDC = GetDC();
// 获取种子一的RGB值
clrSeed_I = pDC->GetPixel(pDoc->m_ptPoint_I);
// 获取种子二的RGB值
clrSeed_II = pDC->GetPixel(pDoc->m_ptPoint_II);
// 释放资源
ReleaseDC(pDC);
// 进行轮廓提取
CSplitProc clsSplitProc;
clsSplitProc.ContourDIB(pDoc->GetHDIB(), clrSeed_I, clrSeed_II);
// 清除种子点
pDoc->m_ptPoint_I = CPoint(0, 0);
pDoc->m_ptPoint_II = CPoint(0, 0);
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////////////////////
// 对图像进行边界跟踪 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnTracedib()
{
// 区域生长种子RGB值
COLORREF clrSeed;
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 操作导航
if (pDoc->m_ptPoint_II == CPoint(0, 0))
{
MessageBox("请先双击目标以设置种子点!", "系统提示" , MB_ICONINFORMATION | MB_OK);
return;
}
// 获取设备DC
CDC* pDC = GetDC();
// 获取目标的颜色值
if (pDoc->m_ptPoint_I == CPoint(0, 0))
clrSeed = pDC->GetPixel(pDoc->m_ptPoint_II);
else
clrSeed = pDC->GetPixel(pDoc->m_ptPoint_I);
// 释放资源
ReleaseDC(pDC);
// 进行轮廓提取
CSplitProc clsSplitProc;
clsSplitProc.TraceDIB(pDoc->GetHDIB(), clrSeed);
// 清除种子点
pDoc->m_ptPoint_I = CPoint(0, 0);
pDoc->m_ptPoint_II = CPoint(0, 0);
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////////////////////
// 对图像进行索贝尔算子的梯度滤波 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnSobel()
{
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 进行索贝尔算子梯度滤波
CSplitProc clsSplitProc;
clsSplitProc.Sobel(pDoc->GetHDIB());
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////////////////////
// 对图像进行蒲瑞维特算子的梯度滤波 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnPrewitt()
{
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 进行索贝尔算子梯度滤波
CSplitProc clsSplitProc;
clsSplitProc.Prewitt(pDoc->GetHDIB());
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////////////////////
// 对图像进行罗伯特交叉算子的梯度滤波 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnRoberts()
{
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 进行索贝尔算子梯度滤波
CSplitProc clsSplitProc;
clsSplitProc.Roberts(pDoc->GetHDIB());
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////////////////////
// 对图像进行Kirsch算子的梯度滤波 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnKrisch()
{
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 进行索贝尔算子梯度滤波
CSplitProc clsSplitProc;
clsSplitProc.Kirsch(pDoc->GetHDIB());
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////////////////////
// 对图像进行拉普拉斯算子的滤波 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnLaplacian()
{
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 进行索贝尔算子梯度滤波
CSplitProc clsSplitProc;
clsSplitProc.Laplacian(pDoc->GetHDIB());
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////////////////////
// 对图像进行高斯——拉普拉斯算子的滤波 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnGuassLaplacian()
{
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 进行索贝尔算子梯度滤波
CSplitProc clsSplitProc;
clsSplitProc.GuassLaplacian(pDoc->GetHDIB());
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////////////////////
// 对图像进行哈夫变换以检测圆周 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnHough()
{
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 进行索贝尔算子梯度滤波
CSplitProc clsSplitProc;
clsSplitProc.Hough(pDoc->GetHDIB());
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////////////////////
// 对图像进行阀值迭代的阀值化分割处理 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnIterateThreshold()
{
// 各颜色分量的灰度分布密度
int nNY[256];
memset(nNY, 0, sizeof(nNY));
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 计算灰度分布密度
CGrayProc clsGrayProc;
clsGrayProc.GetIntensity(pDoc->GetHDIB(), nNY);
// 根据阀值对图象进行阀值化分割处理
CSplitProc clsSplitProc;
clsSplitProc.Threshold(pDoc->GetHDIB(), nNY);
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////[图像空域滤波部分]////////////////////////////////////////////
///////////////////////////////////////////
// 对图像实施浮雕化处理(共八种) //
///////////////////////////////////////////
void CData_Compress_SystemView::OnEmboss_1()
{
DoEmboss(EMBOSS_1);
}
void CData_Compress_SystemView::OnEmboss_2()
{
DoEmboss(EMBOSS_2);
}
void CData_Compress_SystemView::OnEmboss_3()
{
DoEmboss(EMBOSS_3);
}
void CData_Compress_SystemView::OnEmboss_4()
{
DoEmboss(EMBOSS_4);
}
void CData_Compress_SystemView::OnEmboss_5()
{
DoEmboss(EMBOSS_5);
}
void CData_Compress_SystemView::OnEmboss_6()
{
DoEmboss(EMBOSS_6);
}
void CData_Compress_SystemView::OnEmboss_7()
{
DoEmboss(EMBOSS_7);
}
void CData_Compress_SystemView::OnEmboss_8()
{
DoEmboss(EMBOSS_8);
}
void CData_Compress_SystemView::DoEmboss(int nEmbossMode)
{
// 创建新DIB
HDIB hNewDIB = NULL;
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 进行浮雕化处理
CSpaceFilter clsSpaceFilter;
hNewDIB = clsSpaceFilter.MakeEmboss(pDoc->GetHDIB(), nEmbossMode);
// 判断处理是否成功
if (hNewDIB != NULL)
{
// 替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hNewDIB);
// 更新DIB大小和调色板
pDoc->InitDIBData();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 重新设置滚动视图大小
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -