python 图像分析 边框_使用Python Image Library进行抗锯齿时,使用透明度去除边缘处的细边框...

我有一个高分辨率图像,我希望使用Google Maps API v3作为平铺地图叠加层.

我使用MapTiler将其分解为所需缩放级别的适当图块.除了在原始图像的边缘上的瓷砖上有一个薄的灰黑色边框之外,这很有效.

根据http://groups.google.com/group/maptiler/browse_thread/thread/70a4c5610538332a/42fefedb4a0bc6d2第二篇文章的建议,我尝试使用gdal2tiles.py,传递-r antialias选项但是细边框仍然存在.

如果我打开实际生成的图像切片,则细边框确实看起来是生成切片的一部分,但它不是原始图像的一部分.

我怀疑正在发生的事情是,当程序生成平铺图像文件并且结果是灰色边框时,我没有数据的Google地图图块部分被视为黑色像素.

以下是我认为来自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)

答案是将重新采样更改为BILINEAR(而不是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代码,因此它不是antialias.但是如果你遇到了我遇到的问题并且只想要一个解决方案,那就是它.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值