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

📄 tiduruihuadib.cpp

📁 本程序是完成人耳识别
💻 CPP
📖 第 1 页 / 共 3 页
字号:
void TiDuRuiHuaDib::Leijianzuida(int *tongji)
{
	int i,j;
	int height,wide;
	LPBYTE p_data;
	LPBYTE p_temp;
	height = this->GetHeight();
	wide = this->GetDibWidthBytes();
	p_data=this->GetData();  //获得图像数据
	p_temp = new BYTE[height*wide];
    memcpy(p_temp,p_data,height*wide);
	
	//域值
	int Th;  //使相对距离最大的域值
	int  Th0; //域值初始值;
	//两类的均值;
	int u1,u2;
	//相对距离
	int  s;
	int s0;   //初始域值所对应的相对距离
	//临时变量
	int Temp0, Temp1, Temp2, Temp3;
	Temp0 = Temp1 = Temp2 = Temp3 = 0;
	//初始化Th,Th0
	   Th=Th0=127;
	   //计算u1
	   for (i = 0; i < Th0 + 1; i++)
	   {
		   Temp0 += tongji[i] * i;
		   Temp1 += tongji[i];
	   }
       u1=Temp0/Temp1;
	   //计算u2
	   for (i = Th0 + 1; i < 256; i++)
	   {
		   Temp2 += tongji[i] * i;
		   Temp3 += tongji[i];
	   }
	   u2=Temp2/Temp3;
	   //计算相对距离
	   s0=(u2-Th0)*(Th0-u1)/((u2-u1)*(u2-u1));
	   for (Th0=1;Th0<255;Th0++)
	   {
		   //计算u1
		   Temp0 = Temp1 = Temp2 = Temp3 = 0;
		   for (i = 0; i < Th0 + 1; i++)
		   {
			   Temp0 += tongji[i] * i;
			   Temp1 += tongji[i];
		   }
		   if (Temp1==0)
		   {
			   Temp1=1;
		   }
		   u1=Temp0/Temp1;
		   //计算u2
		   for (i = Th0 + 1; i < 256; i++)
		   {
			   Temp2 += tongji[i] * i;
			   Temp3 += tongji[i];
		   }
		   if (Temp3==0)
		   {
			   Temp3=1;
		   }
		   u2=Temp2/Temp3;
		   //计算相对距离
		   s=(u2-Th0)*(Th0-u1)/((u2-u1)*(u2-u1));
		   //与s0比较大小
		   if (s>s0)
		   {
			   s0=s;
			   Th=Th0;
		   }
	   }
	   //根据域值Th对图像二值化
	   for (j=0;j<height;j++)
	   {
		   for (i=0;i<wide;i++)
		   {
			   if(*(p_temp+j*wide+i)<Th)
				   *(p_temp+j*wide+i)=0;
			   else
				   *(p_temp+j*wide+i)=255;
		   }
	   }
	   memcpy(p_data,p_temp,height*wide);
      delete p_temp;
}

void TiDuRuiHuaDib::Yuzhifenge(int Yuzhi)
{
	// 指向源图像的指针
	LPBYTE  p_data;
	LPBYTE	lpSrc;
	// 指向缓存图像的指针
	LPBYTE	lpDst;
	// 指向缓存DIB图像的指针
	LPBYTE	temp;
	//循环变量
	long i;
	long j;
	//图像的高和宽
	long wide;
	long height;
	p_data=GetData();
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像
		wide=GetWidth();
	else	//24位彩色
		wide=GetDibWidthBytes();
	height=GetHeight();
	temp=new BYTE[wide*height];
	memset(temp,255,wide*height);
	for (j=0;j<height;j++)
	{
		for(i=0;i<wide;i++)
		{
			lpSrc=p_data+wide*j+i;
			lpDst=temp+wide*j+i;
			if(abs(*lpSrc-Yuzhi)<30)
				//*lpDst=Yuzhi;	
				*lpDst=0;
		}
	}
    memcpy(p_data,temp,wide*height);
	delete temp;	
}

