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

📄 templatetransview.cpp

📁 人民邮电出版社的——Visual C++数字图像处理典型算法及实现(源码) 希望大家能用上
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	EndWaitCursor();
}

void CTemplateTransView::OnEnhaGradsharp() 
{
	// 梯度锐化

	CTemplateTransDoc* pDoc = GetDocument();
		
	LPSTR lpDIB;				// 指向DIB的指针	
	LPSTR    lpDIBBits;			// 指向DIB象素指针
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());

	// 找到DIB图像象素起始位置
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);	
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的梯度锐化,其它的可以类推)
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
	{
		MessageBox("目前只支持256色位图的梯度锐化!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

		return;
	}
	
	BYTE	bThre;			// 阈值

	CSharpThreDlg dlgPara;
	dlgPara.m_bThre = 10;	
	// 提示用户输入阈值
	if (dlgPara.DoModal() != IDOK)
	{
		return;
	}
	
	bThre = dlgPara.m_bThre;
	delete dlgPara;	
	
	BeginWaitCursor();
	
	// 调用GradSharp()函数进行梯度板锐化
	if (pDoc->GetDibImage()->GradSharp(lpDIBBits,
		pDoc->GetDibImage()->DIBWidth(lpDIB), 
		pDoc->GetDibImage()->DIBHeight(lpDIB), bThre))
	{		
		pDoc->SetModifiedFlag(TRUE);		// 设置脏标记		
		pDoc->UpdateAllViews(NULL);			// 更新视图
	}
	else
	{
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

	EndWaitCursor();
}

void CTemplateTransView::OnENHAMidianF() 
{
	// 中值滤波
	
	CTemplateTransDoc* pDoc = GetDocument();
	
	LPSTR	lpDIB;				// 指向DIB的指针
	LPSTR   lpDIBBits;			// 指向DIB象素指针	
	int iFilterH;				// 滤波器的高度	
	int iFilterW;				// 滤波器的宽度	
	int iFilterMX;				// 中心元素的X坐标	
	int iFilterMY;				// 中心元素的Y坐标

	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	// 找到DIB图像象素起始位置
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的中值滤波,其它的可以类推)
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
	{
		MessageBox("目前只支持256色位图的中值滤波!", "系统提示" ,
			MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

		return;
	}

	CMidFilterDlg dlgPara;
	dlgPara.m_iFilterType = 0;
	dlgPara.m_iFilterH = 3;
	dlgPara.m_iFilterW = 1;
	dlgPara.m_iFilterMX = 0;
	dlgPara.m_iFilterMY = 1;	
	// 显示对话框,提示用户设定平移量
	if (dlgPara.DoModal() != IDOK)
	{
		return;
	}

	iFilterH = dlgPara.m_iFilterH;
	iFilterW = dlgPara.m_iFilterW;
	iFilterMX = dlgPara.m_iFilterMX;
	iFilterMY = dlgPara.m_iFilterMY;
	delete dlgPara;	
	
	BeginWaitCursor();
	
	// 调用MedianFilter()函数中值滤波
	if (pDoc->GetDibImage()->MedianFilter(lpDIBBits, 
		pDoc->GetDibImage()->DIBWidth(lpDIB), pDoc->GetDibImage()->
		DIBHeight(lpDIB), iFilterH, iFilterW, iFilterMX, iFilterMY))
	{
		pDoc->SetModifiedFlag(TRUE);		// 设置脏标记		
		pDoc->UpdateAllViews(NULL);			// 更新视图
	}
	else
	{
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

	EndWaitCursor();
}

void CTemplateTransView::OnEnhaSharp() 
{
	// 图像锐化
	
	CTemplateTransDoc* pDoc = GetDocument();
	
	LPSTR lpDIB;				// 指向DIB的指针	
	LPSTR    lpDIBBits;			// 指向DIB象素指针	
	int		iTempH;				// 模板高度	
	int		iTempW;				// 模板宽度	
	FLOAT	fTempC;				// 模板系数	
	int		iTempMX;			// 模板中心元素X坐标	
	int		iTempMY;			// 模板中心元素Y坐标	
	FLOAT	aValue[9];			// 模板元素数组

	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	// 找到DIB图像象素起始位置
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);	
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的锐化,其它的可以类推)
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
	{
		MessageBox("目前只支持256色位图的锐化!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

		return;
	}
	
	BeginWaitCursor();
	
	// 设置拉普拉斯模板参数
	iTempW = 3;
	iTempH = 3;
	fTempC = 1.0;
	iTempMX = 1;
	iTempMY = 1;
	aValue[0] = -1.0;
	aValue[1] = -1.0;
	aValue[2] = -1.0;
	aValue[3] = -1.0;
	aValue[4] =  9.0;
	aValue[5] = -1.0;
	aValue[6] = -1.0;
	aValue[7] = -1.0;
	aValue[8] = -1.0;
	
	// 调用Template()函数用拉普拉斯模板锐化DIB
	if (pDoc->GetDibImage()->Template(lpDIBBits,pDoc->GetDibImage()->DIBWidth(lpDIB), 
		pDoc->GetDibImage()->DIBHeight(lpDIB), iTempH, iTempW, iTempMX, 
		iTempMY, aValue, fTempC))
	{
		pDoc->SetModifiedFlag(TRUE);		// 设置脏标记		
		pDoc->UpdateAllViews(NULL);			// 更新视图
	}
	else
	{
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

	EndWaitCursor();
}

void CTemplateTransView::OnEnhaSmooth() 
{
	// 图像平滑
	
	CTemplateTransDoc* pDoc = GetDocument();
		
	LPSTR	lpDIB;				// 指向DIB的指针	
	LPSTR   lpDIBBits;			// 指向DIB象素指针	
	int		iTempH;				// 模板高度	
	int		iTempW;				// 模板宽度	
	FLOAT	fTempC;				// 模板系数	
	int		iTempMX;			// 模板中心元素X坐标	
	int		iTempMY;			// 模板中心元素Y坐标
	FLOAT	aValue[25];			// 模板元素数组

	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	// 找到DIB图像象素起始位置
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平滑,其它的可以类推)
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
	{
		MessageBox("目前只支持256色位图的平滑!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
		
		return;
	}
	
	CSmoothDlg dlgPara;	
	// 给模板数组赋初值(为平均模板)
	aValue[0] = 1.0;
	aValue[1] = 1.0;
	aValue[2] = 1.0;
	aValue[3] = 0.0;
	aValue[4] = 0.0;
	aValue[5] = 1.0;
	aValue[6] = 1.0;
	aValue[7] = 1.0;
	aValue[8] = 0.0;
	aValue[9] = 0.0;
	aValue[10] = 1.0;
	aValue[11] = 1.0;
	aValue[12] = 1.0;
	aValue[13] = 0.0;
	aValue[14] = 0.0;
	aValue[15] = 0.0;
	aValue[16] = 0.0;
	aValue[17] = 0.0;
	aValue[18] = 0.0;
	aValue[19] = 0.0;
	aValue[20] = 0.0;
	aValue[21] = 0.0;
	aValue[22] = 0.0;
	aValue[23] = 0.0;
	aValue[24] = 0.0;

	dlgPara.m_intType = 0;
	dlgPara.m_iTempH  = 3;
	dlgPara.m_iTempW  = 3;
	dlgPara.m_iTempMX = 1;
	dlgPara.m_iTempMY = 1;
	dlgPara.m_fTempC  = (FLOAT) (1.0 / 9.0);
	dlgPara.m_fpArray = aValue;
	
	// 显示对话框,提示用户设定平移量
	if (dlgPara.DoModal() != IDOK)
	{
		return;
	}
	
	iTempH  = dlgPara.m_iTempH;
	iTempW  = dlgPara.m_iTempW;
	iTempMX = dlgPara.m_iTempMX;
	iTempMY = dlgPara.m_iTempMY;
	fTempC  = dlgPara.m_fTempC;
	
	delete dlgPara;	
	BeginWaitCursor();
	
	// 调用Template()函数平滑DIB
	if (pDoc->GetDibImage()->Template(lpDIBBits,pDoc->GetDibImage()->DIBWidth(lpDIB), 
		pDoc->GetDibImage()->DIBHeight(lpDIB), iTempH, iTempW, iTempMX, 
		iTempMY, aValue, fTempC))
	{
		pDoc->SetModifiedFlag(TRUE);		// 设置脏标记		
		pDoc->UpdateAllViews(NULL);			// 更新视图
	}
	else
	{
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}

	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

	EndWaitCursor();
}

void CTemplateTransView::OnFILE256ToGray() 
{
	// 将256色位图转换成灰度图

	CTemplateTransDoc* pDoc = GetDocument();
		
	LPSTR	lpDIB;			// 指向DIB的指针
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	
	WORD wNumColors;		// DIB中颜色表中的颜色数目
	wNumColors = pDoc->GetDibImage()->DIBNumColors(lpDIB);
	
	// 判断是否是8-bpp位图
	if (wNumColors != 256)
	{
		MessageBox("非256色位图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

		return;
	}
	BeginWaitCursor();
		
	LPSTR   lpDIBBits;			// 指向DIB象素指针	
	BYTE *	lpSrc;				// 指向DIB象素的指针	
	LONG	i,j;				// 循环变量	
	LONG	lWidth;				// 图像宽度	
	LONG	lHeight;			// 图像高度	
	LONG	lLineBytes;			// 图像每行的字节数	
	LPBITMAPINFO lpbmi;			// 指向BITMAPINFO结构的指针(Win3.0)	
	LPBITMAPCOREINFO lpbmc;		// 指向BITMAPCOREINFO结构的指针	
	BOOL bWinStyleDIB;			// 表明是否是Win3.0 DIB的标记	
	lpbmi = (LPBITMAPINFO)lpDIB;// 获取指向BITMAPINFO结构的指针(Win3.0)	
	lpbmc = (LPBITMAPCOREINFO)lpDIB;	// 获取指向BITMAPCOREINFO结构的指针
	BYTE bMap[256];				// 灰度映射表	
	bWinStyleDIB = IS_WIN30_DIB(lpDIB);	// 判断是否是WIN3.0的DIB
	
	// 计算灰度映射表(保存各个颜色的灰度值),并更新DIB调色板
	for (i = 0; i < 256; i ++)
	{
		if (bWinStyleDIB)
		{
			// 计算该颜色对应的灰度值
			bMap[i] = (BYTE)(0.299 * lpbmi->bmiColors[i].rgbRed +
						     0.587 * lpbmi->bmiColors[i].rgbGreen +
					         0.114 * lpbmi->bmiColors[i].rgbBlue + 0.5);			
			// 更新DIB调色板红色绿色蓝色分量
			lpbmi->bmiColors[i].rgbRed = i;
			lpbmi->bmiColors[i].rgbGreen = i;
			lpbmi->bmiColors[i].rgbBlue = i;			
			// 更新DIB调色板保留位
			lpbmi->bmiColors[i].rgbReserved = 0;
		}
		else
		{
			// 计算该颜色对应的灰度值
			bMap[i] = (BYTE)(0.299 * lpbmc->bmciColors[i].rgbtRed +
						     0.587 * lpbmc->bmciColors[i].rgbtGreen +
					         0.114 * lpbmc->bmciColors[i].rgbtBlue + 0.5);			
			// 更新DIB调色板红色绿色蓝色分量
			lpbmc->bmciColors[i].rgbtRed = i;
			lpbmc->bmciColors[i].rgbtGreen = i;
			lpbmc->bmciColors[i].rgbtBlue = i;
		}
	}
	
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);// 找到DIB图像象素起始位置			
	lWidth = pDoc->GetDibImage()->DIBWidth(lpDIB);	// 获取图像宽度	
	lHeight = pDoc->GetDibImage()->DIBHeight(lpDIB);// 获取图像高度	
	lLineBytes = WIDTHBYTES(lWidth * 8);			// 计算图像每行的字节数
	
	// 更换每个象素的颜色索引(即按照灰度映射表换成灰度值)	
	for(i = 0; i < lHeight; i++)		// 每行
	{		
		for(j = 0; j < lWidth; j++)		// 每列
		{
			// 指向DIB第i行,第j个象素的指针
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;			
			*lpSrc = bMap[*lpSrc];		// 变换
		}
	}
	
	// 替换当前调色板为灰度调色板
	pDoc->GetDocPalette()->SetPaletteEntries(0,256,(LPPALETTEENTRY)ColorsTable[0]);	
	pDoc->SetModifiedFlag(TRUE);			// 设置脏标记	
	OnDoRealize((WPARAM)m_hWnd,0);			// 实现新的调色板	
	pDoc->UpdateAllViews(NULL);				// 更新视图
	
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	EndWaitCursor();	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -