Skip to content

Commit bd61abf

Browse files
committed
load_img_stack
1 parent 7d8f6e5 commit bd61abf

File tree

1 file changed

+108
-0
lines changed

1 file changed

+108
-0
lines changed

Diff for: load_img_stack.py

+108
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
'''
2+
http://pymolwiki.org/index.php/load_img_stack
3+
4+
PyMOL image stack loading module
5+
6+
(c) Thomas Holder, Schrodinger, Inc.
7+
'''
8+
9+
from pymol import cmd, CmdException
10+
11+
def imgframeiter(img):
12+
'''
13+
Iterate over frames of a multi-frame image (like tiff)
14+
'''
15+
import itertools
16+
try:
17+
for i in itertools.count():
18+
img.seek(i)
19+
yield img
20+
except EOFError:
21+
raise StopIteration
22+
23+
def load_img_stack(pattern, name='', grid=1.0, channel=0, normalize=1,
24+
extent=None, quiet=1, _self=cmd):
25+
'''
26+
DESCRIPTION
27+
28+
Load a stack of images as a map
29+
30+
ARGUMENTS
31+
32+
pattern = str: image filename or pattern
33+
34+
name = str: map object name to create
35+
36+
grid = float: grid spacing in Angstrom {default: 1.0}
37+
38+
channel = int: color channel for RGB images {default: 0}
39+
40+
normalize = 0 or 1: normalize data {default: 1}
41+
42+
extent = 3-float: (a,b,c) edge lengths in Angstrom, overwrites "grid"
43+
arguments if given {default: }
44+
45+
EXAMPLES
46+
47+
load_img_stack img*.tif, extent=(21.0, 14.5, 18.2)
48+
'''
49+
import glob
50+
import numpy
51+
from chempy.brick import Brick
52+
53+
try:
54+
from PIL import Image
55+
except ImportError:
56+
import Image
57+
58+
channel, normalize, quiet = int(channel), int(normalize), int(quiet)
59+
60+
if not name:
61+
name = _self.get_unused_name('map')
62+
63+
if isinstance(grid, str):
64+
grid = _self.safe_eval(grid)
65+
if not isinstance(grid, (tuple, list)):
66+
grid = (grid,) * 3
67+
68+
stack = []
69+
size = None
70+
71+
filenames = glob.glob(_self.exp_path(pattern))
72+
73+
if not filenames:
74+
raise CmdException('no such files')
75+
76+
for filename in sorted(filenames):
77+
img = Image.open(filename)
78+
if size is None:
79+
size = img.size
80+
for img in imgframeiter(img):
81+
if img.size != size:
82+
if not quiet:
83+
print('Image size mismatch: %s != %s' % (img.size, size))
84+
continue
85+
a = numpy.reshape(img, (size[0], size[1], -1))
86+
stack.append(a[..., channel])
87+
88+
stack = numpy.asfarray(stack)
89+
stack = stack.swapaxes(0, 2)[:, ::-1, ::-1]
90+
91+
if min(stack.shape) < 2:
92+
raise CmdException('insufficient grid dimensions: ' + str(stack.shape))
93+
94+
if normalize:
95+
stack -= stack.mean()
96+
stack /= stack.std()
97+
98+
if extent:
99+
if isinstance(extent, str):
100+
extent = _self.safe_eval(extent)
101+
grid = [(float(e) / (s - 1)) for (e, s) in zip(extent, stack.shape)]
102+
if not quiet:
103+
print(' Setting grid = ' + str(grid))
104+
105+
brick = Brick.from_numpy(stack, grid)
106+
_self.load_brick(brick, name)
107+
108+
cmd.extend('load_img_stack', load_img_stack)

0 commit comments

Comments
 (0)