void TiDuRuiHuaDib::nnzhong(int n)
{
	DWORD size;
	size=GetSize();  //获得图像打小
	BYTE* p_temp=new BYTE [size];  //开辟内存
	memset(p_temp,255,size);
	int yy,xx,n2,nn,chuo,chg,m,medi,madom,mado[1000];
	BYTE *p_data;     //原图数据区指针
	int wide,height;    //原图长、宽
	if(n<3||n%2!=1)//检查取值是否为3.5.7等的奇数
		AfxMessageBox("请输入一个大于等于3的奇数");
	if(n>=3&&n%2==1)
		n2=(n-1)/2;
    nn=n*n;
	chuo=(nn-1)/2;
	p_data=this->GetData();//取得原图的数据区指针
	wide=this->GetWidth(); //取得原图的数据区宽
    height=this->GetHeight();  //取得原图的数据区高
	
	//n*n中值滤波
	for(int j=n2;j<height-n2;j++)
		for(int i=n2;i<wide-n2;i++)
		{
			//把n*n屏蔽窗口部分的所有像素值放入mado[m]
			m=0;
			for(yy=j-n2;yy<=j+n2;yy++)
				for(xx=i-n2;xx<=i+n2;xx++)
				{
					mado[m]=p_data[yy*wide+xx];
					m++;
				}
				//把mado[m]中的值按下降顺序用冒泡法排序
				do{
					chg=0;
					for(m=0;m<nn-1;m++)
					{
						if(mado[m]<mado[m+1])
						{
							madom=mado[m];
							mado[m]=mado[m+1];
							mado[m+1]=madom;
							chg=1;
						}
					}
				}while(chg==1);	
				//求中值medi
				medi=mado[chuo];
				//把中值代入显示图像中
				p_temp[j*wide+i]=medi;
		}
		memcpy(p_data,p_temp,size);
		delete p_temp;
}

void TiDuRuiHuaDib::nnjunzhi(int n)
{
	DWORD size;
	size=GetSize();
	BYTE *p_data;
	int xx,yy,n2,sum;
	int wide,height;    //原图长、宽
	
	BYTE* p_temp=new BYTE [size];
	memset(p_temp,255,size);
	if(n<3||n%2!=1)//确认n为奇数
		AfxMessageBox("请输入一个大于等于3的奇数");
	if(n>=3&&n%2==1)   //如果n是大于等于3的奇数 
		n2=(n-1)/2;
	p_data=this->GetData();//取得原图的数据区指针
	wide=this->GetWidth(); //取得原图的数据区宽
	height=this->GetHeight();  //取得原图的数据区高
	//用N*N屏蔽窗口平均化
	for(int j=n2;j<height-n2;j++)
	{
		for(int i=n2;i<wide-n2;i++)
		{	//求N*N屏蔽窗口内的总和sum
			sum=0;
			for(yy=j-n2;yy<=j+n2;yy++)
				for(xx=i-n2;xx<=i+n2;xx++)
					sum+=p_data[yy*wide+xx];
				//把n*n屏蔽窗口内的平均值四舍五入后作为显示图像像素值
				p_temp[j*wide+i]=(int)((float)sum/(n*n)+0.5);
				
		}
	}
	memcpy(p_data,p_temp,size);
	delete p_temp;
}

void TiDuRuiHuaDib::Jubupingjun()
{
	DWORD size;
	size=GetSize();
	BYTE *p_data;//原图数据区指针
	BYTE* p_temp=new BYTE[size];  //缓存图像指针
	int wide,height;
    int n,ji[9],nmin;
	float mean[9],bunsan[9],bmin;
	p_data=this->GetData();//取得原图的数据区指针
	wide=this->GetWidth(); //取得原图的数据区宽
    height=this->GetHeight();  //取得原图的数据区高
	
	memset(p_temp,255,size);  //初始化缓存区域
	for(int j=2;j<=height-3;j++)
		for(int i=2;i<=wide-3;i++)
		{
			//求9种近邻区域的均值及其方差
			//第1近邻区域
			ji[0]=p_data[(j-1)*wide+(i-1)];
			ji[1]=p_data[(j-1)*wide+i];
			ji[2]=p_data[(j-1)*wide+(i+1)];
			ji[3]=p_data[j*wide+(i-1)];
			ji[4]=p_data[j*wide+i];
			ji[5]=p_data[j*wide+(i+1)];
			ji[6]=p_data[(j+1)*wide+(i-1)];
			ji[7]=p_data[(j+1)*wide+i];
			ji[8]=p_data[(j+1)*wide+(i+1)];
			mean[0]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6]+ji[7]+ji[8])/9;
			bunsan[0]=0;
			for(n=0;n<=8;n++)
				bunsan[0]+=ji[n]*ji[n]-mean[0]*mean[0];
			//第2近邻区域
			ji[0]=p_data[(j-2)*wide+(i-1)];
			ji[1]=p_data[(j-2)*wide+i];
			ji[2]=p_data[(j-2)*wide+(i+1)];
			ji[3]=p_data[(j-1)*wide+(i-1)];
			ji[4]=p_data[(j-1)*wide+i];
			ji[5]=p_data[(j-1)*wide+(i+1)];
			ji[6]=p_data[j*wide+i];
			mean[1]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
			bunsan[1]=0;
			for(n=0;n<=6;n++)
				bunsan[1]+=ji[n]*ji[n]-mean[1]*mean[1];
			//第3近邻区域
			ji[0]=p_data[(j-1)*wide+(i-2)];
			ji[1]=p_data[(j-1)*wide+(i-1)];
			ji[2]=p_data[j*wide+(i-2)];
			ji[3]=p_data[j*wide+(i-1)];
			ji[4]=p_data[j*wide+i];
			ji[5]=p_data[(j+1)*wide+(i-2)];
			ji[6]=p_data[(j+1)*wide+(i-1)];
			mean[2]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
			bunsan[2]=0;
			for(n=0;n<=6;n++)
				bunsan[2]+=ji[n]*ji[n]-mean[2]*mean[2];
			//第4近邻区域
			ji[0]=p_data[j*wide+i];
			ji[1]=p_data[(j+1)*wide+(i-1)];
			ji[2]=p_data[(j+1)*wide+i];
			ji[3]=p_data[(j+1)*wide+(i+1)];
			ji[4]=p_data[(j+2)*wide+(i-1)];
			ji[5]=p_data[(j+2)*wide+i];
			ji[6]=p_data[(j+2)*wide+(i+1)];
			mean[3]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
			bunsan[3]=0;
			for(n=0;n<=6;n++)
				bunsan[3]+=ji[n]*ji[n]-mean[3]*mean[3];
			//第5近邻区域
			ji[0]=p_data[(j-1)*wide+(i+1)];
			ji[1]=p_data[(j-1)*wide+(i+2)];
			ji[2]=p_data[j*wide+i];
			ji[3]=p_data[j*wide+(i+1)];
			ji[4]=p_data[j*wide+(i+2)];
			ji[5]=p_data[(j+1)*wide+(i+1)];
			ji[6]=p_data[(j+1)*wide+(i+2)]; 
			mean[4]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
			bunsan[4]=0;
			for(n=0;n<=6;n++)
				bunsan[4]+=ji[n]*ji[n]-mean[4]*mean[4];	
			//第6近邻区域
			ji[0]=p_data[(j-2)*wide+(i+1)];
			ji[1]=p_data[(j-2)*wide+(i+2)];
			ji[2]=p_data[(j-1)*wide+i];
			ji[3]=p_data[(j-1)*wide+(i+1)];
			ji[4]=p_data[(j-1)*wide+(i+2)];
			ji[5]=p_data[j*wide+i];
			ji[6]=p_data[j*wide+(i+1)]; 
			mean[5]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
			bunsan[5]=0;
			for(n=0;n<=6;n++)
				bunsan[5]+=ji[n]*ji[n]-mean[5]*mean[5];
			//第7近邻区域
			ji[0]=m_pData[(j-2)*wide+(i-2)];
			ji[1]=p_data[(j-2)*wide+(i-1)];
			ji[2]=p_data[(j-1)*wide+(i-2)];
			ji[3]=p_data[(j-1)*wide+(i-1)];
			ji[4]=p_data[(j-1)*wide+i];
			ji[5]=p_data[j*wide+(i-1)];
			ji[6]=p_data[j*wide+i];
			mean[6]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
			bunsan[6]=0;
			for(n=0;n<=6;n++)
				bunsan[6]+=ji[n]*ji[n]-mean[6]*mean[6];
			//第8近邻区域
			ji[0]=m_pData[j*wide+(i-1)];
			ji[1]=p_data[j*wide+i];
			ji[2]=p_data[(j+1)*wide+(i-2)];
			ji[3]=p_data[(j+1)*wide+(i-1)];
			ji[4]=p_data[(j+1)*wide+i];
			ji[5]=p_data[(j+2)*wide+(i-2)];
			ji[6]=p_data[(j+2)*wide+(i-1)];
			mean[7]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
			bunsan[7]=0;
			for(n=0;n<=6;n++)
				bunsan[7]+=ji[n]*ji[n]-mean[7]*mean[7];
			//第9近邻区域
			ji[0]=p_data[j*wide+i];
			ji[1]=p_data[j*wide+(i+1)];
			ji[2]=p_data[(j+1)*wide+i];
			ji[3]=p_data[(j+1)*wide+(i+1)];
			ji[4]=p_data[(j+1)*wide+(i+2)];
			ji[5]=p_data[(j+2)*wide+(i+1)];
			ji[6]=p_data[(j+2)*wide+(i+2)];
			mean[8]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
			bunsan[8]=0;
			for(n=0;n<=6;n++)
				bunsan[8]+=ji[n]*ji[n]-mean[8]*mean[8];
			//求方差最小的近邻区域nmin
			bmin=bunsan[0];
			nmin=0;
			for(n=0;n<=8;n++)
			{
				if(bmin>bunsan[n])
				{
					bmin=bunsan[n];
					nmin=n;
				}
				//把nmin的值四舍五入后作为显示图像的值
				p_temp[j*wide+i]=(int)(mean[nmin]+0.5);
			}				 
		}
		memcpy(p_data,p_temp,size);
		delete p_temp;	
		
}


