图像染色问题

一、题目:

3.20③  假设以二维数组g(1..m,1..n)表示一个图像区域,g[i,j]表示该区域中点(i,j)所具颜色,其值为从0到k的整数。

     编写算法置换点(i0,j0)所在区域 的颜色。约定和(i0,j0)同色的上、下、左、右的邻接点为同色区域的点。

    实现下列函数: void ChangeColor(GTYPE g, int m, int n, char c, int i0, int j0);

    /* 在g[1..m][1..n]中,将元素g[i0][j0] */

    /* 所在的同色区域的颜色置换为颜色c    */

    

    表示图像区域的类型定义如下:

    typedef char GTYPE[m+1][n+1];

    

    Stack是一个已实现的栈。

    可使用的相关类型和函数:

    typedef int SElemType; // 栈Stack的元素类型

    Status StackInit(Stack &s, int initsize);

    Status Push(Stack &s, SElemType e);

    Status Pop(Stack &s, SElemType &e);

    Status StackEmpty(Stack s);

    Status GetTop(Stack s, SElemType &e);

-------------------------------------------------------------------------------------------------

二、思路

  像这种关于图像区域的染色问题,大多的处理方法是使用递归算法,当然,使用栈来实现也是可以的,我在这里是使用自己设计的递归算法,算法比较简单,能看懂基本的递归算法的同学都能够看懂。

  另外在这里要注意一些细节,比如调用函数时的参数的正确性判断,还有就是下标是否越界的判断,这些细节决定了算法的成败。

  具体思路:

  1.首先将指定的点A进行染色;

  2.然后分别比较其上、下、左、右位置的四个点,若它们的颜色与A点原来的颜色相同,则分别对其调用染色函数。注意,在比较之前,需要先判断A点的上、下、左、右位置的四个点是否存在,即需要检验下标是否越界。

-------------------------------------------------------------------------------------------------

三、代码(C/C++)

[cpp]  view plain copy
  1. C代码  
  2.  void ChangeColor(GTYPE g, int m, int n,   
  3.                   char c, int i0, int j0)  
  4.  /* 在g[1..m][1..n]中,将元素g[i0][j0] */  
  5.  /* 所在的同色区域的颜色置换为颜色c    */  
  6.  {  
  7.      if(i0>m||j0>n)//初次调用时下标不合法  
  8.      {  
  9.          return;  
  10.      }  
  11.      int color;  
  12.      color=g[i0][j0];  
  13.      g[i0][j0]=c;  
  14.      if(i0-1>=1)//判断是否越界,下同  
  15.      {  
  16.          if(g[i0-1][j0]==color)  
  17.          {  
  18.              ChangeColor(g,m,n,c,i0-1,j0);          
  19.          }  
  20.      }  
  21.      if(i0+1<=m)  
  22.      {  
  23.          if(g[i0+1][j0]==color)  
  24.          {  
  25.              ChangeColor(g,m,n,c,i0+1,j0);      
  26.          }     
  27.      }   
  28.      if(j0-1>=1)  
  29.      {  
  30.          if(g[i0][j0-1]==color)  
  31.          {  
  32.              ChangeColor(g,m,n,c,i0,j0-1);      
  33.          }  
  34.      }  
  35.      if(j0+1<=n)      
  36.      {  
  37.          if(g[i0][j0+1]==color)  
  38.          {      
  39.              ChangeColor(g,m,n,c,i0,j0+1);      
  40.          }  
  41.      }      
  42.  }  
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值