从 CCD 相机读取 SPE 文件¶
日期 | 2010-12-03(最后修改),2009-04-13(创建) |
---|
一些 电荷耦合器件 (CCD) 相机(普林斯顿等)会生成 SPE 文件。本页建议如何使用 Numpy 读取此类二进制文件,但代码并不健壮。以下代码只能读取与示例“lampe_dt.spe”格式相同的文件(不幸的是,这是维基百科上唯一的 SPE 文件)。
使用 numpy 加载 SPE 文件¶
加载 SPE 文件只需要 Numpy,结果将是一个由颜色组成的数组。图像大小位于位置 42 和 656,数据位于
- SPE 文件头中还有许多其他数据,其中之一是数据类型(如果您知道在哪里,欢迎编辑此页面)。最后请注意,图像始终由 16 位无符号整数编码的颜色组成,但您的输入文件可能并非如此。
In [ ]
#!python numbers=disabled
# read_spe.py
import numpy as N
class File(object):
def __init__(self, fname):
self._fid = open(fname, 'rb')
self._load_size()
def _load_size(self):
self._xdim = N.int64(self.read_at(42, 1, N.int16)[0])
self._ydim = N.int64(self.read_at(656, 1, N.int16)[0])
def _load_date_time(self):
rawdate = self.read_at(20, 9, N.int8)
rawtime = self.read_at(172, 6, N.int8)
strdate = ''
for ch in rawdate :
strdate += chr(ch)
for ch in rawtime:
strdate += chr(ch)
self._date_time = time.strptime(strdate,"%d%b%Y%H%M%S")
def get_size(self):
return (self._xdim, self._ydim)
def read_at(self, pos, size, ntype):
self._fid.seek(pos)
return N.fromfile(self._fid, ntype, size)
def load_img(self):
img = self.read_at(4100, self._xdim * self._ydim, N.uint16)
return img.reshape((self._ydim, self._xdim))
def close(self):
self._fid.close()
def load(fname):
fid = File(fname)
img = fid.load_img()
fid.close()
return img
if __name__ == "__main__":
import sys
img = load(sys.argv[-1])
使用 matplotlib 和 ipython 查看图像¶
上面的“read_spe.py”脚本和“lampe_dt.spe”示例包含在存档 read_spe.zip 中。解压缩后,您可以启动脚本所在目录的 ipython
In [ ]
ipython -pylab read_spe.py lampe_dt.spe
第一行将显示一个新窗口中的图像。第二行将更改颜色映射(尝试“help(pylab.colormaps)”以列出它们)。
In [ ]
#!python
>>> pylab.imshow(img)
>>> pylab.hot()
部分作者:Unknown[21],Unknown[138]
附件