C语言实现膨胀,腐蚀,中值滤波以及均值滤波

C语言实现膨胀,腐蚀,中值滤波以及均值滤波

笔者从事嵌入式图像处理工作,因此不得不使用C语言实现大量图像算法。

膨胀,腐蚀,中值滤波使用C语言实现的基本原理基本相同,唯一需要注意的是需要开辟与原图相同的临时空间。

具体代码如下:

1.膨胀

//src原图大小为Wid*Hei
void DilateFilter(unsigned char*  src, int Wid, int Hei)
{
	int  i, j, k, l, m;
	int max=0;
	l=0;
	for (i = 0; i < Wid; i++)
	{
		for (j = 0; j < Hei; j++)
		{
			for(m=-3;m<=3;m++){
				for(k=-3;k<=3;k++){
					if(*(src+i+m+(j+k)*Wid)>max){
						max=*(src+i+m+(j+k)*Wid);
					}
				}
			}
			temp_IMG[i+j*Wid]=max;
			max=0;
		}
	}
	memcpy(src,temp_IMG,sizeof(unsigned char)*Wid*Hei);
}

2.腐蚀

//原图src大小为Wid*Hei
void ErodeFilter(unsigned char*  src, int Wid, int Hei)
{
	int  i, j, k, l, m;
	int min=255;
	l=0;
	for (i = 0; i < Wid; i++)
	{
		for (j = 0; j < Hei; j++)
		{
			for(m=3;m<=3;m++){
				for(k=-3;k<=3;k++){
					if(*(src+i+m+(j+k)*Wid)<min){
						min=*(src+i+m+(j+k)*Wid);
					}
				}
			}
			temp_IMG[i+j*Wid]=min;
			min=255;
		}
	}
	memcpy(src,temp_IMG,sizeof(unsigned char)*Wid*Hei);
}

3.均值滤波/中值滤波

利用宏定义加快运行速度

#define med_op(a,b,t)   {t = a; a = MAX(a, b); b = MIN(t, b);}
void Median3_omp(unsigned char* picPtr_src, unsigned int Wid, unsigned int Hei)
{
	int i, i0,i2,j0, j, j2;
	unsigned char  p0, p1, p2, p3, p4, p5, p6, p7, p8, tmp = 0;

	memcpy(temp_IMG,picPtr_src,Hei*Wid*sizeof(unsigned char));
	for (i = 0; i < Wid ; i++)
	{
		i0=i-1;
		i2=i+1;
		for (j = 0; j < Hei; j++)
		{
			j0 = j - 1;
			j2 = j + 1;

			p0=*(picPtr_src+i0+j0*Wid);
			p1=*(picPtr_src+i0+j*Wid);
			p2=*(picPtr_src+i0+j2*Wid);

			p3=*(picPtr_src+i+j0*Wid);
			p4=*(picPtr_src+i+j*Wid);
			p5=*(picPtr_src+i+j2*Wid);

			p6=*(picPtr_src+i2+j0*Wid);
			p7=*(picPtr_src+i2+j*Wid);
			p8=*(picPtr_src+i2+j2*Wid);
            //中值滤波
			//			tmp=(p1+p2+p3+p4+p5+p6+p7+p8+p0)/9;

			med_op(p1, p2, tmp);
			med_op(p4, p5, tmp);
			med_op(p7, p8, tmp);
			med_op(p0, p1, tmp);
			med_op(p3, p4, tmp);
			med_op(p6, p7, tmp);

			med_op(p1, p2, tmp);
			med_op(p4, p5, tmp);
			med_op(p7, p8, tmp);

			med_op(p0, p3, tmp);
			med_op(p5, p8, tmp);
			med_op(p4, p7, tmp);
			med_op(p3, p6, tmp);
			med_op(p1, p4, tmp);
			med_op(p2, p5, tmp);

			med_op(p4, p7, tmp);
			med_op(p4, p2, tmp);
			med_op(p6, p4, tmp);
			med_op(p4, p2, tmp);

			temp_IMG[i+j*Wid]=p4;
		}

	}
	memcpy(picPtr_src,temp_IMG,sizeof(unsigned char	)*Wid*Hei);
}

本篇博客均为自己对基本滤波的实现,如果有错误,欢迎纠正和提出意见。

后续将持续更新

 

E-mail:wangxiaoyang0307@foxmail.com

  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值