VC 下 用 opencv 实现的 中值滤波

最近用到好多小函数。

整理记录在此。

(参考网络资源,整理而来)

/*****************************************************
* 
*   函数名称:
*      MidFilter
*
*    参数:
*      IplImage* img        -需要进行种植滤波的函数
*      int  tem_w           -模板的宽度
*      int  tem_h           -模板的高度
*    返回:
*        返回处理后的图像
*    功能:
*	   对图像进行中值滤波
*
*    说明:
*	   为处理方便起见,模板的宽度和高度都应为奇数
*******************************************************/

IplImage* MidFilter(IplImage* img,int tem_w,int tem_h)
{

	//统计中间值
	double mid;
	BYTE *temp=(BYTE*)malloc(tem_w*tem_h*sizeof(BYTE));

	//如果图像不是256色返回
	if (img->nChannels != 1) 
	{   
		//返回
		return NULL;
	}

	//建立一个和原图像大小相同的25色灰度位图
	IplImage *img_mid = cvCreateImage(cvGetSize(img), 8, 1);

	//循环变量
	int i,j,m,n;
	int w, h, dw;

	//对图像进行扫描

	//行 
	for(i=0;i<h;i++)
	{  
		//列
		for(j=0;j<w;j++)
		{   

			//为统计变量赋初始值


			//对于图像的4个边框的象素保持原灰度不变
			if( j<((tem_w-1)/2) || j>(w-(tem_w+1)/2) || i<((tem_h-1)/2) || i>(h-(tem_h+1)/2) )
			{

				CvScalar s = cvGet2D(img, i, j);;
				cvSet2D(img_mid, i, j, s);
			}

			//对于其他的象素进行模板操作
			else 
			{ 
				//将点(i,j)点作为模板的中心
				for(m=i-((tem_h-1)/2);m<=i+((tem_h-1)/2);m++)
				{
					for(n=j-((tem_w-1)/2);n<=j+((tem_w-1)/2);n++)
					{
						//将以点(i,j)为中心,与模板大小相同的范围内的象素传递到模板矩阵中
						CvScalar s1 = cvGet2D(img, m, n);
						temp[(m-i+((tem_h-1)/2))*tem_w+n-j+((tem_w-1)/2)]= s1.val[0];
					}

				}

				//利用气泡法计算中值
				for(m=0;m<tem_w*tem_h-1;m++)
				{

					for(n=0;n<tem_w*tem_h-m-1;n++)
					{
				         if(temp[n]>temp[n+1]) 
						 {
					        mid=temp[n];
				            temp[n]=temp[n+1];
				            temp[n+1]=mid;
						}
			         }

				} 

				//将计算的结果放到新的位图的相应位置
				CvScalar s2;
				s2.val[0] = temp[(tem_w*tem_h-1)/2];
				cvSet2D(img_mid, i, j, s2);
		 }
		}
	} 

	return img_mid;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值