Chinaunix首页 | 论坛 | 博客
  • 博客访问: 323969
  • 博文数量: 106
  • 博客积分: 3081
  • 博客等级: 中校
  • 技术积分: 1090
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-15 14:07
文章分类

全部博文(106)

文章存档

2009年(1)

2007年(34)

2006年(71)

我的朋友

分类:

2006-03-23 17:48:22

二值图像边缘提取算法C语言实现[原创]

 朋  朋友们如果转载或引用本站的内容,请尊重作者的劳动,注意保留完整,并注明文章原始url。谢谢!_____________BugEyes

定义:每个像素的取值均为0或1,称这样的图像为二值图像。

算法:检查所有像素,若该像素为物体上与背景接触的像素(四连通像素中既有背景像素又有物体像素),则为边界。

程序:

#define M 30
#define N 20

void edge(int image[M][N],int bianyuan[M][N])
{
   int i,j;
   int inner=1,outer=1;
   for (i=0;i      for(j=0;j            bianyuan[i][j]=0;
   for(i=1;i      for(j=1;j      {
         inner=1;/*假设该像素或为物体,或为背景*/
         outer=1;
         if(image[i-1][j]==0||image[i+1][j]==0||image[i][j-1]==0||image[i][j+1]==0)
              inner=0;
         if(image[i-1][j]==1||image[i+1][j]==1||image[i][j-1]==1||image[i][j+1]==1)
              outer=0;
         if(inner==0&&outer==0&&image[i][j]==1)/*像素周围既有物体又有背景*/               bianyuan[i][j]=1;/*,且该像素为物体上的像素(image[i][j]==1),则定义为边界*/
      }
}

void output(int array[M][N],int n)
{
   int i,j;
   for(i=0;i   {
      printf("\n");
      for(j=0;j        if(array[i][j]==1)
           printf("1");
        else
           printf(" ");
   }
}

void main()
{
   int image[M][N]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                              {0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,0,0},
                              {0,1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,0},
                              {0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0},
                              {0,0,1,1,1,1,0,0,0,1,1,1,1,1,0,1,1,1,0},
                              {0,1,1,1,1,1,1,0,0,1,1,1,0,0,1,1,1,1,0},
                              {0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0},
                              {0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0},
                              {0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0},
                              {0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0}};
   int bianyuan[M][N]={0};
   int i,j;
   printf("\nThe origianl image is:\n");
   output(image,10);
   edge(image,bianyuan);
   printf("\nIts edge is:\n");
   output(bianyuan,10);
}

写完了,又看一下,感觉edge函数太罗嗦了,不够简练,想了一下,改成了下面的样子,函数接口不变:

void edge(int image[M][N],int bianyuan[M][N])
{
   int i,j;
   for (i=0;i      for(j=0;j         bianyuan[i][j]=0;
   for(i=1;i      for(j=1;j      {
          int t=image[i-1][j]+image[i+1][j]+image[i][j-1]+image[i][j+1];
          if(t>0&&t<4&&image[i][j]==1)/*周围4个像素值介于1~3之间,*/
               bianyuan[i][j]=1;             /*且当前像素为物体,则其必为边界*/
      }
}

 

 

BugEyes 发表于 2005-11-18 16:52:00
阅读(1747) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~