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

📄 zaoshengxiaochudib.cpp

📁 VC++图像处理程序设计配套光盘的设计源码 VC++ImageProcessingProgrammeDesign
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				mado2[m]=p_data[yy*wide*3+xx*3+1];
				mado3[m]=p_data[yy*wide*3+xx*3+2];
				m++;
			}
			//找出mado[m]中的最大值madomax,用作最大频率值
			madomax=mado[0];
			madomax2=mado2[0];
			madomax3=mado3[0];
			for(m=1;m<nn;m++)
			{
				if(madomax<mado[m])
					madomax=mado[m];
				if(madomax2<mado2[m])
					madomax2=mado2[m];
				if(madomax3<mado3[m])
					madomax3=mado3[m];
			}
			p_temp[j*wide*3+i*3]=madomax;
			p_temp[j*wide*3+i*3+1]=madomax2;
			p_temp[j*wide*3+i*3+2]=madomax3;
		}                 
		memcpy(m_pData,p_temp,wide*height*3);
		delete p_temp;
	}
}

/***************************************************************/  
/*函数名称:suijizaosheng()                                    */
/*函数类型:void                                               */
/*功能:对图像进行随机噪声处理。                               */
/***************************************************************/
void ZaoShengXiaoChuDib::suijizaosheng()
{
	int noisepoint;
    DWORD size;
	size=GetSize();
	BYTE *p_data;     //原图数据区指针
	int wide,height;
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像
	{
		BYTE* p_temp=new BYTE [size];
		memset(p_temp,255,size);
		p_data=this->GetData();//取得原图的数据区指针
		memcpy(p_temp,p_data,size);
		wide=this->GetWidth(); //取得原图的数据区宽
		height=this->GetHeight();  //取得原图的数据区高
		//产生随机噪声
		for(int j=0;j<height;j++)
		for(int i=0;i<wide;i++)
		{
			noisepoint=rand()/1024;
			p_temp[j*wide+i]=(p_temp[j*wide+i]*224/256+(int)noisepoint);
		}
		memcpy(m_pData,p_temp,size);
		delete p_temp;
	}
	else	//24位彩色
	{
		size=GetSize();
		BYTE* p_temp=new BYTE [size];
		memset(p_temp,255,size);
		p_data=this->GetData();//取得原图的数据区指针
		memcpy(p_temp,p_data,size);
		wide=this->GetWidth()*3; //取得原图的数据区宽
		height=this->GetHeight();  //取得原图的数据区高
		//产生随机噪声
		for(int j=0;j<height;j++)
		for(int i=0;i<wide;i++)
		{
			noisepoint=rand()/1024;
			p_temp[j*wide+i]=(p_temp[j*wide+i]*224/256+(int)noisepoint);
		}
		memcpy(m_pData,p_temp,size);
		delete p_temp;
	}
}

/***************************************************************/
/*函数名称:jiaoyanzaosheng()                                  */
/*函数类型:void                                               */
/*功能:对图像进行椒盐噪声处理。                               */
/***************************************************************/
void ZaoShengXiaoChuDib::jiaoyanzaosheng()
{
    DWORD size;
	size=GetSize();
	BYTE *p_data;     //原图数据区指针
	int wide,height;
    BYTE* p_temp=new BYTE [size];
	p_data=this->GetData();//取得原图的数据区指针
	memcpy(p_temp,p_data,size);
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像
	{
		wide=this->GetWidth(); //取得原图的数据区宽
		height=this->GetHeight();  //取得原图的数据区高
		for(int j=0;j<height;j++)
		for(int i=0;i<wide;i++)
		{
			if(rand()>31500)
				p_temp[j*wide+i]=0;
		}
		memcpy(m_pData,p_temp,size);
		delete p_temp;
	}
	else	//24位彩色
	{
		size=GetSize();
		BYTE* p_temp=new BYTE [size];
		p_data=this->GetData();//取得原图的数据区指针
		memcpy(p_temp,p_data,size);
		wide=this->GetWidth()*3; //取得原图的数据区宽
		height=this->GetHeight();  //取得原图的数据区高
		for(int j=0;j<height;j++)
		for(int i=0;i<wide;i++)
		{
			if(rand()>31500)
				p_temp[j*wide+i]=0;
		}
		memcpy(m_pData,p_temp,size);
		delete p_temp;
	}
}

/***************************************************************/ 
/*函数名称:jubupingjun()                                      */
/*函数类型:void                                               */
/*功能:对图像进行局部平均化处理。                             */
/***************************************************************/
void ZaoShengXiaoChuDib::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();  //取得原图的数据区高
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像
	{    
		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;	
	}
	else	//24位彩色
	{		    
		p_temp=new BYTE[wide*height*3];
		memset(p_temp,255,wide*height*3);
		for(int k=0;k<3;k++)
		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*3+(i-1)*3+k+k];
				ji[1]=p_data[(j-1)*wide*3+i*3+k];
				ji[2]=p_data[(j-1)*wide*3+(i+1)*3+k];
				ji[3]=p_data[j*wide*3+(i-1)*3+k];
				ji[4]=p_data[j*wide*3+i*3+k];
				ji[5]=p_data[j*wide*3+(i+1)*3+k];
				ji[6]=p_data[(j+1)*wide*3+(i-1)*3+k];
				ji[7]=p_data[(j+1)*wide*3+i*3+k];
				ji[8]=p_data[(j+1)*wide*3+(i+1)*3+k];
				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*3+(i-1)*3+k];
				ji[1]=p_data[(j-2)*wide*3+i*3+k];
				ji[2]=p_data[(j-2)*wide*3+(i+1)*3+k];
				ji[3]=p_data[(j-1)*wide*3+(i-1)*3+k];
				ji[4]=p_data[(j-1)*wide*3+i*3+k];
				ji[5]=p_data[(j-1)*wide*3+(i+1)*3+k];
				ji[6]=p_data[j*wide*3+i*3+k];
				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*3+(i-2)*3+k];
				ji[1]=p_data[(j-1)*wide*3+(i-1)*3+k];
				ji[2]=p_data[j*wide*3+(i-2)*3+k];
				ji[3]=p_data[j*wide*3+(i-1)*3+k];
				ji[4]=p_data[j*wide*3+i*3+k];
				ji[5]=p_data[(j+1)*wide*3+(i-2)*3+k];
				ji[6]=p_data[(j+1)*wide*3+(i-1)*3+k];
				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*3+i*3+k];
				ji[1]=p_data[(j+1)*wide*3+(i-1)*3+k];
				ji[2]=p_data[(j+1)*wide*3+i*3+k];
				ji[3]=p_data[(j+1)*wide*3+(i+1)*3+k];
				ji[4]=p_data[(j+2)*wide*3+(i-1)*3+k];
				ji[5]=p_data[(j+2)*wide*3+i*3+k];
				ji[6]=p_data[(j+2)*wide*3+(i+1)*3+k];
				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*3+(i+1)*3+k];
				ji[1]=p_data[(j-1)*wide*3+(i+2)*3+k];
				ji[2]=p_data[j*wide*3+i*3+k];
				ji[3]=p_data[j*wide*3+(i+1)*3+k];
				ji[4]=p_data[j*wide*3+(i+2)*3+k];
				ji[5]=p_data[(j+1)*wide*3+(i+1)*3+k];
				ji[6]=p_data[(j+1)*wide*3+(i+2)*3+k]; 
				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*3+(i+1)*3+k];
				ji[1]=p_data[(j-2)*wide*3+(i+2)*3+k];
				ji[2]=p_data[(j-1)*wide*3+i*3+k];
				ji[3]=p_data[(j-1)*wide*3+(i+1)*3+k];
				ji[4]=p_data[(j-1)*wide*3+(i+2)*3+k];
				ji[5]=p_data[j*wide*3+i*3+k];
				ji[6]=p_data[j*wide*3+(i+1)*3+k]; 
				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*3+(i-2)*3+k];
				ji[1]=p_data[(j-2)*wide*3+(i-1)*3+k];
				ji[2]=p_data[(j-1)*wide*3+(i-2)*3+k];
				ji[3]=p_data[(j-1)*wide*3+(i-1)*3+k];
				ji[4]=p_data[(j-1)*wide*3+i*3+k];
				ji[5]=p_data[j*wide*3+(i-1)*3+k];
				ji[6]=p_data[j*wide*3+i*3+k];
				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*3+(i-1)*3+k];
				ji[1]=p_data[j*wide*3+i*3+k];
				ji[2]=p_data[(j+1)*wide*3+(i-2)*3+k];
				ji[3]=p_data[(j+1)*wide*3+(i-1)*3+k];
				ji[4]=p_data[(j+1)*wide*3+i*3+k];
				ji[5]=p_data[(j+2)*wide*3+(i-2)*3+k];
				ji[6]=p_data[(j+2)*wide*3+(i-1)*3+k];
				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*3+i*3+k];
				ji[1]=p_data[j*wide*3+(i+1)*3+k];
				ji[2]=p_data[(j+1)*wide*3+i*3+k];
				ji[3]=p_data[(j+1)*wide*3+(i+1)*3+k];
				ji[4]=p_data[(j+1)*wide*3+(i+2)*3+k];
				ji[5]=p_data[(j+2)*wide*3+(i+1)*3+k];
				ji[6]=p_data[(j+2)*wide*3+(i+2)*3+k];
				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*3+i*3+k]=(int)(mean[nmin]+0.5);		
				}				 
			}
		}
		memcpy(p_data,p_temp,size);
		delete p_temp;
	}
}

⌨️ 快捷键说明

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