用Python读取* .his(图像)文件

时间:2014-02-22 04:33:06

标签: python binary imaging

我正在尝试读取* .his格式的图像文件。老实说,我不太了解这种格式,花了一些时间在谷歌上我发现它是一种二进制格式,它可以在ImageJ软件中作为原始格式导入读取。在进一步调查中,我找到了* .his文件的以下详细信息:

  • 图像类型= 16位无符号
  • 矩阵尺寸(以像素为单位)= w1024 x h1024
  • 跳过标题信息= 100字节(图像数据的第一个字节之前文件中的字节数)。
  • Little-Endian字节顺序

掌握了这些信息后,我开始......


只想逐个打印值,只是为了查看输出:

f = open("file.his", 'rb')
f.seek(100) 
try:
   byte = f.read(2)
   while byte != "":
      byte = f.read(2)
      print unpack('<H', byte) 
finally:
f.close()

打印出一些数字,然后输出错误信息:  ..... (64846) (64846) (64830)

追踪(最近一次通话):    打印解压缩('

Plz可以有人建议我如何阅读这种文件。我仍然认为'解包'是正确的功能,但如果有人有相似的经验,任何回复都会非常感激。

RKY。

1 个答案:

答案 0 :(得分:0)

我用* .inr图像文件完成了一个非常类似的任务,也许逻辑可以帮助你,这里你可以申请:

1 - 阅读文件

首先,您需要阅读该文件。

file = open(hisfile, 'r')
inp = file.readlines()

2-Get header

在我的情况下,我做了一个for循环,直到字符数为256,在你的情况下,你需要计算位数,这样你可以逐行“打印”,以找出你需要停止或尝试使用这个计算位数:

import sys
sys.getsizeof(line) #returns the size of the object

第3-数据

当您已经知道以下行是原始数据时,您需要将它们放在带有for循环的一个变量中:

for line in inp:
    raw_data += line

4 - 转换数据

要将字符串转换为numpy数组,您可以执行以下操作:

data = fromstring(raw_data, dtype='uint16')

然后应用形状数据:

data = data.reshape((1024,1024)).transpose() #You need to see if the transpose part its relevant,because in my case was fundamental.

也许如果你有一个文件的例子我可以尝试阅读它并帮助你更多。当然,你可以使用if来完成1 for for循环中的所有过程。