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

📄 imageprocessingview.cpp

📁 提供了图像识别
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	// 图象的沃尔什-哈达玛变换
	
	// 更改光标形状
	BeginWaitCursor();

	// 获取文档
	CImageProcessingDoc* pDoc = GetDocument();

	//  获得图象CDib类的指针
	CDib * pDib = pDoc->m_pDibInit;

	// 获得图象的头文件信息
	LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;

	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的沃尔什-哈达玛变换)
	if (lpBMIH->biBitCount != 8)
	{
		// 提示用户
		MessageBox("目前只支持256色位图的离散沃尔什变换!", "系统提示" ,
			MB_ICONINFORMATION | MB_OK);
						
		// 返回
		return;
	}

	//  进行沃尔什-哈达玛变换
	DIBWalsh(pDib);
	
	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);
		
	// 更新视图
	pDoc->UpdateAllViews(NULL);

    // 恢复光标
	EndWaitCursor();
	
}

/*************************************************************************
 *
 * \函数名称:
 *   OnViewHistogram()
 *
 * \输入参数:
 *   无
 * 
 * \返回值:
 *   无
 *
 * \说明:
 *   查看直方图,弹出直方图显示界面
 *
 *************************************************************************
 */
void CImageProcessingView::OnViewHistogram() 
{
	// 获取文档
	CImageProcessingDoc* pDoc = GetDocument();

	// DIB的颜色数目
	int nColorTableEntries;
	nColorTableEntries = pDoc->m_pDibInit->m_nColorTableEntries;
		
	// 判断是否是8bpp位图(这里只处理8bpp位图)
	if ( nColorTableEntries != 256)
	{
		// 提示用户,不再进行处理
		MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
		
		// 返回
		return;
	}
	
	// 更改光标形状
	BeginWaitCursor();
	
	// 创建对话框
	CDlgHistShow dlgHistShow;
	
	// 初始化变量值
	dlgHistShow.m_pDib = pDoc->m_pDibInit;
		
	// 显示对话框
	if (dlgHistShow.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	
	// 恢复光标
	EndWaitCursor();	
}

/*************************************************************************
 *
 * \函数名称:
 *   OnEnhanceSmooth()
 *
 * \输入参数:
 *   无
 * 
 * \返回值:
 *   无
 *
 * \说明:
 *   对图象进行平滑处理,并弹出平滑模板设置对话框
 *
 *************************************************************************
 */
void CImageProcessingView::OnEnhanceSmooth() 
{
	// TODO: Add your command handler code here
		// 图像平滑
	
	// 获取文档
	CImageProcessingDoc* pDoc = GetDocument();
	
	// 模板高度
	int		nTempHeight;
	
	// 模板宽度
	int		nTempWidth;
	
	// 模板系数
	double		dbTempCoef;
	
	// 模板中心元素X坐标
	int		nTempCenX;
	
	// 模板中心元素Y坐标
	int		nTempCenY;
	
	// 模板元素数组
	double	pdbTemp[25];
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平滑,其它的可以类推)
	if(pDoc->m_pDibInit->m_nColorTableEntries != 256)
	//if (::DIBNumColors(lpDIB) != 256)
	{
		// 提示用户
		MessageBox("目前只支持256色位图的平滑!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		
		// 返回
		return;
	}
	
	// 创建对话框
	CDlgSmooth dlgSmth;
	
	// 给模板数组赋初值(为平均模板)
	pdbTemp[0] = 1.0;
	pdbTemp[1] = 1.0;
	pdbTemp[2] = 1.0;
	pdbTemp[3] = 0.0;
	pdbTemp[4] = 0.0;
	pdbTemp[5] = 1.0;
	pdbTemp[6] = 1.0;
	pdbTemp[7] = 1.0;
	pdbTemp[8] = 0.0;
	pdbTemp[9] = 0.0;
	pdbTemp[10] = 1.0;
	pdbTemp[11] = 1.0;
	pdbTemp[12] = 1.0;
	pdbTemp[13] = 0.0;
	pdbTemp[14] = 0.0;
	pdbTemp[15] = 0.0;
	pdbTemp[16] = 0.0;
	pdbTemp[17] = 0.0;
	pdbTemp[18] = 0.0;
	pdbTemp[19] = 0.0;
	pdbTemp[20] = 0.0;
	pdbTemp[21] = 0.0;
	pdbTemp[22] = 0.0;
	pdbTemp[23] = 0.0;
	pdbTemp[24] = 0.0;
	
	// 初始化对话框变量值
	dlgSmth.m_nTemType  = 0;
	dlgSmth.m_nSmthTemHeight  = 3;
	dlgSmth.m_nSmthTemWidth  = 3;
	dlgSmth.m_nSmthTemCenX = 1;
	dlgSmth.m_nSmthTemCenY = 1;
	dlgSmth.m_dbSmthTemCoef  = (double) (1.0 / 9.0);
	dlgSmth.m_pdbTemp = pdbTemp;
	
	// 显示对话框,提示用户设定平移量
	if (dlgSmth.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	
	// 获取用户设定的平移量
	nTempHeight   = dlgSmth.m_nSmthTemHeight;
	nTempWidth  = dlgSmth.m_nSmthTemWidth;
	nTempCenX = dlgSmth.m_nSmthTemCenX;
	nTempCenY = dlgSmth.m_nSmthTemCenY;
	dbTempCoef  = dlgSmth.m_dbSmthTemCoef;
	
	// 删除对话框
	delete dlgSmth;	
	
	// 更改光标形状
	BeginWaitCursor();
	
	// 调用Template()函数平滑DIB
	if (GeneralTemplate(pDoc->m_pDibInit, nTempWidth, nTempHeight, 
		nTempCenX, nTempCenY, pdbTemp, dbTempCoef))
	{		
		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	
	// 恢复光标
	EndWaitCursor();	
	
}

/*************************************************************************
 *
 * \函数名称:
 *   OnEnhanceMedian()
 *
 * \输入参数:
 *   无
 * 
 * \返回值:
 *   无
 *
 * \说明:
 *   对图象进行中值滤波,并弹出平滑模板设置对话框
 *
 *************************************************************************
 */
void CImageProcessingView::OnEnhanceMedian() 
{
	// 中值滤波
	
	// 获取文档
	CImageProcessingDoc* pDoc = GetDocument();
	
	// 滤波器的高度
	int nFilterHeight;
	
	// 滤波器的宽度
	int nFilterWidth;
	
	// 中心元素的X坐标
	int nFilterCenX;
	
	// 中心元素的Y坐标
	int nFilterCenY;
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平滑,其它的可以类推)
	if(pDoc->m_pDibInit->m_nColorTableEntries != 256)
	{
		// 提示用户
		MessageBox("目前只支持256色位图的平滑!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		
		// 返回
		return;
	}
	
	
	// 创建对话框
	CDlgMedian dlgMedian;
	
	// 初始化变量值
	dlgMedian.m_nFilterType = 0;
	dlgMedian.m_nFilterHeight = 3;
	dlgMedian.m_nFilterWidth = 1;
	dlgMedian.m_nFilterCenX = 0;
	dlgMedian.m_nFilterCenY = 1;
	
	// 显示对话框,提示用户设定平移量
	if (dlgMedian.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	
	// 获取用户的设定
	nFilterHeight = dlgMedian.m_nFilterHeight;
	nFilterWidth = dlgMedian.m_nFilterWidth;
	nFilterCenX = dlgMedian.m_nFilterCenX;
	nFilterCenY = dlgMedian.m_nFilterCenY;
	
	// 删除对话框
	delete dlgMedian;	
	
	// 更改光标形状
	BeginWaitCursor();
	
	// 调用MedianFilter()函数中值滤波
	if (MedianFilter(pDoc->m_pDibInit, nFilterWidth,
		nFilterHeight, nFilterCenX, nFilterCenY ))
	
	{		
		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	
	// 恢复光标
	EndWaitCursor();

	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);
	
	// 更新视图
	pDoc->UpdateAllViews(NULL);
	
}


void CImageProcessingView::OnEnhancePseudcolor() 
{
	// 伪彩色编码
	
	// 获取文档
	CImageProcessingDoc* pDoc = GetDocument();
	
	// 保存用户选择的伪彩色编码表索引
	int		nColor;
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平滑,其它的可以类推)
	if(pDoc->m_pDibInit->m_nColorTableEntries != 256)
	{
		// 提示用户
		MessageBox("目前只支持256色位图的伪彩色变换!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);

		// 返回
		return;
	}
	
	// 参数对话框
	CDlgEnhColor dlgPara;
	
	// 初始化变量值
	if (pDoc->m_nColorIndex >= 0)
	{
		// 初始选中当前的伪彩色
		dlgPara.m_nColor = pDoc->m_nColorIndex;
	}
	else
	{
		// 初始选中灰度伪彩色编码表
		dlgPara.m_nColor = 0;
	}
	
	// 指向名称数组的指针
	dlgPara.m_lpColorName = (LPSTR) ColorScaleName;
	
	// 伪彩色编码数目
	dlgPara.m_nColorCount = COLOR_SCALE_COUNT;
	
	// 名称字符串长度
	dlgPara.m_nNameLen = sizeof(ColorScaleName) / COLOR_SCALE_COUNT;
	
	// 显示对话框,提示用户设定平移量
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	
	// 获取用户的设定
	nColor = dlgPara.m_nColor;
	
	// 删除对话框
	delete dlgPara;	
	
	// 更改光标形状
	BeginWaitCursor();
	
	// 判断伪彩色编码是否改动
	if (pDoc->m_nColorIndex != nColor)
	{
		// 调用ReplaceColorPal()函数变换调色板
		ReplaceDIBColorTable(pDoc->m_pDibInit, (LPBYTE)ColorsTable[nColor]);
		
		// 更新调色板
		pDoc->m_pDibInit->MakePalette();
		
		// 更新类成员变量
		pDoc->m_nColorIndex = nColor;
		
		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);
				
		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}	
	

	// 恢复光标
	EndWaitCursor();
}

void CImageProcessingView::OnTransDwt() 
{
	// 获得文档类指针
	CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();

	// 指向图象的指针
	CDib * pDib = pDoc->m_pDibInit;

	// 更改光标形状
	BeginWaitCursor();

	// 进行小波变换
	int rsl = DIBDWTStep(pDib,0);

	// 恢复光标形状
	EndWaitCursor();

	// 如果小波变换不成功,则直接返回
	if (!rsl)			
		return;

	// 设置脏标志
	pDoc->SetModifiedFlag(TRUE);

	// 更新显示
	pDoc->UpdateAllViews(FALSE);
}

void CImageProcessingView::OnTransIdwt() 
{
	// 获得文档类指针	
	CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();

	// 指向图象的指针
	CDib * pDib = pDoc->m_pDibInit;

	// 更改光标形状
	BeginWaitCursor();

	// 进行小波反变换
	int rsl = DIBDWTStep(pDib,1);

	// 恢复光标形状
	EndWaitCursor();

	// 如果小波变换不成功,则直接返回
	if (!rsl)			
		return;
	pDoc->UpdateAllViews(FALSE);

	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);
	
	// 更新视图
	pDoc->UpdateAllViews(NULL);
}

BOOL CImageProcessingView::DIBDWTStep(CDib* pDib, int nInv)
{
	// 循环变量
	int i, j;

	// 获取图象的长度和宽度
	int nWidth  = pDib->m_lpBMIH->biWidth;
	int nHeight = pDib->m_lpBMIH->biHeight;
		
	// 获取变换的最大层数
	int nMaxWLevel = Log2(nWidth);
	int nMaxHLevel = Log2(nHeight);
	int nMaxLevel;
	if (nWidth == 1<<nMaxWLevel && nHeight == 1<<nMaxHLevel)
		nMaxLevel = min(nMaxWLevel, nMaxHLevel);

	// 获取图象的存储尺寸
	CSize sizeImageSave = pDib->GetDibSaveDim();

	// 临时变量
	double	*pDbTemp;
	BYTE	*pBits;

	// 如果小波变换的存储内存还没有分配,则分配此内存
	if(!m_pDbImage){			
		m_pDbImage = new double[nWidth*nHeight];
		if (!m_pDbImage)	return FALSE;

		// 将图象数据放入m_pDbImage中 
		for (j=0; j<nHeight; j++)
		{
			pDbTemp = m_pDbImage + j*sizeImageSave.cx;
			pBits = pDib->m_lpImage + (nHeight-1-j)*sizeImageSave.cx;		
			for (i=0; i<nWidth; i++)
				pDbTemp[i] = pBits[i];
		}
	}
	
	// 进行小波变换(或反变换)
	if (!DWTStep_2D(m_pDbImage, nMaxWLevel-m_nDWTCurDepth, nMaxHLevel-m_nDWTCurDepth,
						nMaxWLevel, nMaxHLevel, nInv, 1, m_nSupp))
		return FALSE;

	// 如果是反变换,则当前层数减1
	if (nInv)
		m_nDWTCurDepth --;
	// 否则加1
	else
		m_nDWTCurDepth ++;

	// 然后,将数据拷贝回原CDib中,并进行相应的数据转换
	int lfw = nWidth>>m_nDWTCurDepth, lfh = nHeight>>m_nDWTCurDepth;
	for (j=0; j<nHeight; j++)
	{
		pDbTemp = m_pDbImage + j*sizeImageSave.cx;
		pBits = pDib->m_lpImage + (nHeight-1-j)*sizeImageSave.cx;
		for (i=0; i<nWidth; i++)
		{
			if (j<lfh && i<lfw)
				pBits[i] = FloatToByte(pDbTemp[i]);
			else
				pBits[i] = BYTE(FloatToChar(pDbTemp[i]) ^ 0x80);			
		}
	}

	// 返回
	return TRUE;
}
void CImageProcessingView::OnEnhanceLintrans() 
{
	// 获取文档
	CImageProcessingDoc* pDoc = GetDocument();

	// 创建对话框
	CDlgEhnLinTrans dlgPara;
	
	// 点1坐标
	int	nX1;
	int	nY1;
	
	// 点2坐标
	int	nX2;
	int	nY2;

	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的灰度拉伸,其它的可以类推)
	if(pDoc->m_pDibInit->m_nColorTableEntries != 256)
	{
		// 提示用户
		MessageBox("目前只支持256色位图的伪彩色变换!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);

		// 返回
		return;
	}
	
	// 初始化变量值
	dlgPara.m_nX1 = 50;
	dlgPara.m_nY1 = 30;
	dlgPara.m_nX2 = 200;
	dlgPara.m_nY2 = 220;
	
	// 显示对话框,提示用户设定拉伸位置
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	
	// 获取用户的设定
	nX1 = dlgPara.m_nX1;
	nY1 = dlgPara.m_nY1;
	nX2 = dlgPara.m_nX2;
	nY2 = dlgPara.m_nY2;
	
	// 删除对话框
	delete dlgPara;	

⌨️ 快捷键说明

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