📄 pinyulubodib.cpp
字号:
}
fourier(t,height,lLineBytes,-1);
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
t[(2*lLineBytes)*j+2*i+1]=sqrt(t[(2*lLineBytes)*j+2*i+1]*t[(2*lLineBytes)*j+2*i+1]+t[(2*lLineBytes)*j+2*i+2]*t[(2*lLineBytes)*j+2*i+2]);
if(max<t[(2*lLineBytes)*j+2*i+1])
max=t[(2*lLineBytes)*j+2*i+1];
}
}
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
p=p_data+lLineBytes*j+i;
*(p)=(BYTE)(t[(2*lLineBytes)*j+2*i+1]*255.0/max);
}
}
delete t;
delete H;
}
/*************************************************************************
* 函数:PerfectFilterL(int u,int v)
*参数:u、v分别是截止频率的x、y分量值,由用户给定
*功能:此函数用来实现图象的理想低通滤波
/*************************************************************************/
void PinYuLuBoDib::PerfectFilterL(int u,int v)
{
LPBYTE p_data, p;//指向原图象数据区指针
int width,height;//原图象的宽度和高度
int i,j;
double d0,max=0.0;//中间变量
double *t,*H;
if(this->byBitCount==8)//灰度图像
p_data=this->GetData();//指向原图象数据区
else//24位真彩色
p_data=this->GetData2();//指向原图象数据区
width=this->GetWidth();//得到图象宽度
height=this->GetHeight();//得到图象高度
long lLineBytes=WIDTHBYTES(width*8);//计算图象每行的字节数
t=new double [height*lLineBytes*2+1];//分配存储器空间
H=new double [height*lLineBytes*2+1];
d0=sqrt(u*u+v*v);//计算截止频率d0
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
p=p_data+lLineBytes*j+i;//指向第i行第j列象素
t[(2*lLineBytes)*j+2*i+1]=*(p);//给时域赋值
t[(2*lLineBytes)*j+2*i+2]=0.0;
if((sqrt(i*i+j*j))<=d0)
H[2*i+(2*lLineBytes)*j+1]=1.0;
else
H[2*i+(2*lLineBytes)*j+1]=0.0;
H[2*i+(2*lLineBytes)*j+2]=0.0;
}
}
fourier(t,height,lLineBytes,1);
for(j=1;j<height*lLineBytes*2;j+=2)
{
t[j]=t[j]*H[j]-t[j+1]*H[j+1];
t[j+1]=t[j]*H[j+1]+t[j+1]*H[j];
}
fourier(t,height,lLineBytes,-1);
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
t[(2*lLineBytes)*j+2*i+1]=sqrt(t[(2*lLineBytes)*j+2*i+1]*t[(2*lLineBytes)*j+2*i+1]+t[(2*lLineBytes)*j+2*i+2]*t[(2*lLineBytes)*j+2*i+2]);
if(max<t[(2*lLineBytes)*j+2*i+1])
max=t[(2*lLineBytes)*j+2*i+1];
}
}
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
p=p_data+lLineBytes*j+i;
*(p)=(BYTE)(t[(2*lLineBytes)*j+2*i+1]*255.0/max);
}
}
delete t;
delete H;
}
////////////////////////////////////////////////
//此函数用来实现图象的理想高通滤波
//参数u、v分别是截止频率的x、y分量值,由用户给定
////////////////////////////////////////////////
void PinYuLuBoDib::PerfectFilterH(int u,int v)
{
LPBYTE p_data, p;//指向原图象数据区指针
int width,height;//原图象的宽度和高度
int i,j;
double d0,max=0.0;//中间变量
double *t,*H;
if(this->byBitCount==8)//灰度图像
p_data=this->GetData();//指向原图象数据区
else//24位真彩色
p_data=this->GetData2();//指向原图象数据区
width=this->GetWidth();//得到图象宽度
height=this->GetHeight();//得到图象高度
long lLineBytes=WIDTHBYTES(width*8);//计算图象每行的字节数
t=new double [height*lLineBytes*2+1];//分配存储器空间
H=new double [height*lLineBytes*2+1];
d0=sqrt(u*u+v*v);//计算截止频率d0
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
p=p_data+lLineBytes*j+i;//指向第i行第j列象素
t[(2*lLineBytes)*j+2*i+1]=*(p);//给时域赋值
t[(2*lLineBytes)*j+2*i+2]=0.0;
if((sqrt(i*i+j*j))<=d0)
H[2*i+(2*lLineBytes)*j+1]=0.0;
else
H[2*i+(2*lLineBytes)*j+1]=1.0;
H[2*i+(2*lLineBytes)*j+2]=0.0;
}
}
fourier(t,height,lLineBytes,1);
for(j=1;j<height*lLineBytes*2;j+=2)
{
t[j]=t[j]*H[j]-t[j+1]*H[j+1];
t[j+1]=t[j]*H[j+1]+t[j+1]*H[j];
}
fourier(t,height,lLineBytes,-1);
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
t[(2*lLineBytes)*j+2*i+1]=sqrt(t[(2*lLineBytes)*j+2*i+1]*t[(2*lLineBytes)*j+2*i+1]+t[(2*lLineBytes)*j+2*i+2]*t[(2*lLineBytes)*j+2*i+2]);
if(max<t[(2*lLineBytes)*j+2*i+1])
max=t[(2*lLineBytes)*j+2*i+1];
}
}
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
p=p_data+lLineBytes*j+i;
*(p)=(BYTE)(t[(2*lLineBytes)*j+2*i+1]*255.0/max);
}
}
delete t;
delete H;
}
/*************************************************************************
* 函数:TLFilter(int u,int v,int u1,int v1)
*参数:u、v分别是截止频率的x、y分量值,由用户给定
*功能:此函数用来实现图象的梯形低通滤波
/*************************************************************************/
void PinYuLuBoDib::TLFilter(int u,int v,int u1,int v1)
{
LPBYTE p_data, p;//指向原图象数据区指针
int width,height;//原图象的宽度和高度
int i,j;
double max=0.0,d0,d,d1;//中间变量
double *t,*H;
if(this->byBitCount==8)//灰度图像
p_data=this->GetData();//指向原图象数据区
else//24位真彩色
p_data=this->GetData2();//指向原图象数据区
width=this->GetWidth();//得到图象宽度
height=this->GetHeight();//得到图象高度
long lLineBytes=WIDTHBYTES(width*8);//计算图象每行的字节数
t=new double [height*lLineBytes*2+1];//分配存储器空间
H=new double [height*lLineBytes*2+1];
d0=sqrt(u*u+v*v);//计算截止频率d0
d1=sqrt(u1*u1+v1*v1);
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
p=p_data+lLineBytes*j+i;//指向第i行第j列象素
t[(2*lLineBytes)*j+2*i+1]=*(p);//给时域赋值
t[(2*lLineBytes)*j+2*i+2]=0.0;
d=sqrt(i*i+j*j);
if(d<d0)
{
H[2*i+(2*lLineBytes)*j+1]=1;
H[2*i+(2*lLineBytes)*j+2]=0.0;
}
if(d>d1)
{
H[2*i+(2*lLineBytes)*j+1]=0.0;
H[2*i+(2*lLineBytes)*j+2]=0.0;
}
else
{
H[2*i+(2*lLineBytes)*j+1]=(d-d1)/(d0-d1);
H[2*i+(2*lLineBytes)*j+2]=0.0;
}
}
}
fourier(t,height,lLineBytes,1);
for(j=1;j<height*lLineBytes*2;j+=2)
{
t[j]=t[j]*H[j]-t[j+1]*H[j+1];
t[j+1]=t[j]*H[j+1]+t[j+1]*H[j];
}
fourier(t,height,lLineBytes,-1);
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
t[(2*lLineBytes)*j+2*i+1]=sqrt(t[(2*lLineBytes)*j+2*i+1]*t[(2*lLineBytes)*j+2*i+1]+t[(2*lLineBytes)*j+2*i+2]*t[(2*lLineBytes)*j+2*i+2]);
if(max<t[(2*lLineBytes)*j+2*i+1])
max=t[(2*lLineBytes)*j+2*i+1];
}
}
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
p=p_data+lLineBytes*j+i;
*(p)=(BYTE)(t[(2*lLineBytes)*j+2*i+1]*255.0/max);
}
}
delete t;
delete H;
}
////////////////////////////////////////////////
//此函数用来实现图象的梯形高通滤波
//参数u、v分别是截止频率的x、y分量值,由用户给定
////////////////////////////////////////////////
void PinYuLuBoDib::THFilter(int u,int v,int u1,int v1)
{
LPBYTE p_data, p;//指向原图象数据区指针
int width,height;//原图象的宽度和高度
int i,j;
double max=0.0,d0,d,d1;//中间变量
double *t,*H;
if(this->byBitCount==8)//灰度图像
p_data=this->GetData();//指向原图象数据区
else//24位真彩色
p_data=this->GetData2();//指向原图象数据区
width=this->GetWidth();//得到图象宽度
height=this->GetHeight();//得到图象高度
long lLineBytes=WIDTHBYTES(width*8);//计算图象每行的字节数
t=new double [height*lLineBytes*2+1];//分配存储器空间
H=new double [height*lLineBytes*2+1];
d0=sqrt(u*u+v*v);//计算截止频率d0
d1=sqrt(u1*u1+v1*v1);
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
p=p_data+lLineBytes*j+i;//指向第i行第j列象素
t[(2*lLineBytes)*j+2*i+1]=*(p);//给时域赋值
t[(2*lLineBytes)*j+2*i+2]=0.0;
d=sqrt(i*i+j*j);
if(d<d0)
{
H[2*i+(2*lLineBytes)*j+1]=0;
H[2*i+(2*lLineBytes)*j+2]=0.0;
}
if(d>d1)
{
H[2*i+(2*lLineBytes)*j+1]=1;
H[2*i+(2*lLineBytes)*j+2]=0.0;
}
else
{
H[2*i+(2*lLineBytes)*j+1]=(d-d0)/(d1-d0);
H[2*i+(2*lLineBytes)*j+2]=0.0;
}
}
}
fourier(t,height,lLineBytes,1);
for(j=1;j<height*lLineBytes*2;j+=2)
{
t[j]=t[j]*H[j]-t[j+1]*H[j+1];
t[j+1]=t[j]*H[j+1]+t[j+1]*H[j];
}
fourier(t,height,lLineBytes,-1);
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
t[(2*lLineBytes)*j+2*i+1]=sqrt(t[(2*lLineBytes)*j+2*i+1]*t[(2*lLineBytes)*j+2*i+1]+t[(2*lLineBytes)*j+2*i+2]*t[(2*lLineBytes)*j+2*i+2]);
if(max<t[(2*lLineBytes)*j+2*i+1])
max=t[(2*lLineBytes)*j+2*i+1];
}
}
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
p=p_data+lLineBytes*j+i;
*(p)=(BYTE)(t[(2*lLineBytes)*j+2*i+1]*255.0/max);
}
}
delete t;
delete H;
}
/*************************************************************************
* 函数:ZLFilter(int u,int v,int u1,int v1)
*参数:u、v分别是截止频率的x、y分量值,由用户给定
*功能:此函数用来实现图象的指数低通滤波
///////////////////////////////////////////////*/
void PinYuLuBoDib::ZLFilter(int u,int v,int n)
{
LPBYTE p_data, p;//指向原图象数据区指针
int width,height;//原图象的宽度和高度
int i,j;
double max=0.0,d0,d;//中间变量
double *t,*H;
if(this->byBitCount==8)//灰度图像
p_data=this->GetData();//指向原图象数据区
else//24位真彩色
p_data=this->GetData2();//指向原图象数据区
width=this->GetWidth();//得到图象宽度
height=this->GetHeight();//得到图象高度
long lLineBytes=WIDTHBYTES(width*8);//计算图象每行的字节数
t=new double [height*lLineBytes*2+1];//分配存储器空间
H=new double [height*lLineBytes*2+1];
d0=sqrt(u*u+v*v);//计算截止频率d0
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
p=p_data+lLineBytes*j+i;//指向第i行第j列象素
t[(2*lLineBytes)*j+2*i+1]=*(p);//给时域赋值
t[(2*lLineBytes)*j+2*i+2]=0.0;
d=sqrt(i*i+j*j);
H[2*i+(2*lLineBytes)*j+1]=exp(-pow((d/d0),n));
H[2*i+(2*lLineBytes)*j+2]=0.0;
}
}
fourier(t,height,lLineBytes,1);
for(j=1;j<height*lLineBytes*2;j+=2)
{
t[j]=t[j]*H[j]-t[j+1]*H[j+1];
t[j+1]=t[j]*H[j+1]+t[j+1]*H[j];
}
fourier(t,height,lLineBytes,-1);
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
t[(2*lLineBytes)*j+2*i+1]=sqrt(t[(2*lLineBytes)*j+2*i+1]*t[(2*lLineBytes)*j+2*i+1]+t[(2*lLineBytes)*j+2*i+2]*t[(2*lLineBytes)*j+2*i+2]);
if(max<t[(2*lLineBytes)*j+2*i+1])
max=t[(2*lLineBytes)*j+2*i+1];
}
}
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
p=p_data+lLineBytes*j+i;
*(p)=(BYTE)(t[(2*lLineBytes)*j+2*i+1]*255.0/max);
}
}
delete t;
delete H;
}
////////////////////////////////////////////////
//此函数用来实现图象的指数高通滤波
//参数u、v分别是截止频率的x、y分量值,由用户给定
////////////////////////////////////////////////
void PinYuLuBoDib::ZHFilter(int u,int v,int n)
{
LPBYTE p_data, p;//指向原图象数据区指针
int width,height;//原图象的宽度和高度
int i,j;
double max=0.0,d0,d;//中间变量
double *t,*H;
if(this->byBitCount==8)//灰度图像
p_data=this->GetData();//指向原图象数据区
else//24位真彩色
p_data=this->GetData2();//指向原图象数据区
width=this->GetWidth();//得到图象宽度
height=this->GetHeight();//得到图象高度
long lLineBytes=WIDTHBYTES(width*8);//计算图象每行的字节数
t=new double [height*lLineBytes*2+1];//分配存储器空间
H=new double [height*lLineBytes*2+1];
d0=sqrt(u*u+v*v);//计算截止频率d0
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
p=p_data+lLineBytes*j+i;//指向第i行第j列象素
t[(2*lLineBytes)*j+2*i+1]=*(p);//给时域赋值
t[(2*lLineBytes)*j+2*i+2]=0.0;
d=sqrt(i*i+j*j);
H[2*i+(2*lLineBytes)*j+1]=exp(-pow((d0/d),n));
H[2*i+(2*lLineBytes)*j+2]=0.0;
}
}
fourier(t,height,lLineBytes,1);
for(j=1;j<height*lLineBytes*2;j+=2)
{
t[j]=t[j]*H[j]-t[j+1]*H[j+1];
t[j+1]=t[j]*H[j+1]+t[j+1]*H[j];
}
fourier(t,height,lLineBytes,-1);
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
t[(2*lLineBytes)*j+2*i+1]=sqrt(t[(2*lLineBytes)*j+2*i+1]*t[(2*lLineBytes)*j+2*i+1]+t[(2*lLineBytes)*j+2*i+2]*t[(2*lLineBytes)*j+2*i+2]);
if(max<t[(2*lLineBytes)*j+2*i+1])
max=t[(2*lLineBytes)*j+2*i+1];
}
}
for(j=0;j<height;j++)
{
for(i=0;i<lLineBytes;i++)
{
p=p_data+lLineBytes*j+i;
*(p)=(BYTE)(t[(2*lLineBytes)*j+2*i+1]*255.0/max);
}
}
delete t;
delete H;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -