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);
}
本篇博客均为自己对基本滤波的实现,如果有错误,欢迎纠正和提出意见。
后续将持续更新