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

📄 图像增强技术doc.cpp

📁 哥们图像增强技术的毕业设计
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				{
                    for(x=0;x<iTempW;x++)
					{
					   bValue[y*iTempW+x]=lpNewDIB[(j-iTempMY+y)*lLineBytes+x+i-iTempMX];
					}
				}

 	            //对模板内的灰度值进行排序
                for(y=0;y<iFilterLen-1;y++)
				{
 		            for(x=0;x<iFilterLen-y-1;x++)
					{
 			            if(bValue[x]>bValue[x+1])
						{
 				           //互换
 				           bTemp=bValue[x];
 				           bValue[x]=bValue[x+1];
                           bValue[x+1]=bTemp;
						}
					}
				}
 
 	            //找出该模板内灰度的中间值
 	            if(iFilterLen%2==0)
				{
	            	//偶数个元素,返回中间两个元素中间值
					bTemp=(bValue[iFilterLen/2]+bValue[iFilterLen/2-1])/2;
				}
 	            else
				{
					//奇数个元素,返回中间一个元素值
                    bTemp=bValue[(iFilterLen-1)/2];
				}
				lpBits[j*lLineBytes+i]=bTemp;
			}
		}
	}
/****************************用于计算峰值信噪比*********************************/
    FPSNRTemp=0.0;
	for(j=0;j<m_size.cy;j++)
	{
		for(i=0;i<lLineBytes;i++)
		{
			FPSNRTemp+=pow((double)(lpBits[j*lLineBytes+i]-lpTemp1DIB[j*lLineBytes+i]),2)/(m_size.cy*lLineBytes);
		}
	}

	FPSNR=10*log10(255*255/FPSNRTemp);    	
	PSNR=1;
	Caption.Format("*****您所用的滤波方法为%dx%d中值滤波*****",iTempH,iTempW);
/******************************************************************************/    
/******************************************************************************/
	FNMSETemp1=0.0;
	FNMSETemp2=0.0;
	for(j=0;j<m_size.cy;j++)
	{
		for(i=0;i<lLineBytes;i++)
		{
			FNMSETemp1+=pow((double)(lpBits[j*lLineBytes+i]-lpTempDIB[j*lLineBytes+i]),2);
			FNMSETemp2+=pow((double)lpTempDIB[j*lLineBytes+i],2);
		}
	}
	FNMSE=FNMSETemp1/FNMSETemp2;    	
	PSNR=1;
/******************************************************************************/
/*************************************************************/
	FSIF=0.0;
	FNMSETemp3=0;
	for(j=0;j<m_size.cy;j++)
	{
		for(i=0;i<lLineBytes;i++)
		{
			FNMSETemp3+=pow((double)(lpTempDIB[j*lLineBytes+i]-lpTemp1DIB[j*lLineBytes+i]),2);
		}
	}
	FSIF=-20*log10(FNMSETemp1/FNMSETemp3);
/*************************************************************/
	UpdateAllViews(NULL);
	SetModifiedFlag();
	LocalUnlock(lpNewDIB);
	LocalFree(lpNewDIB);
	free(bValue);
}
//10.图像中值滤波函数代码完毕

