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

📄 图像增强技术doc.cpp

📁 哥们图像增强技术的毕业设计
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	FPSNR=10*log10(255*255/FPSNRTemp);    	
	PSNR=1;
/******************************************************************************/
/******************************************************************************/
	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;
	Caption.Format("*****您所用的滤波方法为3x3模糊加权中值滤波*****");
/******************************************************************************/
/*************************************************************/
	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);
/*************************************************************/

	delete fTemp;
	UpdateAllViews(NULL);
	SetModifiedFlag();
	LocalUnlock(lpNewDIB);
	LocalFree(lpNewDIB);	
}
//35.用模糊加权均值滤波的方法对图像进行平滑滤波函数代码完毕

void CMyDoc::OnMixedmidfilter() 
{
	// TODO: Add your command handler code here
	//该函数用非递归混合中值滤波的方法对图像进行平滑滤波
	
	
	//定义非递归混合中值滤波参数设置对话框
	CMixedMidFilterDlg dlg;
    //循环变量
	LONG i,j,x,y;
    //模板的高度,宽度,系数及中心元素的X坐标,Y坐标
	int iTempH,iTempW,iTempMX,iTempMY;
    //图像每行的字节数
	long lLineBytes=(8*m_size.cx+31)/32*4;
	
    //中间变量
 	BYTE bTemp1,bTemp2,bTemp3,bTemp4;
	BYTE bTempV1,bTempV2,bTempV3,bTempV4;
	BYTE bTempV11,bTempV31;
	BYTE bTempV;
	BYTE bTemp;
	int num1,num2,num3,num4;

	//复制原始图像
	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);
  
	//模板数组,存放四个方向的灰度值
	//bValue1、bValue2、bValue3、bValue4分别存放模板
	//宽度灰度值、高度灰度值、两个对角线的灰度值
	unsigned char* bValue1;
	unsigned char*bValue2,*bValue3,*bValue4;
	unsigned char *bTempA1,*bTempA2,*bTempA3,*bTempA4;
	
    //初始化对话框
	dlg.m_MidFH=3;
	dlg.m_MidFW=3;
	dlg.m_MidFMX=1;
	dlg.m_MidFMY=1;

	if(dlg.DoModal()==IDOK)
	{
        //接受用户设置
	    iTempH=dlg.m_MidFH;
	    iTempW=dlg.m_MidFW;
	    iTempMX=dlg.m_MidFMX;
	    iTempMY=dlg.m_MidFMY;

	    //非递归混合中值滤波模板长度
 	    int iFilterLen=iTempH*iTempW;
		bValue1=(unsigned char*)malloc(iTempW);
        bValue2=(unsigned char*)malloc(iTempH);
		bValue3=(unsigned char*)malloc(iTempW);
		bValue4=(unsigned char*)malloc(iTempW);
		bTempA1=(unsigned char*)malloc(iTempW);
		bTempA2=(unsigned char*)malloc(iTempW);
		bTempA3=(unsigned char*)malloc(iTempW);
		bTempA4=(unsigned char*)malloc(iTempW);

	    //开始非递归混合中值滤波
		//由于模板的原因,除去边缘几行
	    for(j=iTempMY;j<m_size.cy-iTempH+iTempMY+1;j++)
		{
		    //由于模板的原因,除去边缘几列
		    for(i=iTempMX;i<lLineBytes-iTempW+iTempMX+1;i++)
			{
				num1=0;
				num2=0;
				num3=0;
				num4=0;
			    //读取滤波器数组
			    for(y=0;y<iTempH;y++)
				{
                    for(x=0;x<iTempW;x++)
					{
						//单向
						if(y==iTempMY)
						{
							bValue1[num1++]=lpNewDIB[(j-iTempMY+y)*lLineBytes+x+i-iTempMX];
						}
						if(x==iTempMX)
						{
							bValue2[num2++]=lpNewDIB[(j-iTempMY+y)*lLineBytes+x+i-iTempMX];
						}
						if(x==y)
						{
							bValue3[num3++]=lpNewDIB[(j-iTempMY+y)*lLineBytes+x+i-iTempMX];
						}
						if(iTempW-x-1==y)
						{
							bValue4[num4++]=lpNewDIB[(j-iTempMY+y)*lLineBytes+x+i-iTempMX];
						}
					}
				}
				bTemp=bValue1[(iTempW-1)/2];
 	            //对模板内的灰度值进行排序
                for(y=0;y<(iTempW-1)/2-1;y++)
				{
 		            for(x=0;x<(iTempW-1)/2-y-1;x++)
					{
 			            if(bValue1[x]>bValue1[x+1])
						{
 				           //互换
 				           bTemp1=bValue1[x];
 				           bValue1[x]=bValue1[x+1];
                           bValue1[x+1]=bTemp1;
						}
						if(bValue1[x+(iTempW-1)/2+1]>bValue1[x+(iTempW-1)/2+2])
						{
 				           //互换
 				           bTemp1=bValue1[x+(iTempW-1)/2+1];
 				           bValue1[x+(iTempW-1)/2+1]=bValue1[x+(iTempW-1)/2+2];
                           bValue1[x+(iTempW-1)/2+2]=bTemp1;
						}
						if(bValue2[x]>bValue2[x+1])
						{
 				           //互换
 				           bTemp2=bValue2[x];
 				           bValue2[x]=bValue2[x+1];
                           bValue2[x+1]=bTemp2;
						}
						if(bValue2[x+(iTempW-1)/2+1]>bValue2[x+(iTempW-1)/2+2])
						{
 				           //互换
 				           bTemp2=bValue2[x+(iTempW-1)/2+1];
 				           bValue2[x+(iTempW-1)/2+1]=bValue2[x+(iTempW-1)/2+2];
                           bValue2[x+(iTempW-1)/2+2]=bTemp2;
						}
						if(bValue3[x]>bValue3[x+1])
						{
 				           //互换
 				           bTemp3=bValue3[x];
 				           bValue3[x]=bValue3[x+1];
                           bValue3[x+1]=bTemp3;
						}
						if(bValue3[x+(iTempW-1)/2+1]>bValue3[x+(iTempW-1)/2+2])
						{
 				           //互换
 				           bTemp3=bValue3[x+(iTempW-1)/2+1];
 				           bValue3[x+(iTempW-1)/2+1]=bValue3[x+(iTempW-1)/2+2];
                           bValue3[x+(iTempW-1)/2+2]=bTemp3;
						}
						if(bValue4[x]>bValue4[x+1])
						{
 				           //互换
 				           bTemp4=bValue4[x];
 				           bValue4[x]=bValue4[x+1];
                           bValue4[x+1]=bTemp4;
						}
						if(bValue4[x+(iTempW-1)/2+1]>bValue4[x+(iTempW-1)/2+2])
						{
 				           //互换
 				           bTemp4=bValue4[x+(iTempW-1)/2+1];
 				           bValue4[x+(iTempW-1)/2+1]=bValue4[x+(iTempW-1)/2+2];
                           bValue4[x+(iTempW-1)/2+2]=bTemp4;
						}
					}
				}
				if(((iTempW-1)/2)%2==0)
				{
					int ii=(iTempW-5)/4;
					bTempA1[0]=(bValue1[(iTempW-1)/2-2-ii]+bValue1[(iTempW-1)/2-1-ii])/2;
					bTempA1[1]=bTemp;
					bTempA1[2]=(bValue1[(iTempW-1)/2+1+ii]+bValue1[(iTempW-1)/2+2+ii])/2;
					bTempA2[0]=(bValue2[(iTempW-1)/2-2-ii]+bValue2[(iTempW-1)/2-1-ii])/2;
					bTempA2[1]=bTemp;
					bTempA2[2]=(bValue2[(iTempW-1)/2+1+ii]+bValue2[(iTempW-1)/2+2+ii])/2;
					bTempA3[0]=(bValue3[(iTempW-1)/2-2-ii]+bValue3[(iTempW-1)/2-1-ii])/2;
					bTempA3[1]=bTemp;
					bTempA3[2]=(bValue3[(iTempW-1)/2+1+ii]+bValue3[(iTempW-1)/2+2+ii])/2;
					bTempA4[0]=(bValue4[(iTempW-1)/2-2-ii]+bValue4[(iTempW-1)/2-1-ii])/2;
					bTempA4[1]=bTemp;
					bTempA4[2]=(bValue4[(iTempW-1)/2+1+ii]+bValue4[(iTempW-1)/2+2+ii])/2;
				}				
				else
				{
					int iii=(iTempW-3)/4;
					bTempA1[0]=bValue1[(iTempW-1)/2-1-iii];
					bTempA1[1]=bTemp;
					bTempA1[2]=bValue1[(iTempW-1)/2+1+iii];
					bTempA2[0]=bValue2[(iTempW-1)/2-1-iii];
					bTempA2[1]=bTemp;
					bTempA2[2]=bValue2[(iTempW-1)/2+1+iii];
					bTempA3[0]=bValue3[(iTempW-1)/2-1-iii];
					bTempA3[1]=bTemp;
					bTempA3[2]=bValue3[(iTempW-1)/2+1+iii];
					bTempA4[0]=bValue4[(iTempW-1)/2-1-iii];
					bTempA4[1]=bTemp;
					bTempA4[2]=bValue4[(iTempW-1)/2+1+iii];
				}

				//第二次排序	
				bTempV1=MidValue(bTempA1,3);
				bTempV2=MidValue(bTempA2,3);
				bTempV3=MidValue(bTempA3,3);
				bTempV4=MidValue(bTempA4,3);
				bTempA1[0]=bTempV1;
				bTempA1[1]=bTemp;
				bTempA1[2]=bTempV2;
				bTempA3[0]=bTempV3;
				bTempA3[1]=bTemp;
				bTempA3[2]=bTempV4;
				//第三次排序
				bTempV11=MidValue(bTempA1,3);
				bTempV31=MidValue(bTempA3,3);
				bTempA1[0]=bTempV11;
				bTempA1[1]=bTemp;
				bTempA1[2]=bTempV31;
				//第四次排序
				bTempV=MidValue(bTempA1,3);
				lpBits[j*lLineBytes+i]=bTempV;
			}
		}
	}
