有很多软件可以打开原始文件(我使用ImageJ),但是如何找到用于生成它的数据?
我需要找到存储在原始文件的每个体素中的值。
答案 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