4

我有一张高分辨率图像,我想用作使用Google Maps API v3进行平铺的地图叠加。在使用Python进行抗锯齿时使用透明边缘消除边缘处的薄边界图像库

我用MapTiler把它分成合适的瓷砖,在所需的缩放级别。除了在原始图像的边缘的贴图上有一个薄的灰黑色边框之外,该方法运行良好。

继第二篇文章http://groups.google.com/group/maptiler/browse_thread/thread/70a4c5610538332a/42fefedb4a0bc6d2的建议之后,我尝试了使用gdal2tiles.py,并将-r antialias选项传递给该选项,但细边界仍然存在。

如果我打开实际生成的图像砖,细边框似乎的确是产生瓷砖的一部分,但它并不是原始图像的一部分。

我怀疑正在发生的事情是,我没有数据的谷歌地图图块的部分被处理为黑色像素时,程序生成的平铺图像文件,结果是灰色的边框。

这就是我认为是从gdal2tiles.py相关代码:

    # Scaling by PIL (Python Imaging Library) - improved Lanczos 
        array = numpy.zeros((querysize, querysize, tilebands), numpy.uint8) 
        for i in range(tilebands): 
          array[:,:,i] = gdalarray.BandReadAsArray(dsquery.GetRasterBand(i+1), 0, 0, querysize, querysize) 
        im = Image.fromarray(array, 'RGBA') # Always four bands 
        im1 = im.resize((tilesize,tilesize), Image.ANTIALIAS) 
        if os.path.exists(tilefilename): 
          im0 = Image.open(tilefilename) 
          im1 = Image.composite(im1, im0, im1) 
        im1.save(tilefilename,self.tiledriver) 

任何想法如何让这个边界是不存在的,短期在打开相关生成平铺图像文件图像编辑器并将相关像素设置为透明?

我怀疑答案涉及寻找一些方式来表示透明的像素,使得抗锯齿忽略他们采样的目的。

更新:它可能不会赢得任何优雅或表演的奖项,但我认为,在这方面我是最有影响力的。当然,最后几码也是最难的。

如果我将ANTIALIAS更改为BICUBIC,然后处理alpha通道以使任何半透明像素都呈现完全透明状态,则我会摆脱大部分图块上的大部分边框。但是,一些浅色的边界线仍然存在。我不知道该怎么做。还值得一提的是,如果图像中的透明或半透明像素不在实际图像区域的边缘外,我想这种策略可能效果不佳。

这里的这些修改代码:

   # Scaling by PIL (Python Imaging Library) - improved Lanczos 
       array = numpy.zeros((querysize, querysize, tilebands), numpy.uint8) 
       for i in range(tilebands): 
         array[:,:,i] = gdalarray.BandReadAsArray(dsquery.GetRasterBand(i+1), 0, 0, querysize, querysize) 
       im = Image.fromarray(array, 'RGBA') # Always four bands 
       im1 = im.resize((tilesize,tilesize), Image.BICUBIC) 
       if os.path.exists(tilefilename): 
         im0 = Image.open(tilefilename) 
         im1 = Image.composite(im1, im0, im1) 
       im1AsArray = numpy.array(im1) 
       alpha = im1AsArray[:,:,3] 
       semiTransparentIndices = alpha < 255 
       alpha[semiTransparentIndices] = 0 
       im1AsArray[:,:,3] = alpha 
       im1 = Image.fromarray(im1AsArray, 'RGBA') 
       im1.save(tilefilename,self.tiledriver) 
+0

使用'Image.NEAREST',而不是'Image.ANTIALIAS'摆脱了边框的,但当然再瓷砖的其余部分看起来完全可怕.... – Trott 2011-05-13 22:58:01

+0

将BICUBIC更改为BILINEAR的技巧。猜猜我可以回答我自己的问题。 – Trott 2011-05-14 05:49:18

回答

1

答案是重采样改变双线性(而不是BICUBIC,这是我在贴到问题的更新试过),并确保将任何半透明像素更改为完全透明的像素。

正如我在更新说,我在这里所做的代码修改可能不会赢得优雅和性能的任何奖项,但它的工作原理。下面是需要从什么gdal2tiles.py原贴代码段改为:

  # Scaling by PIL (Python Imaging Library) - improved Lanczos 
      array = numpy.zeros((querysize, querysize, tilebands), numpy.uint8) 
      for i in range(tilebands): 
        array[:,:,i] = gdalarray.BandReadAsArray(dsquery.GetRasterBand(i+1), 0, 0, querysize, querysize) 
      im = Image.fromarray(array, 'RGBA') # Always four bands 
      im1 = im.resize((tilesize,tilesize), Image.BILINEAR) 
      if os.path.exists(tilefilename): 
        im0 = Image.open(tilefilename) 
        im1 = Image.composite(im1, im0, im1) 
      im1AsArray = numpy.array(im1) 
      alpha = im1AsArray[:,:,3] 
      semiTransparentIndices = alpha < 255 
      alpha[semiTransparentIndices] = 0 
      im1AsArray[:,:,3] = alpha 
      im1 = Image.fromarray(im1AsArray, 'RGBA') 
      im1.save(tilefilename,self.tiledriver) 

还要注意的是,如果你通过gdal2tiles.py的-r antialias标志上面的代码将只执行。是的,没错:我们更改了-r antialias代码,以便它不会出现抗锯齿。但是,如果您遇到了我遇到的问题,只想要一个解决方案,那就是了。