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
    评论
以下是一个使用中值滤波均值滤波C语言例程: ```c #include <stdio.h> #include <stdlib.h> // 定义数据长度和滤波窗口大小 #define LENGTH 10 #define WINDOW_SIZE 3 // 中值滤波函数 int median_filter(int data[]) { int temp[WINDOW_SIZE]; int i, j, k, tmp; // 对窗口内的数据进行排序 for (i = 0; i < WINDOW_SIZE; i++) { temp[i] = data[i]; for (j = i; j > 0; j--) { if (temp[j] < temp[j - 1]) { tmp = temp[j]; temp[j] = temp[j - 1]; temp[j - 1] = tmp; } } } // 返回中间值 return temp[WINDOW_SIZE / 2]; } // 均值滤波函数 int mean_filter(int data[]) { int sum = 0; int i; // 对窗口内的数据进行求和 for (i = 0; i < WINDOW_SIZE; i++) { sum += data[i]; } // 返回平均值 return sum / WINDOW_SIZE; } int main() { int data[LENGTH] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int filtered_data[LENGTH]; int i, j; // 对每个数据点进行滤波 for (i = 0; i < LENGTH; i++) { int window[WINDOW_SIZE]; // 构造滤波窗口 for (j = 0; j < WINDOW_SIZE; j++) { int index = i - WINDOW_SIZE / 2 + j; if (index < 0) { index = 0; } if (index >= LENGTH) { index = LENGTH - 1; } window[j] = data[index]; } // 中值滤波后再进行均值滤波 int median = median_filter(window); filtered_data[i] = mean_filter(window); } // 输出滤波后的数据 for (i = 0; i < LENGTH; i++) { printf("%d ", filtered_data[i]); } printf("\n"); return 0; } ``` 这个例程中,我们使用了一个长度为10的数据数组,并对每个数据点进行了滤波。对于每个数据点,我们构造了一个长度为3的滤波窗口,在窗口内进行中值滤波均值滤波。最后输出滤波后的数据数组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值