Example #1
0
def serve_mosaic_image(time_series=None, pid=None, params='/'):
    """Generate a mosaic of ROIs from a sample bin.
    params include the following, with default values
    - series (mvco) - time series (FIXME: handle with resolver, clarify difference between namespace, time series, pid, lid)
    - size (1024x1024) - size of the mosaic image
    - page (1) - page. for typical image sizes the entire bin does not fit and so is split into pages.
    - scale - scaling factor for image dimensions """
    # parse params
    params = parse_params(params, size='1024x1024',page=1,scale=1.0)
    (w,h) = tuple(map(int,re.split('x',params[SIZE])))
    scale = float(params[SCALE])
    page = int(params[PAGE])
    # parse pid/lid
    hit = pid_resolver.resolve(pid=pid)
    # perform layout operation
    scaled_size = (int(w/scale), int(h/scale))
    layout = get_mosaic_layout(hit.bin_pid, scaled_size, page)
    # serve JSON on request
    if hit.extension == 'json':
        return jsonr(list(layout2json(layout, scale)))
    # resolve ROI file
    roi_path = resolve_roi(hit.bin_pid)
    # read all images needed for compositing and inject into Tiles
    with open(roi_path,'rb') as roi_file:
        for tile in layout:
            target = tile.image
            # FIXME use fast stitching
            tile.image = as_pil(get_fast_stitched_roi(hit.bin_pid, target[TARGET_NUMBER]))
    # produce and serve composite image
    mosaic_image = thumbnail(mosaic.composite(layout, scaled_size, mode='L', bgcolor=160), (w,h))
    (pil_format, mimetype) = image_types(hit)
    return image_response(mosaic_image, pil_format, mimetype)
Example #2
0
File: app.py Project: LouisK130/oii
def serve_mosaic_image(time_series=None, pid=None, params='/'):
    """Generate a mosaic of ROIs from a sample bin.
    params include the following, with default values
    - series (mvco) - time series (FIXME: handle with resolver, clarify difference between namespace, time series, pid, lid)
    - size (1024x1024) - size of the mosaic image
    - page (1) - page. for typical image sizes the entire bin does not fit and so is split into pages.
    - scale - scaling factor for image dimensions """
    # parse params
    size, scale, page = parse_mosaic_params(params)
    (w,h) = size
    parsed = parse_pid(pid)
    schema_version = parsed['schema_version']
    try:
        paths = get_fileset(parsed)
    except NotFound:
        abort(404)
    adc_path = paths['adc_path']
    roi_path = paths['roi_path']
    bin_pid = canonicalize(get_url_root(), time_series, parsed['bin_lid'])
    # perform layout operation
    scaled_size = (int(w/scale), int(h/scale))
    layout = list(get_mosaic_layout(adc_path, schema_version, bin_pid, scaled_size, page))
    extension = parsed['extension']
    # serve JSON on request
    if extension == 'json':
        return Response(json.dumps(list(layout2json(layout, scale))), mimetype=MIME_JSON)
    mimetype = mimetypes.types_map['.' + extension]
    # read all images needed for compositing and inject into Tiles
    image_layout = []
    with open(roi_path,'rb') as roi_file:
        for tile in layout:
            target = tile.image # in mosaic API, the record is called 'image'
            # FIXME 1. replace PIL
            image = get_target_image(parsed, target, file=roi_file, raw_stitch=True)
            image_layout.append(Tile(PIL.Image.fromarray(image), tile.size, tile.position))
    # produce and serve composite image
    mosaic_image = thumbnail(mosaic.composite(image_layout, scaled_size, mode='L', bgcolor=160), (w,h))
    #pil_format = filename2format('foo.%s' % extension)
    return Response(as_bytes(mosaic_image), mimetype=mimetype)
Example #3
0
from oii.ifcb import client
from oii.image import mosaic
import os
import re
from PIL import Image

DIR='/Users/jfutrelle/Pictures'

def get_images():
    for filename in os.listdir(DIR):
        if re.match(r'.*\.png$',filename) or re.match(r'.*\.jpg$',filename):
            file = os.path.join(DIR,filename)
            image = Image.open(file)
            if image.size[0] < 1024 and image.size[1] < 1024:
                print 'including %s...' % filename
                yield image
                
images = list(get_images())
print 'laying out...'
layout = list(mosaic.layout(images, (5000, 2400000)))
print layout
print 'compositing...'
m = mosaic.composite(layout,None,'RGB')
file='/Users/jfutrelle/Pictures/a_mosaic.jpg'
print 'saving as %s...' % file
m.save(file,'JPEG')
print 'done'

Example #4
0
from oii.ifcb import client
from oii.image import mosaic

# blob mask mosaic from http://ifcb-data.whoi.edu/mvco/IFCB5_2011_339_111025

def get_blobs(pid,limit=None):
    count = 0
    for target in client.list_targets(pid):
        count += 1
        if limit is not None and count > limit:
            return
        blob = target+'_blob.png'
        print 'fetching %s...' % blob
        yield client.fetch_image(blob)

PID='http://ifcb-data.whoi.edu/mvco/IFCB5_2011_339_111025'
print('loading images from %s...' % PID)
images = get_blobs(PID,500)
print 'laying out...'
layout = list(mosaic.layout(images, (2400, 2400000)))
print 'compositing...'
m = mosaic.composite(layout)
file='/Users/jfutrelle/Pictures/blob_mosaic.png'
print 'saving as %s...' % file
m.save(file,'PNG')