python图像旋转,

  python图像旋转,

  用python实现旋转地球

  原始资料

  本文只讲最简单最常见的地球正转。

  首先你得有一张360度的地图。效果如下图。网上搜一下,有很多这样的图片,很容易获取。

  它的特点是高度正好是宽度的一半,因为地球一周有360度,但从南极到北极只有180度。这张360度地图显示了地球在每个纬度和经度的表面效应。仔细观察会发现,南北极变形严重,而中间地带则类似于我们经常看到的地图。

  我们称之为经纬度测绘。

  基本原理

  旋转的地球之所以看起来在旋转,只是因为上面显示的内容在变化。其实起点只是一个圆。我们所做的只是将经纬度图中的像素以合理的方式贴在圆上。然后将图片的帧连接成一个GIF动画。

  映射方法是:

  1.选择圆中的所有点。

  2.计算每个点对应的经纬度。

  3.从经纬度图中获取经纬度对应的xy坐标。

  4.获取像素写入图片。

  5.制作gif

  计算过程是比较简单的球面几何,下面用代码解释。

  1 获得圆内所有的点

  这个比较简单。

  img=Image.new(RGBA ,(300,300),黑色)

  w=img.size[0]

  h=img.size[1]

  pxList=[]

  pyList=[]

  foriinrange(w):

  forjinrange(h):

  r=math . sqrt((I-w/2)* * 2(j-h/2)* * 2)

  ifr150:

  pxList.append(i)

  pylist . append(j)2 计算经纬度

  首先,从平面坐标获得三维坐标。

  在球面上的任意一点,都有x2 y2 z2=1的规律。

  利用这个原理,我们可以得到圆上每个点的Z值。

  根据x,y,z,y,z计算球面的经纬度

  为了使计算速度尽可能快,这里使用了numpy。

  defcalcSphereXY2XYZ(px,py,maxHeight,longOffset):

  v0x=np.array(px)

  v0y=np.array

  v03=np.subtract(v0x,maxHeight)

  v04=np.subtract(v0y,maxHeight)

  v1x=np.true_divide(v03,maxHeight)

  v1y=np.true_divide(v04,maxHeight)

  v07=np.pow

  er(v1x,2)

  v08=np.power(v1y,2)

  v09=np.add(v07,v08)

  v0a=np.subtract(1,v09)

  v1z=np.power(v0a,1/2)#z

  #print('z:',max(v1z),min(v1z))

  v1lat=np.multiply(v1y,math.pi/2)#lat

  v0lon=np.arctan2(v1z,-v1x)

  v1lon=np.add(v0lon,longOffset)#long

  v2lon=np.fmod(v1lon,math.pi*2)#long

  returnv2lon,v1lat3 获取经纬度对应的xy坐标

  就是一个简单的坐标映射

  

defcalcShpereLatLong2XY(vlon,vlat,width,height):

  v3x0=np.multiply(vlon,width/2/math.pi)

  v3y0=np.multiply(vlat,height/math.pi)

  v3y1=np.add(v3y0,height/2)

  v3x2=v3x0.astype(np.integer)

  v3y2=v3y1.astype(np.integer)

  returnv3x2,v3y2

4 获得像素点,并写入图片

  首先,载入经纬度贴图的素材并转为numpy格式

  

imgBack=Image.open('EARTH_small.bmp')

  width=imgBack.size[0]

  height=imgBack.size[1]

  imgBack=imgBack.convert('RGBA')

  arrayBack=np.array(imgBack)

注意转换后的XY是反的,取点并直接赋值即可

  

color=arrayBack[npy,npx]

  foriinrange(len(pxList)):

  x=pxList[i]

  y=pyList[i]

  cc=color[i]

  #print(cc)

  cc=tuple(cc)

  img.putpixel((x,y),cc)

5 GIF制作

  使用的是imageio库

  

frames=[]

  foriinrange(0,360,10):

  a=-i*math.pi/180

  img=getPic(a)

  str1='temp%03d.png'%i

  img.save(str1)

  im=imageio.imread(str1)

  frames.append(im)

  #img.show()

  imageio.mimsave('earth.gif',frames,'GIF',duration=0.25)

更多Python知识,请关注Python视频教程!!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: