[gdal-dev] trying to change regionator image resampling to
nearest-neighbor
Mary Jo Brodzik
brodzik at nsidc.org
Thu Nov 12 14:32:55 EST 2009
Dear gdal-dev list members,
I'm using a python tool called the regionator
(http://code.google.com/p/regionator/wiki/ Welcome) on a large
(14352x7440) png image. The regionator uses the GDAL library to resample
subsets of the original image into much smaller chunk images. These
images are set up at increasing levels of detail in a kml file that make
the download of this information into a googleEarth client much more
efficient.
The png is color and includes transparency; its approximate resolution is
500 meters. I basically have 4 colors in the original image, black, white,
blue and yellow. The output images that regionator is producing are great,
but when I zoom in to distances where the original pixel sizes are
visible, it looks like the resampling did some averaging across the 4
colors, so I'm getting blue sections surrounded by a blue halo that bleeds
into white, and yellow and blue values bleeding into each other, etc.
I'd like to control the resampling, and force it to do nearest-neighbor
rather than averaging to eliminate the halos. It looks to me like the
regionator is doing the resampling with calls to ReadRaster and
WriteRaster in in a class called extractor.py, but I don't know enough
about the GDAL libraries to know how to change them. Is it possible to
force the resampling to be nearest neighbor? extractor.py isn't terribly
large or complicated, so I'm including it here (below).
I've already tried the googleearth forum and the kml-developers forum, no
help from those communities. Python's new to me, and I've only used the
GDAL command-line utilities up to now.
Thanks in advance for any tips.
Mary Jo
Here's the regionator's extractor.py:
"""
Copyright (C) 2006 Google Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""
"""
$URL: http://regionator.googlecode.com/svn/trunk/kml/extractor.py $
$Revision: 200 $
$Date: 2007-01-12 09:12:48 -0700 (Fri, 12 Jan 2007) $
"""
""" class Extractor
Phase 3 of SuperOverlay creation.
Extract tiles from an image
Front-ends GDAL. Input file and output driver must be
some format known to GDAL.
"""
import gdal
import tempfile
import os
class Extractor:
""" class Extractor
Create for Extractor the image file.
Each tile is resampled to the specified size and written
to a file of the given format.
"""
def __init__(self,imgfile,twid,tht,fmt,verbose=False):
"""
Args:
imgfile: a gtiff
twid,tht: extracted tile resample pixel width/height
fmt: GDAL output driver name ('PNG','JPEG')
"""
self.__in_ds = gdal.Open(imgfile)
self.__twid = twid
self.__tht = tht
self.__fmt = fmt
self.__verbose = verbose
self.__bands = self.__in_ds.RasterCount
if self.__verbose:
print 'Extractor %s %d bands' % (imgfile,self.__bands)
# Intermediate work must be in GTiff (?)
self.__gtiff_driver = gdal.GetDriverByName('GTiff')
# Output driver/format is whatever the user specifies
# XXX handle bad/wrong fmt's less gracelessly
self.__o_driver = gdal.GetDriverByName(fmt)
def Extract(self,x,y,wid,ht,basename):
""" Extract a tile into a file
The given tile is extracted, resampled and saved
according to the tile pixel dimensions and format
specified at object __init__().
Args:
x,y: pixel offset
wid,ht: pixel dimensions
Returns:
True: complete success
False: any failure
"""
# Get the tile's pixels resampled
twid = self.__twid
tht = self.__tht
i_data = self.__in_ds.ReadRaster(x,y,wid,ht,buf_xsize=twid,buf_ysize=tht)
# Have to Create out to GTiff first (?)
(fd, tmpfile) = tempfile.mkstemp(suffix='GTiff')
os.close(fd)
o_ds = self.__gtiff_driver.Create(tmpfile,twid,tht,bands=self.__bands)
o_ds.WriteRaster(0,0,twid,tht,i_data)
# Save off using the specified driver
filename = '%s.%s' % (basename, self.__fmt)
options = []
if self.__fmt == 'JPEG':
options.append('QUALITY=90') # Default of 75 is low quality
self.__o_driver.CreateCopy(filename, o_ds, options=options)
if self.__verbose:
print filename
# Delete the tmp file
self.__gtiff_driver.Delete(tmpfile)
More information about the gdal-dev
mailing list