从 CCD 相机读取 SPE 文件

日期2010-12-03(最后修改),2009-04-13(创建)

一些 电荷耦合器件 (CCD) 相机(普林斯顿等)会生成 SPE 文件。本页建议如何使用 Numpy 读取此类二进制文件,但代码并不健壮。以下代码只能读取与示例“lampe_dt.spe”格式相同的文件(不幸的是,这是维基百科上唯一的 SPE 文件)。

使用 numpy 加载 SPE 文件

加载 SPE 文件只需要 Numpy,结果将是一个由颜色组成的数组。图像大小位于位置 42 和 656,数据位于

  1. 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]

附件