⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 data_compress_systemview.cpp

📁 各种数据压缩和解压的源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:

	// 获取文档
	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 + -