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)
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)
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'
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')