如何从.raw文件中读取体素数据?

时间:2017-01-28 15:20:03

标签: image-processing

有很多软件可以打开原始文件(我使用ImageJ),但是如何找到用于生成它的数据?

我需要找到存储在原始文件的每个体素中的值。

1 个答案:

答案 0 :(得分:1)

更新了答案

好吧,我把我的学习上限放在了(我的风格)Python中 - 我以前从未看过它,所以请注意这个问题!

#!/usr/bin/python
from __future__ import print_function
import sys,struct

if len(sys.argv)!=2:
    print('Usage: nrrd2txt file.raw')
    exit(1)

with open(sys.argv[1],"rb") as f:
    voxels=0
    floats=0
    while True:
        bin=f.read(4)
        if not bin: break
        floats+=1
        val=struct.unpack('>f',bin)
        if floats%7:
            print('%f ' % val,end="")
        else:
            voxels+=1
            print('%f' % val)

print('Voxels read: ',voxels)

原始答案

可能有工具已经这样做,但如果您不知道,有可能。

示例文件的标题如下所示:

NRRD0001
type: float
dimension: 4
sizes: 7 38 39 40
axis mins:  NaN -2 -2 -2
axis maxs:  NaN 2 2 2
data file: ./dt-helix.raw
endian: big
encoding: raw

因此每个体素有7个浮点数,尺寸为38x39x40,因此快速检查会产生:

7 * 38 * 39 * 40 * 4 bytes per float = 1659840 bytes

并且匹配数据文件的大小。

因此,一个快速而又脏的Perl脚本可以解压缩,如下所示:

#!/usr/bin/perl
use strict;
use warnings;
################################################################################
# Unpack.pl - a quick and dirty unpacker for NRRD raw tensor data
# Mark Setchell
#
# Run with:
# ./Unpack.pl < nrrd.raw
################################################################################

open my $fh, '<:raw', 'file.raw' or die $!;

my $done=0;
while(!$done) {
   # Declare some variables
   my($binfloat,$float);
   # Read in and print 7 floats for each voxel
   for(my $i=0;$i<7 && !$done;$i++){
      if(sysread($fh,$binfloat,4)==4){
         $float=unpack('f>',$binfloat);
         printf "%f ",$float;
      } else{
         $done=1;
      }
   }
   printf "\n" if !$done;
}
close $fh;

然后将其保存为Unpack.pl并使用以下命令运行:

./Unpack.pl < nrrd.raw < file.txt

输出如下:

1.000000 0.500000 0.000000 0.000000 0.500000 0.000000 0.500000 
1.000000 0.500000 -0.000000 0.000000 0.500000 0.000000 0.500000 
1.000000 0.500000 0.000000 -0.000000 0.500000 0.000000 0.500000 
1.000000 0.500000 -0.000000 0.000000 0.500000 0.000000 0.500000 
1.000000 0.500000 -0.000000 0.000000 0.500000 0.000000 0.500000 
...
...
1.000000 0.701893 -0.207027 0.032876 0.485446 0.071680 0.312660 
1.000000 0.765949 -0.189234 0.009855 0.426320 0.090064 0.307731 
1.000000 0.806349 -0.145439 -0.025084 0.374142 0.100883 0.319509 
1.000000 0.811200 -0.086784 -0.064337 0.341495 0.099023 0.347305 
1.000000 0.761521 -0.027021 -0.091308 0.344593 0.078665 0.393887 
1.000000 0.647051 0.010023 -0.077157 0.399438 0.040313 0.453511 
1.000000 0.534630 0.008728 -0.026470 0.472090 0.008183 0.493280 
1.000000 0.501636 0.000789 -0.001859 0.498337 0.000300 0.500027 
1.000000 0.500006 0.000005 -0.000012 0.499991 0.000001 0.500003