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

📄 pinyulubodib.cpp

📁 学习数字图像处理
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}
	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 + -