好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

如何用简单的算法生成一个类似『光盘』的彩色圆形图片?

大概就像下图所示的样子

回复内容: 补充一下MATLAB的代码:

  t   =   (  0  :.  02  :  2  )  *  pi  ; 
 r   =   0  :.  02  :  1  ; 
 pcolor  (  cos  (  t  )  '*  r  ,  sin  (  t  )  '*  r  ,  t  '*  (  r  ==  r  )) 
 colormap  (  hsv  (  256  )),   shading   interp  ,   axis   image   off 
  
...被抢先了...

基本上就是在这个圆上颜色的色相(Hue),只与该点与圆心连线的夹角有关。知道这一点你就做一幅图像,然后遍历每一个点,把该点的坐标值 转换为极坐标 ,色相值就是极坐标角度 。

用 matplotlib 实现的话有个小技巧,把imshow的cmap改为hsv就可以直接按照色相来画。



  # -*- coding:utf-8 -*- 
 from   pylab   import   * 

 center   =   (  250  ,   250  ) 
 radius   =   250 

 img   =   zeros  ((  500  ,  500  )) 

 for   i   in   range  (  500  ): 
     for   j   in   range  (  500  ): 
         x   =   i   -   center  [  0  ]   *   1.0 
         y   =   j   -   center  [  1  ]   *   1.0 
         if   x  **  2  +  y  **  2      radius  **  2  : 
             if   x   >   0  : 
                 img  [  i  ,  j  ]   =   arctan  (  y  /  x  ) 
             elif   x    0   and   y  >=  0  : 
                 img  [  i  ,  j  ]   =   arctan  (  y  /  x  )   +   pi 
             elif   x    0   and   y    0  : 
                 img  [  i  ,  j  ]   =   arctan  (  y  /  x  )   -   pi 
             elif   x  ==  0   and   y  >  0  : 
                 img  [  i  ,  j  ]   =   pi   /   2 
             elif   x  ==  0   and   y    0  : 
                 img  [  i  ,  j  ]   =   pi   /   -  2 
             elif   x  ==  0   and   y  ==  0  : 
                 img  [  i  ,  j  ]   =   0.0 

 print   img 
 imshow  (  img  ,   cmap  =  cm  .  hsv  ) 
 show  () 
  
改编自@冯昱尧的代码

  from   pylab   import   * 
 n  =  300 
 img  =  [[  arctan2  (  x  ,  y  )   if   x  *  x  +  y  *  y    n  *  n   else   0   for   y   in   range  (  -  n  ,  n  )]   for   x   in   range  (  -  n  ,  n  )] 
 imshow  (  img  ,   cmap  =  cm  .  hsv  ) 
 show  () 
  
如果根据这幅图,“光盘”的意思就是每一条半径的颜色在色相Hue上渐变。
关于色相是什么(反正这里说的不是可以用来牺牲的那个色相了),可以参看Wiki:HSL和HSV色彩空间 ,那个H就是色相Hue。
有点像下面这幅图的横截面(摘自Wiki)
只不过明度Chroma没有变化。 只不过明度Chroma没有变化。
这样的话,蛮简单的啊。对每个像素算出它所在半径的角度 0~2π 然后映射到Hue的值域上就是了。
具体实现的话,话说可以用OpenCV吗?反正一些图像库里面是有HSR到RGB的转换函数的。

(我一直都不明白所谓邀请是怎么回事,以及为什么大家都爱说谢邀) 补充一下Mathematica代码

 n=300;
c=Hue[i/n];
Graphics@Table[{c,EdgeForm@c,Disk[{0,0},1,2Pi/n{i-1,i}]},{i,n}]
  
期待mma的代码,估计一条语句搞定

查看更多关于如何用简单的算法生成一个类似『光盘』的彩色圆形图片?的详细内容...

  阅读:45次