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