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

📄 zaoshengxiaochudib.cpp

📁 VC++图像处理程序设计配套光盘的设计源码 VC++ImageProcessingProgrammeDesign
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				averg2=0;
				averg3=0;
				//求周围8近邻均值
				averg=(int)(p_data[(j-1)*wide*3+(i-1)*3]+p_data[(j-1)*wide+i*3]
					+p_data[(j-1)*wide*3+(i+1)*3]+p_data[j*wide+(i-1)*3]
					+p_data[j*wide*3+(i+1)*3]+p_data[(j+1)*wide+(i-1)*3]
					+p_data[(j+1)*wide*3+i*3]+p_data[(j+1)*wide+(i+1)*3])/8;
				averg2=(int)(p_data[(j-1)*wide*3+(i-1)*3+1]+p_data[(j-1)*wide+i*3+1]
					+p_data[(j-1)*wide*3+(i+1)*3+1]+p_data[j*wide+(i-1)*3+1]
					+p_data[j*wide*3+(i+1)*3+1]+p_data[(j+1)*wide+(i-1)*3+1]
					+p_data[(j+1)*wide*3+i*3+1]+p_data[(j+1)*wide+(i+1)*3+1])/8;
				averg3=(int)(p_data[(j-1)*wide*3+(i-1)*3+2]+p_data[(j-1)*wide+i*3+2]
					+p_data[(j-1)*wide*3+(i+1)*3+2]+p_data[j*wide+(i-1)*3+2]
					+p_data[j*wide*3+(i+1)*3+2]+p_data[(j+1)*wide+(i-1)*3+2]
					+p_data[(j+1)*wide*3+i*3+2]+p_data[(j+1)*wide+(i+1)*3+2])/8;
				if(abs(p_temp[j*wide*3+i*3]-averg)>T)
					p_temp[j*wide*3+i*3]=averg;
				if(abs(p_temp[j*wide*3+i*3+1]-averg2)>T)
					p_temp[j*wide*3+i*3+1]=averg2;
				if(abs(p_temp[j*wide*3+i*3+2]-averg3)>T)
					p_temp[j*wide*3+i*3*2]=averg3;
			}
		}
		memcpy(p_data,p_temp,wide*height*3);
		delete p_temp;
	}
}

/***************************************************************/ 
/*函数名称:nn(int n)                                          */
/*函数类型:void                                               */
/*参数:int n,设定的屏蔽窗口参数(奇数)                      */
/*功能:对图像进行n*n均值滤波处理。                            */
/***************************************************************/
void ZaoShengXiaoChuDib::nn(int n)
{
    DWORD size;
	size=GetSize();
	BYTE *p_data;
	int xx,yy,n2,sum,sum2,sum3;
	int wide,height;    //原图长、宽
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像
	{
		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)
			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;
	}
	else	//24位彩色
	{			
		if(n<3||n%2!=1)//确认n为奇数
			AfxMessageBox("请输入一个大于等于3的奇数");
		if(n>=3&&n%2==1)
			n2=(n-1)/2;
		p_data=this->GetData();//取得原图的数据区指针
		wide=this->GetWidth(); //取得原图的数据区宽
		height=this->GetHeight();  //取得原图的数据区高
		BYTE* p_temp=new BYTE [wide*height*3];
		memset(p_temp,255,wide*height*3);
		//用N*N屏蔽窗口平均化
		for(int j=n2;j<height-n2;j++)
		{
			for(int i=n2;i<wide-n2;i++)
			{	
				//求N*N屏蔽窗口内的总和sum
				sum=0;
				sum2=0;
				sum3=0;
				for(yy=j-n2;yy<=j+n2;yy++)
					for(xx=i-n2;xx<=i+n2;xx++)
					{
						sum+=p_data[yy*wide*3+xx*3];
						sum2+=p_data[yy*wide*3+xx*3+1];
						sum3+=p_data[yy*wide*3+xx*3+2];
					}
				//把n*n屏蔽窗口内的平均值四舍五入后作为显示图像像素值
				p_temp[j*wide*3+i*3]=(int)((float)sum/(n*n)+0.5);
				p_temp[j*wide*3+i*3+1]=(int)((float)sum2/(n*n)+0.5);
				p_temp[j*wide*3+i*3+2]=(int)((float)sum3/(n*n)+0.5);
			}
		}
		memcpy(p_data,p_temp,wide*height*3);
		delete p_temp;
	}
} 

/***************************************************************/ 
/*函数名称:nnzhong(int n)                                     */
/*函数类型:void                                               */
/*参数:int n,设定的屏蔽窗口参数(奇数)                      */
/*功能:对图像进行n*n中值滤波处理。                            */
/***************************************************************/
void ZaoShengXiaoChuDib::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,medi2,medi3,madom,mado[1000],mado2[1000],mado3[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();  //取得原图的数据区高
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像
	{
		//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;
	}
	else	//24位彩色
	{
		//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*3+xx*3];
						mado2[m]=p_data[yy*wide*3+xx*3+1];
						mado3[m]=p_data[yy*wide*3+xx*3+2];
						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;
						}
						if(mado2[m]<mado2[m+1])
						{
							madom=mado2[m];
							mado2[m]=mado2[m+1];
							mado2[m+1]=madom;
							chg=1;
						}
						if(mado3[m]<mado3[m+1])
						{
							madom=mado3[m];
							mado3[m]=mado3[m+1];
							mado3[m+1]=madom;
							chg=1;
						}
					}
				}while(chg==1);	
				//求中值medi
				medi=mado[chuo];
				medi2=mado2[chuo];
				medi3=mado3[chuo];
				//把中值代入显示图像中
				p_temp[j*wide*3+i*3]=medi;
				p_temp[j*wide*3+i*3+1]=medi2;
				p_temp[j*wide*3+i*3+2]=medi3;
			}
		memcpy(p_data,p_temp,wide*height*3);
		delete p_temp;
	}
}

