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代碼,以便它不會出現抗鋸齒。但是,如果您遇到了我遇到的問題,只想要一個解決方案,那就是了。