void CMyDoc::OnAddmidfilter() 
{
	// TODO: Add your command handler code here
    //该函数用加权中值滤波的方法对图像进行平滑

    //定义中值滤波参数设置对话框
	CMidFilterDlg dlg;
    //循环变量
	LONG i,j,x,y,k;
    //图像每行的字节数
	long lLineBytes=(8*m_size.cx+31)/32*4;
	
    //中间变量
 	BYTE bTemp;

	//复制原始图像
	LPBYTE lpNewDIB;
    HLOCAL hNew;
    hNew=LocalAlloc(LHND,lLineBytes*m_size.cy);
	if(hNew==NULL)
	{
		MessageBox(NULL,"分配内存失败!","flase",MB_OK);
	}
	lpNewDIB=(BYTE*)LocalLock(hNew);
	memcpy(lpNewDIB,lpBits,lLineBytes*m_size.cy);
  
	//模板数组
	unsigned char* bValue;
	bValue=(unsigned char*)malloc(100);

	int arr[5][5]={1,2,3,2,1,2,3,4,3,2,3,4,5,4,3,2,3,4,3,2,1,2,3,2,1};
  
	PSNR=0;
	FPSNR=0.0;
	//开始中值滤波
	//由于模板的原因,除去边缘几行
	for(j=2;j<m_size.cy-2;j++)
	{
		    //由于模板的原因,除去边缘几列
		    for(i=2;i<lLineBytes-2;i++)
			{
				int num=0;
			    //读取滤波器数组
			    for(y=0;y<5;y++)
				{
                    for(x=0;x<5;x++)
					{
						for(k=0;k<arr[y][x];k++)
						{
							bValue[y*5+x+num]=lpNewDIB[(j-1+y)*lLineBytes+x+i-1];
					        num++;
						}
					}
				}

 	            //对模板内的灰度值进行排序
                for(y=0;y<64;y++)
				{
 		            for(x=0;x<64-y;x++)
					{
 			            if(bValue[x]>bValue[x+1])
						{
 				           //互换
 				           bTemp=bValue[x];
 				           bValue[x]=bValue[x+1];
                           bValue[x+1]=bTemp;
						}
					}
				}
				lpBits[j*lLineBytes+i]=bValue[32];
			}
	}
/******************************用于计算峰值信噪比********************************/
	FPSNRTemp=0.0;
	for(j=0;j<m_size.cy;j++)
	{
		for(i=0;i<lLineBytes;i++)
		{
			FPSNRTemp+=pow((double)(lpBits[j*lLineBytes+i]-lpTempDIB[j*lLineBytes+i]),2)/(m_size.cy*lLineBytes);
		}
	}

	FPSNR=10*log10(255*255/FPSNRTemp);
	PSNR=1;
	Caption.Format("*****您所用的滤波方法为5x5加权中值滤波*****");
/********************************************************************************/	
/******************************************************************************/
	FNMSETemp1=0.0;
	FNMSETemp2=0.0;
	for(j=0;j<m_size.cy;j++)
	{
		for(i=0;i<lLineBytes;i++)
		{
			FNMSETemp1+=pow((lpBits[j*lLineBytes+i]-lpTempDIB[j*lLineBytes+i]),2);
			FNMSETemp2+=pow(lpTempDIB[j*lLineBytes+i],2);
		}
	}
	FNMSE=FNMSETemp1/FNMSETemp2;    	
	PSNR=1;
/******************************************************************************/
/*************************************************************/
	FSIF=0.0;
	FNMSETemp3=0;
	for(j=0;j<m_size.cy;j++)
	{
		for(i=0;i<lLineBytes;i++)
		{
			FNMSETemp3+=pow((double)(lpTempDIB[j*lLineBytes+i]-lpTemp1DIB[j*lLineBytes+i]),2);
		}
	}
	FSIF=-20*log10(FNMSETemp1/FNMSETemp3);
/*************************************************************/

	UpdateAllViews(NULL);
	SetModifiedFlag();
	LocalUnlock(lpNewDIB);
	LocalFree(lpNewDIB);
	free(bValue);
	
}
//11.加权中值滤波函数代码完毕

void CMyDoc::OnNeismooth() 
{
	// TODO: Add your command handler code here
	//该函数用于实现图像高斯噪声的邻域平滑

	//建立邻域平滑类的变量
	CNeiSmoothDlg lp;

	//初始化对话框的值
    lp.m_iLinyux=1;
	lp.m_iLinyuy=1;
	lp.m_iLinyuHigth=3;
	lp.m_iLinyuWidth=3;

	//复制图像
	LPBYTE lpNewDIB;
	HLOCAL hTemp;
	hTemp=LocalAlloc(LHND,m_size.cx*m_size.cy);
    lpNewDIB=(BYTE*)LocalLock(hTemp);
	memcpy(lpNewDIB,lpBits,m_size.cx*m_size.cy);

	long i,j,m,n;
	PSNR=0;
	FPSNR=0.0;
    //设置平均值
	float ave;
    //调用邻域平均对话框
	if(lp.DoModal()==IDOK)
    { 
		//取模板进行平均值的计算。
	    for(i=lp.m_iLinyuy;i<m_size.cy-(int)lp.m_iLinyuHigth+lp.m_iLinyuy-1;i++)
		{
		    for(j=lp.m_iLinyux;j<m_size.cx-(int)lp.m_iLinyuWidth+lp.m_iLinyux-1;j++)
			{   
		        ave=0.0;
		        for(n=0;n<lp.m_iLinyuHigth;n++)
				{
				    for(m=0;m<lp.m_iLinyuWidth;m++)
					{
				    	ave+=lpNewDIB[(i-lp.m_iLinyuy+n)*m_size.cx+m+j-lp.m_iLinyux];
					}
              
				}
		        lpBits[i*m_size.cx+j]=(int)(ave/(lp.m_iLinyuHigth*lp.m_iLinyuWidth)+0.5);
			}
		}
   }
/***********************用于计算峰值信噪比***************************/
	long lLineBytes=(8*m_size.cx+31)/32*4;
	FPSNRTemp=0.0;
	for(j=0;j<m_size.cy;j++)
	{
		for(i=0;i<lLineBytes;i++)
		{
			FPSNRTemp+=pow((double)(lpBits[j*lLineBytes+i]-lpTempDIB[j*lLineBytes+i]),2)/(m_size.cy*lLineBytes);
		}
	}

	FPSNR=10*log10(255*255/FPSNRTemp);
	PSNR=1;
	Caption.Format("*****您所用的滤波方法为%dx%d邻域平滑滤波*****",lp.m_iLinyuHigth,lp.m_iLinyuWidth);
/********************************************************************/
/******************************************************************************/
	FNMSETemp1=0.0;
	FNMSETemp2=0.0;
	for(j=0;j<m_size.cy;j++)
	{
		for(i=0;i<lLineBytes;i++)
		{
			FNMSETemp1+=pow((lpBits[j*lLineBytes+i]-lpTempDIB[j*lLineBytes+i]),2);
			FNMSETemp2+=pow(lpTempDIB[j*lLineBytes+i],2);
		}
	}
	FNMSE=FNMSETemp1/FNMSETemp2;    	
	PSNR=1;
/******************************************************************************/
/*************************************************************/
	FSIF=0.0;
	FNMSETemp3=0;
	for(j=0;j<m_size.cy;j++)
	{
		for(i=0;i<lLineBytes;i++)
		{
			FNMSETemp3+=pow((double)(lpTempDIB[j*lLineBytes+i]-lpTemp1DIB[j*lLineBytes+i]),2);
		}
	}
	FSIF=-20*log10(FNMSETemp1/FNMSETemp3);
/*************************************************************/

	UpdateAllViews(NULL);
    SetModifiedFlag();
	LocalUnlock(lpNewDIB);
	LocalFree(lpNewDIB);
}
//12.图像高斯噪声的邻域平滑函数代码完毕