/***************************************************************/
/*函数名称:shizi(int n)                                       */
/*函数类型:void                                               */
/*参数:int n,设定的屏蔽窗口参数(奇数)                      */
/*功能:对图像进行十字型中值滤波。                             */
/***************************************************************/
void ZaoShengXiaoChuDib::shizi(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,medi2,medi3,madom,mado[1000],mado2[1000],mado3[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-1;
    chuo=(nn-1)/2;
	p_data=this->GetData();//取得原图的数据区指针
	wide=this->GetWidth(); //取得原图的数据区宽
    height=this->GetHeight();  //取得原图的数据区高
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像
	{
		//十字型中值滤波
		for(int j=n2;j<height-n2;j++)
		for(int i=n2;i<wide-n2;i++)
		{
			//把十字型屏蔽窗口部分的所有像素值代入mado[m]
			//(代入含中心的垂直部分)
			m=0;
			for(yy=j-n2;yy<=j+n2;yy++)
			{
				mado[m]=p_data[yy*wide+i];
				m++;
			}
			//(代入中心以外的的水平部分)
			for(xx=i-n2;xx<=i+n2;xx++)
			{
				if(xx==i)continue;
				mado[m]=p_data[j*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(m_pData,p_temp,size);
		delete p_temp;
	}
	else	//24位彩色
	{	
		//十字型中值滤波
		for(int j=n2;j<height-n2;j++)
		for(int i=n2;i<wide-n2;i++)
		{
			//把十字型屏蔽窗口部分的所有像素值代入mado[m]
			//(代入含中心的垂直部分)
			m=0;
			for(yy=j-n2;yy<=j+n2;yy++)
			{
				mado[m]=p_data[yy*wide*3+i*3];
				mado2[m]=p_data[yy*wide*3+i*3+1];
				mado3[m]=p_data[yy*wide*3+i*3+2];
				m++;
			}
			//(代入中心以外的的水平部分)
			for(xx=i-n2;xx<=i+n2;xx++)
			{
				if(xx==i)continue;
				mado[m]=p_data[j*wide*3+xx*3];
				mado2[m]=p_data[j*wide*3+xx*3+1];
				mado3[m]=p_data[j*wide*3+xx*3+2];
				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;
					}
					if(mado2[m]<mado2[m+1])
					{
						madom=mado2[m];
						mado2[m]=mado2[m+1];
						mado2[m+1]=madom;
						chg=1;
					}
					if(mado3[m]<mado3[m+1])
					{
						madom=mado3[m];
						mado3[m]=mado3[m+1];
						mado3[m+1]=madom;
						chg=1;
					}
				}
			}while(chg==1);
			//求中值medi
			medi=mado[chuo];
			medi2=mado2[chuo];
			medi3=mado3[chuo];
			p_temp[j*wide*3+i*3]=medi;
			p_temp[j*wide*3+i*3+1]=medi2;
			p_temp[j*wide*3+i*3+2]=medi3;					
		}		
		memcpy(m_pData,p_temp,wide*height*3);
		delete p_temp;
	}
}

/***************************************************************/ 
/*函数名称:nnzuida(int n)                                     */
/*函数类型:void                                               */
/*参数:int n,设定的屏蔽窗口参数(奇数)                      */
/*功能:对图像进行N*N最大值滤波。                              */
/***************************************************************/
void ZaoShengXiaoChuDib::nnzuida(int n)
{
    DWORD size;
	size=GetSize();
	int yy,xx,n2,nn,m,madomax,madomax2,madomax3,mado[1000],mado2[1000],mado3[1000];
	BYTE *p_data;     //原图数据区指针
	int wide,height;
    BYTE* p_temp=new BYTE [size];
	memset(p_temp,255,size);
	if(n<3||n%2!=1)//确认n是3以上的奇数
	AfxMessageBox("请输入一个大于等于3的奇数");
	if(n>=3&&n%2==1)
	n2=(n-1)/2;
	nn=n*n;
	p_data=this->GetData();//取得原图的数据区指针
   	wide=this->GetWidth(); //取得原图的数据区宽
    height=this->GetHeight();  //取得原图的数据区高
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像
	{
		//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]中的最大值madomax,用作最大频率值
			madomax=mado[0];
			for(m=1;m<nn;m++)
				if(madomax<mado[m])
				madomax=mado[m];
			p_temp[j*wide+i]=madomax;
		}                 
		memcpy(m_pData,p_temp,size);
		delete p_temp;
	}
	else	//24位彩色
	{		    
		//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*3+xx*3];

⌨️ 快捷键说明

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