void TiDuRuiHuaDib::Templat(BYTE *m_pdata, int wide, int height, int tempH, int tempW, int tempMX, int tempMY, float *fpArray, float fCoef)
{
	int i,j,k,l;  //循环变量
    BYTE*  temp=new BYTE[wide*height];    //新图像缓冲区
	//初始化新图像为原始图像
    memcpy( temp,m_pdata,wide*height);
    float fResult;    //像素值计算结果
	for(j=tempMY;j<height-tempH+tempMY+1;j++)
		for(i=tempMX;i<wide-tempW+tempMX+1;i++)
		{
			//计算像素值
			fResult=0;
			for(k=0;k<tempH;k++)
				for(l=0;l<tempW;l++)
					fResult=fResult+m_pdata[(j-tempMY+k)*wide+(i-tempMX+l)]*fpArray[k*tempW+l];
				//乘上系数
				fResult*=fCoef;
				//取绝对值
				fResult=(float)fabs(fResult);
				//判断是否超过255
				if(fResult>255)
					//若超过255,直接赋值为255
					temp[j*wide+i]=255;
				else
					//未超过255,赋值为计算结果
					temp[j*wide+i]=(int)(fResult+0.5);
		}
		memcpy(m_pdata, temp,wide*height);   //复制处理后的图像
		delete  temp;
		
}

void TiDuRuiHuaDib::Laplacian()
{
	int tempH;  //模板高度
	int tempW;  //模板宽度
	float tempC;  //模板系数
	int tempMY;   //模板中心元素Y坐标
	int tempMX;   //模板中心元素X坐标
	float Template[9];   //模板数组
	LPBYTE p_data;     //原图数据区指针
	int wide,height;    //原图长、宽
	p_data=this->GetData ();
    wide=this->GetWidth ();
    height=this->GetHeight ();
	   
	LPBYTE   temp1=new BYTE[wide*height];    //新图像缓冲区
	//拷贝原图像到缓存图像
	memcpy( temp1,p_data,wide*height);
	//设置Laplacian模板 参数
	tempW=3;
	tempH=3;
	tempC=1.0;
	tempMY=1;
	tempMX=1;
	Template[0]=-1.0;
	Template[1]=-1.0;
	Template[2]=-1.0;
	Template[3]=-1.0;

⌨️ 快捷键说明

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