def crop_rpc_and_image(out_dir, img, rpc, rpc_ref, x, y, w, h): """ Crops an image and its rpc. The ROI may be defined on another image. Args: out_dir: path to the output directory. The cropped image and rpc files will be written there. img: path to the input image rpc: path to the input rpc rpc_ref: path to the rpc file of the reference image x, y, w, h: 4 integers defining a rectangular ROI in the reference image """ r = rpc_model.RPCModel(rpc) # recompute the roi if the input image is not the reference image if rpc_ref is not rpc: r_ref = rpc_model.RPCModel(rpc_ref) x, y, w, h = rpc_utils.corresponding_roi(r_ref, r, x, y, w, h) # output filenames crop_rpc_and_image.counter += 1 s = "_%02d" % crop_rpc_and_image.counter out_img_file = os.path.join(out_dir, "img%s.tif" % s) out_rpc_file = os.path.join(out_dir, "rpc%s.xml" % s) out_prv_file = os.path.join(out_dir, "prv%s.png" % s) # do the crop out_r = rpc_apply_crop_to_rpc_model(r, x, y, w, h) out_r.write(out_rpc_file) common.run('gdal_translate -srcwin %d %d %d %d "%s" "%s"' % (x, y, w, h, img, out_img_file)) # do the preview: it has to fit a 1366x768 rectangle w = float(w) h = float(h) if w > 1366 or h > 768: if w / h > float(1366) / 768: f = w / 1366 else: f = h / 768 tmp = common.tmpfile('.tif') common.image_zoom_gdal(out_img_file, f, tmp, w, h) common.run('gdal_translate -of png -ot Byte -scale %s %s' % (tmp, out_prv_file)) else: common.run('gdal_translate -of png -ot Byte -scale %s %s' % (out_img_file, out_prv_file)) common.run('rm %s.aux.xml' % out_prv_file)
def colorize(crop_panchro, im_color, x, y, zoom, out_colorized, rmin,rmax): """ Colorizes a Pleiades gray crop using low-resolution color information. Args: crop_panchro: path to the panchro (ie gray) crop im_color: path to the full color image (tiff or jp2) x, y: coordinates of the top-left corner of crop_panchro, in the full Pleiade image frame. zoom: subsampling zoom-factor that was used to generate crop_panchro out_colorized: path to the output file """ # get a translated and zoomed crop from the color image. It has to be # sampled on exactly the same grid as the panchro crop. # To do that we compose the translation + zoom transformation with a 4x # zoom (because color pleiades images have 4x lower resolution). There is # also a small horizontal translation (4 pixels at the panchro resolution) # The resulting transformation is the composition of: # translation (-1 - x/4, -y/4) # zoom 4/z w, h = common.image_size_tiffinfo(crop_panchro) xx = np.floor(x / 4.0) yy = np.floor(y / 4.0) ww = np.ceil((x + w * zoom) / 4.0) - xx hh = np.ceil((y + h * zoom) / 4.0) - yy crop_ms = common.image_crop_TIFF(im_color, xx, yy, ww, hh) crop_ms = common.image_zoom_gdal(crop_ms, zoom/4.0) # crop_ms = common.image_safe_zoom_fft(crop_ms, zoom/4.0) # crop the crop_ms image to remove the extra-pixels due to the integer crop # followed by zoom x0 = max(0,x - 4*xx) y0 = max(0,y - 4*yy) crop_ms = common.image_crop_TIFF(crop_ms, x0, y0, w, h) assert(common.image_size_tiffinfo(crop_panchro) == common.image_size_tiffinfo(crop_ms)) # convert rgbi to rgb rgb = common.rgbi_to_rgb(crop_ms, out=None, tilewise=True) # blend intensity and color to obtain the result # each channel value r, g or b is multiplied by 3*y / (r+g+b), where y # denotes the panchro intensity tmp = common.tmpfile('.tif') pcmd = "dup split + + / * 3 *" os.environ['TMPDIR'] = os.path.join(cfg['temporary_dir'], 'meta/') cmd = 'tiffu meta \"plambda ^ ^1 \\\"%s\\\" -o @\" %s %s -- %s' % (pcmd, crop_panchro, rgb, tmp) common.run(cmd) if w * h > 25e6: # image larger than 5000 x 5000 pixels common.image_qauto_otb(out_colorized, tmp) else: #common.image_qauto(tmp, out_colorized) common.image_rescaleintensities(tmp, out_colorized, rmin, rmax) return
def colorize(crop_panchro, im_color, x, y, zoom, out_colorized, rmin, rmax): """ Colorizes a Pleiades gray crop using low-resolution color information. Args: crop_panchro: path to the panchro (ie gray) crop im_color: path to the full color image (tiff or jp2) x, y: coordinates of the top-left corner of crop_panchro, in the full Pleiade image frame. zoom: subsampling zoom-factor that was used to generate crop_panchro out_colorized: path to the output file """ # get a translated and zoomed crop from the color image. It has to be # sampled on exactly the same grid as the panchro crop. # To do that we compose the translation + zoom transformation with a 4x # zoom (because color pleiades images have 4x lower resolution). There is # also a small horizontal translation (4 pixels at the panchro resolution) # The resulting transformation is the composition of: # translation (-1 - x/4, -y/4) # zoom 4/z w, h = common.image_size_tiffinfo(crop_panchro) xx = np.floor(x / 4.0) yy = np.floor(y / 4.0) ww = np.ceil((x + w * zoom) / 4.0) - xx hh = np.ceil((y + h * zoom) / 4.0) - yy crop_ms = common.image_crop_tif(im_color, xx, yy, ww, hh) crop_ms = common.image_zoom_gdal(crop_ms, zoom / 4.0) # crop_ms = common.image_safe_zoom_fft(crop_ms, zoom/4.0) # crop the crop_ms image to remove the extra-pixels due to the integer crop # followed by zoom x0 = max(0, x - 4 * xx) y0 = max(0, y - 4 * yy) crop_ms = common.image_crop_tif(crop_ms, x0, y0, w, h) assert (common.image_size_tiffinfo(crop_panchro) == common.image_size_tiffinfo(crop_ms)) # convert rgbi to rgb rgb = common.rgbi_to_rgb(crop_ms, out=None, tilewise=True) # blend intensity and color to obtain the result # each channel value r, g or b is multiplied by 3*y / (r+g+b), where y # denotes the panchro intensity tmp = common.tmpfile('.tif') pcmd = "dup split + + / * 3 *" os.environ['TMPDIR'] = os.path.join(cfg['temporary_dir'], 'meta/') cmd = 'tiffu meta \"plambda ^ ^1 \\\"%s\\\" -o @\" %s %s -- %s' % ( pcmd, crop_panchro, rgb, tmp) common.run(cmd) if w * h > 25e6: # image larger than 5000 x 5000 pixels common.image_qauto_otb(out_colorized, tmp) else: #common.image_qauto(tmp, out_colorized) common.image_rescaleintensities(tmp, out_colorized, rmin, rmax) return
def crop_corresponding_areas(out_dir, images, roi, zoom=1): """ Crops areas corresponding to the reference ROI in the secondary images. Args: out_dir: images: sequence of dicts containing the paths to input data roi: dictionary containing the ROI definition zoom: integer zoom out factor """ rpc_ref = images[0]['rpc'] for i, image in enumerate(images[1:]): x, y, w, h = corresponding_roi(rpc_ref, image['rpc'], roi['x'], roi['y'], roi['w'], roi['h']) if zoom == 1: common.image_crop_tif(image['img'], x, y, w, h, '%s/roi_sec_%d.tif' % (out_dir, i)) else: # gdal is used for the zoom because it handles BigTIFF files, and # before the zoom out the image may be that big tmp = common.image_crop_tif(image['img'], x, y, w, h) common.image_zoom_gdal(tmp, zoom, '%s/roi_sec_%d.tif' % (out_dir, i), w, h)