void CMyDoc::OnAdaptiveSmoothFilter() 
{
	// TODO: Add your command handler code here
	//该函数用自适应平滑滤波的方法对图像进行平滑

    //定义中值滤波参数设置对话框
	CAdaptiveSmoothFilterDlg dlg;
    //循环变量
	LONG i,j,x,y;
    //图像每行的字节数
	long lLineBytes=(8*m_size.cx+31)/32*4;
	
    //中间变量
 	int bTemp1,bTemp2;

	//自定义阈值
	int iTemp_t1=65;
	int iTemp_b=200;
	int iTemp_t2;

	//定义模板的高度、宽度、中心元素X、Y坐标及干扰噪声方差
	int iTempH,iTempW,iTempMX,iTempMY;
	double fTempFC;

	PSNR=0;
	FPSNR=0.0;
	//复制原始图像
	LPBYTE lpNewDIB;
    HLOCAL hNew;
    hNew=LocalAlloc(LHND,lLineBytes*m_size.cy);
	if(hNew==NULL)
	{
		MessageBox(NULL,"分配内存失败!","flase",MB_OK);
	}
	lpNewDIB=(BYTE*)LocalLock(hNew);
	memcpy(lpNewDIB,lpBits,lLineBytes*m_size.cy);

    //初始化对话框
	dlg.m_iAdaSF_Hight=3;
	dlg.m_iAdaSF_Width=3;
	dlg.m_iAdaSF_X=1;
	dlg.m_iAdaSF_Y=1;
	dlg.m_fAdaSF_FC=(float)0.02;

	if(dlg.DoModal()==IDOK)
	{
        //接受用户设置
	    iTempH=dlg.m_iAdaSF_Hight;
	    iTempW=dlg.m_iAdaSF_Width;
	    iTempMX=dlg.m_iAdaSF_X;
	    iTempMY=dlg.m_iAdaSF_Y;
		fTempFC=dlg.m_fAdaSF_FC;

	    //开始自适应平滑滤波
		//由于模板的原因,除去边缘几行
	    for(j=iTempMY;j<m_size.cy-iTempH+iTempMY+1;j++)
		{
		    //由于模板的原因,除去边缘几列
		    for(i=iTempMX;i<lLineBytes-iTempW+iTempMX+1;i++)
			{
				bTemp1=0;
				bTemp2=0;
			    //读取滤波器数组
			    for(y=0;y<iTempH;y++)
				{
                    for(x=0;x<iTempW;x++)
					{ 
						//中心点及周围灰度的总值
						bTemp2+=(int)lpNewDIB[(j-iTempMY+y)*lLineBytes+x+i-iTempMX];	
					}
				}
				//除中心点外周围灰度的总值
				bTemp1=bTemp2-(int)lpNewDIB[j*lLineBytes+i];
				iTemp_t2=(int)(fTempFC*bTemp2/(iTempH*iTempW)+iTemp_b+0.5);

				if(abs((int)lpNewDIB[j*lLineBytes+i]-bTemp1/(iTempH*iTempW-1))>iTemp_t1)
				{
					//除去脉冲噪声
					lpBits[j*lLineBytes+i]=bTemp1/(iTempH*iTempW-1);
				}
				else if(abs((int)lpNewDIB[j*lLineBytes+i]-(int)lpNewDIB[(j-1)*lLineBytes+i-1])+abs((int)lpNewDIB[j*lLineBytes+i-1]-(int)lpNewDIB[(j-1)*lLineBytes+i])>iTemp_t2)
				{
                    //探测出图像边缘
					lpBits[j*lLineBytes+i]=lpNewDIB[j*lLineBytes+i];
				}
				else
				{
					//用整个区域的均值代替
					lpBits[j*lLineBytes+i]=bTemp2/(iTempH*iTempW);
				}               
			}
		}
	}

/**********************************用于计算峰值信噪比***************************/
	FPSNRTemp=0.0;
    for(j=0;j<m_size.cy;j++)
	{
		for(i=0;i<lLineBytes;i++)
		{
			FPSNRTemp+=pow((double)(lpBits[j*lLineBytes+i]-lpTempDIB[j*lLineBytes+i]),2)/(m_size.cy*lLineBytes);
		}
	}

	FPSNR=10*log10(255*255/FPSNRTemp);
	PSNR=1;
	Caption.Format("*****您所用的滤波方法为%dx%d,噪声误差为%2f的自适应平滑滤波*****",iTempH,iTempW,(float)fTempFC);
/******************************************************************************/
/******************************************************************************/
	FNMSETemp1=0.0;
	FNMSETemp2=0.0;
	for(j=0;j<m_size.cy;j++)
	{
		for(i=0;i<lLineBytes;i++)
		{
			FNMSETemp1+=pow((lpBits[j*lLineBytes+i]-lpTempDIB[j*lLineBytes+i]),2);
			FNMSETemp2+=pow(lpTempDIB[j*lLineBytes+i],2);
		}
	}
	FNMSE=FNMSETemp1/FNMSETemp2;    	
	PSNR=1;
/******************************************************************************/
/*************************************************************/
	FSIF=0.0;
	FNMSETemp3=0;
	for(j=0;j<m_size.cy;j++)
	{
		for(i=0;i<lLineBytes;i++)
		{
			FNMSETemp3+=pow((double)(lpTempDIB[j*lLineBytes+i]-lpTemp1DIB[j*lLineBytes+i]),2);
		}
	}
	FSIF=-20*log10(FNMSETemp1/FNMSETemp3);
/*************************************************************/
	UpdateAllViews(NULL);
	SetModifiedFlag();
	LocalUnlock(lpNewDIB);
	LocalFree(lpNewDIB);	
}
//13.用自适应平滑滤波的方法对图像进行平滑函数代码完毕