/****************************用于计算峰值信噪比*********************************/
    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;
/******************************************************************************/
/******************************************************************************/
	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;
	Caption.Format("*****您所用的滤波方法为%dx%d非递归混合中值滤波*****",iTempH,iTempW);
/******************************************************************************/
/*************************************************************/
	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(bValue1);
	free(bValue2);
	free(bValue3);
	free(bValue4);
	free(bTempA1);
	free(bTempA2);
	free(bTempA3);
	free(bTempA4);
}
//36.用非递归混合中值滤波的方法对图像进行平滑滤波函数代码完毕

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

    //定义递归极大/中值滤波参数设置对话框
	CRecursiveTremendousMidFilterDlg dlg;
    //循环变量
	LONG i,j,x,y;
    //模板的高度,宽度,系数及中心元素的X坐标,Y坐标
	int iTempH,iTempW,iTempMX,iTempMY;
    //图像每行的字节数
	long lLineBytes=(8*m_size.cx+31)/32*4;
	
    //中间变量
 	BYTE bTemp1,bTemp2,bTemp3,bTemp4;
	int num1,num2,num3,num4;

	//复制原始图像
	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);
  
	//模板数组,存放四个方向的灰度值
	//bValue1、bValue2、bValue3、bValue4分别存放模板
	//宽度灰度值、高度灰度值、两个对角线的灰度值
	unsigned char* bValue1;
	unsigned char*bValue2,*bValue3,*bValue4;
	
    //初始化对话框
	dlg.m_MidFH=3;
	dlg.m_MidFW=3;
	dlg.m_MidFMX=1;
	dlg.m_MidFMY=1;

	if(dlg.DoModal()==IDOK)
	{
        //接受用户设置
	    iTempH=dlg.m_MidFH;
	    iTempW=dlg.m_MidFW;
	    iTempMX=dlg.m_MidFMX;
	    iTempMY=dlg.m_MidFMY;

	    //递归极大/中值滤波模板长度
 	    int iFilterLen=iTempH*iTempW;
		bValue1=(unsigned char*)malloc(iTempW);
        bValue2=(unsigned char*)malloc(iTempH);
		bValue3=(unsigned char*)malloc(iTempW);
		bValue4=(unsigned char*)malloc(iTempW);

	    //开始递归极大/中值滤波
		//由于模板的原因,除去边缘几行
	    for(j=iTempMY;j<m_size.cy-iTempH+iTempMY+1;j++)
		{
		    //由于模板的原因,除去边缘几列
		    for(i=iTempMX;i<lLineBytes-iTempW+iTempMX+1;i++)
			{
				num1=0;
				num2=0;
				num3=0;
				num4=0;
			    //读取滤波器数组
			    for(y=0;y<iTempH;y++)
				{
                    for(x=0;x<iTempW;x++)
					{
						if(y==iTempMY)
						{
							if(x<iTempMX)
							{
								bValue1[num1++]=lpBits[(j-iTempMY+y)*lLineBytes+x+i-iTempMX];
							}
							else
							{
								bValue1[num1++]=lpNewDIB[(j-iTempMY+y)*lLineBytes+x+i-iTempMX];
							}
						}
						if(x==iTempMX)
						{
							if(y<iTempMY)
							{
								bValue2[num2++]=lpBits[(j-iTempMY+y)*lLineBytes+x+i-iTempMX];
							}
							else
							{
								bValue2[num2++]=lpNewDIB[(j-iTempMY+y)*lLineBytes+x+i-iTempMX];
							}
						}
						if(x==y)
						{
							if(x<iTempMX)
							{
								bValue3[num3++]=lpBits[(j-iTempMY+y)*lLineBytes+x+i-iTempMX];
							}
							else
							{
								bValue3[num3++]=lpNewDIB[(j-iTempMY+y)*lLineBytes+x+i-iTempMX];
							}
						}
						if(iTempW-x-1==y)
						{
							if(y<iTempMY)
							{
								bValue4[num4++]=lpBits[(j-iTempMY+y)*lLineBytes+x+i-iTempMX];
							}
							else
							{
								bValue4[num4++]=lpNewDIB[(j-iTempMY+y)*lLineBytes+x+i-iTempMX];
							}
						}
					}
				}

 	            //对模板内的灰度值进行排序
                for(y=0;y<iTempW-1;y++)
				{
 		            for(x=0;x<iTempW-y-1;x++)
					{
 			            if(bValue1[x]>bValue1[x+1])
						{
 				           //互换
 				           bTemp1=bValue1[x];
 				           bValue1[x]=bValue1[x+1];
                           bValue1[x+1]=bTemp1;
						}
						if(bValue2[x]>bValue2[x+1])
						{
 				           //互换
 				           bTemp2=bValue2[x];
 				           bValue2[x]=bValue2[x+1];
                           bValue2[x+1]=bTemp2;
						}
						if(bValue3[x]>bValue3[x+1])
						{
 				           //互换
 				           bTemp3=bValue3[x];
 				           bValue3[x]=bValue3[x+1];
                           bValue3[x+1]=bTemp3;
						}
						if(bValue4[x]>bValue4[x+1])
						{
 				           //互换
 				           bTemp4=bValue4[x];
 				           bValue4[x]=bValue4[x+1];
                           bValue4[x+1]=bTemp4;
						}
					}
				}
 
 	            //找出该模板内灰度的中间值
				bTemp1=bValue1[(iTempW-1)/2];
				bTemp2=bValue2[(iTempH-1)/2];
				bTemp3=bValue3[(iTempW-1)/2];
				bTemp4=bValue4[(iTempW-1)/2];
				unsigned char bTempV[4]={bTemp1,bTemp2,bTemp3,bTemp4};
				lpBits[j*lLineBytes+i]=MaxValue(bTempV,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]-lpTemp1DIB[j*lLineBytes+i]),2)/(m_size.cy*lLineBytes);
		}
	}

	FPSNR=10*log10(255*255/FPSNRTemp);    	
	PSNR=1;
/******************************************************************************/
/******************************************************************************/
	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;
	Caption.Format("*****您所用的滤波方法为%dx%d递归极大/中值滤波*****",iTempH,iTempW);
/******************************************************************************/
/*******************************

⌨️ 快捷键说明

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