📄 图像增强技术doc.cpp
字号:
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 + -