void CMyDoc::OnGradsharp() 
{
	// TODO: Add your command handler code here
	//该函数用于对图像进行梯度锐化

	CGradSharpDlg dlg;

	//循环变量
	int i,j;

	//中间变量
	BYTE bTemp;

	//阈值
	BYTE bThre;

	//复制原始图像
	long lLineBytes=(8*m_size.cx+31)/32*4;
	LPBYTE lpNewDIB;
    HLOCAL hNew;
    hNew=LocalAlloc(LHND,lLineBytes*m_size.cy);
	if(hNew==NULL)
	{
		MessageBox(NULL,"分配内存失败!","flase",MB_OK);
	}
	lpNewDIB=(BYTE*)LocalLock(hNew);
	memcpy(lpNewDIB,lpBits,lLineBytes*m_size.cy);

	//初始化变量值
	dlg.m_GradSharpT=10;

    if(dlg.DoModal()==IDOK)
	{
        //获取用户的设置
	    bThre=dlg.m_GradSharpT;

		for(i=0;i<m_size.cy;i++)
		{
			for(j=0;j<lLineBytes;j++)
			{
				bTemp=abs(lpNewDIB[(m_size.cy-1-i)*lLineBytes+j]-lpNewDIB[(m_size.cy-2-i)*lLineBytes+j])
					  +abs(lpNewDIB[(m_size.cy-1-i)*lLineBytes+j]-lpNewDIB[(m_size.cy-1-i)*lLineBytes+j+1]);

				//判断是否小于阈值
				if(bTemp<255)
				{
					//判断是否大于阈值,对于小于的情况,灰度值不变
					if(bTemp>=bThre)
					{
						//直接赋值为bTemp
						lpBits[(m_size.cy-1-i)*lLineBytes+j]=bTemp;
					}
				}
				else 
				{
					//直接赋值为255
					lpBits[(m_size.cy-1-i)*lLineBytes+j]=255;
				}
			}
		}
	}
    UpdateAllViews(NULL);
	SetModifiedFlag();
	LocalUnlock(lpNewDIB);
	LocalFree(lpNewDIB);
}
//14.对图像进行梯度锐化函数代码完毕

void CMyDoc::OnLplssharp() 
{

⌨️ 快捷键说明

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