-
-
Save luispedro/3437255 to your computer and use it in GitHub Desktop.
| # UPDATE IN 2020 | |
| # You almost always will want to use the version at | |
| # https://github.com/luispedro/imread, which is | |
| # up-to-date and works with Python 3 | |
| # Copyright: Luis Pedro Coelho <[email protected]>, 2012 | |
| # License: MIT | |
| import numpy as np | |
| def read_roi(fileobj): | |
| ''' | |
| points = read_roi(fileobj) | |
| Read ImageJ's ROI format | |
| ''' | |
| # This is based on: | |
| # http://rsbweb.nih.gov/ij/developer/source/ij/io/RoiDecoder.java.html | |
| # http://rsbweb.nih.gov/ij/developer/source/ij/io/RoiEncoder.java.html | |
| SPLINE_FIT = 1 | |
| DOUBLE_HEADED = 2 | |
| OUTLINE = 4 | |
| OVERLAY_LABELS = 8 | |
| OVERLAY_NAMES = 16 | |
| OVERLAY_BACKGROUNDS = 32 | |
| OVERLAY_BOLD = 64 | |
| SUB_PIXEL_RESOLUTION = 128 | |
| DRAW_OFFSET = 256 | |
| pos = [4] | |
| def get8(): | |
| pos[0] += 1 | |
| s = fileobj.read(1) | |
| if not s: | |
| raise IOError('readroi: Unexpected EOF') | |
| return ord(s) | |
| def get16(): | |
| b0 = get8() | |
| b1 = get8() | |
| return (b0 << 8) | b1 | |
| def get32(): | |
| s0 = get16() | |
| s1 = get16() | |
| return (s0 << 16) | s1 | |
| def getfloat(): | |
| v = np.int32(get32()) | |
| return v.view(np.float32) | |
| magic = fileobj.read(4) | |
| if magic != 'Iout': | |
| raise IOError('Magic number not found') | |
| version = get16() | |
| # It seems that the roi type field occupies 2 Bytes, but only one is used | |
| roi_type = get8() | |
| # Discard second Byte: | |
| get8() | |
| if not (0 <= roi_type < 11): | |
| raise ValueError('roireader: ROI type %s not supported' % roi_type) | |
| if roi_type != 7: | |
| raise ValueError('roireader: ROI type %s not supported (!= 7)' % roi_type) | |
| top = get16() | |
| left = get16() | |
| bottom = get16() | |
| right = get16() | |
| n_coordinates = get16() | |
| x1 = getfloat() | |
| y1 = getfloat() | |
| x2 = getfloat() | |
| y2 = getfloat() | |
| stroke_width = get16() | |
| shape_roi_size = get32() | |
| stroke_color = get32() | |
| fill_color = get32() | |
| subtype = get16() | |
| if subtype != 0: | |
| raise ValueError('roireader: ROI subtype %s not supported (!= 0)' % subtype) | |
| options = get16() | |
| arrow_style = get8() | |
| arrow_head_size = get8() | |
| rect_arc_size = get16() | |
| position = get32() | |
| header2offset = get32() | |
| if options & SUB_PIXEL_RESOLUTION: | |
| getc = getfloat | |
| points = np.empty((n_coordinates, 2), dtype=np.float32) | |
| else: | |
| getc = get16 | |
| points = np.empty((n_coordinates, 2), dtype=np.int16) | |
| points[:,1] = [getc() for i in xrange(n_coordinates)] | |
| points[:,0] = [getc() for i in xrange(n_coordinates)] | |
| points[:,1] += left | |
| points[:,0] += top | |
| points -= 1 | |
| return points | |
| def read_roi_zip(fname): | |
| import zipfile | |
| with zipfile.ZipFile(fname) as zf: | |
| return [read_roi(zf.open(n)) | |
| for n in zf.namelist()] |
Sweet! saves me quite some time 👍
This is very nice. Where did you get the info to about the .roi file?
I have some files whose roi_type was 0, so this code didn't work. I commented lines 62 and 63 and it works now.
I've packaged this gist into a pypi package: https://github.com/tdsmith/ijroi, https://pypi.python.org/pypi/ijroi
Nice, thanks! Do you happen to have code for writing ROI by any chance?
See this one too : https://github.com/hadim/read-roi
This old gist does not work with Python 3, but I have now folded the code into the imread project and updated it to work with both Python 2 & 3:
Nice, thanks! Do you happen to have code for writing ROI by any chance?
I have the same question. Any one knows how to write ROI? I want to generate some region and go back to image J to edit. Thanks!
The above code does not work in python 3.6.
super helpful; thanks for posting this!
one note: the first column of
pointswill hold y values and the second column will hold x values!