Commit 4893bc0acd48b6a8f880c2c5a877a27829e5becc

Authored by tfmoraes
1 parent 5ba88607

ENH: Rewritting the analyze reader using nipy

Showing 1 changed file with 39 additions and 63 deletions   Show diff stats
invesalius/reader/analyze_reader.py
... ... @@ -18,37 +18,55 @@
18 18 #--------------------------------------------------------------------------
19 19  
20 20 import os
21   -
22   -import itk
23 21 import multiprocessing
24 22 import tempfile
  23 +
25 24 import vtk
26 25  
  26 +from nipy.io.imageformats import AnalyzeHeader
27 27  
28 28 def ReadAnalyze(filename):
29   -
30   - pipe_in, pipe_out = multiprocessing.Pipe()
31   -
32   - sp = ItktoVtk(pipe_in, filename)
33   - sp.start()
34   -
35   - while 1:
36   - msg = pipe_out.recv()
37   - if(msg is None):
38   - break
39   -
40   - filename = pipe_out.recv()
41   -
42   - reader = vtk.vtkXMLImageDataReader()
43   - reader.SetFileName(filename)
  29 + print "Reading analyze file:", filename
  30 +
  31 + # Reading info from analyze header
  32 + header_file = open(filename)
  33 + header = AnalyzeHeader.from_fileobj(header_file)
  34 + xf, yf, zf = header.get_data_shape()[:3]
  35 + data_type = header.get_datatype()
  36 + pixel_spacing = header.get_zooms()[:3]
  37 +
  38 + # Mapping from numpy type to vtk type.
  39 + anlz_2_vtk_type = {
  40 + 'int16': 'SetDataScalarTypeToShort',
  41 + 'uint16': 'SetDataScalarTypeToUnsignedShort',
  42 + 'float32': 'SetDataScalarTypeToFloat'
  43 + }
  44 +
  45 + print header
  46 +
  47 + reader = vtk.vtkImageReader()
  48 + reader.SetFileName(filename[:-3] + 'img')
  49 +
  50 + # Setting the endiannes based on the analyze header.
  51 + if header.endianness == '<':
  52 + reader.SetDataByteOrderToLittleEndian()
  53 + elif header.endianness == '>':
  54 + reader.SetDataByteOrderToBigEndian()
  55 +
  56 + reader.SetFileDimensionality(3)
  57 + reader.SetDataExtent(0, xf-1, 0, yf-1, 0, zf-1)
  58 + reader.SetDataSpacing(pixel_spacing)
  59 + reader.SetHeaderSize(0)
  60 + # reader.SetTransform(transform)
  61 + getattr(reader, anlz_2_vtk_type[data_type])()
44 62 reader.Update()
45   -
46   - os.remove(filename)
47   -
  63 +
48 64 return reader.GetOutput()
49 65  
50 66 def ReadDirectory(dir_):
51   - file_list = []
  67 + """
  68 + Looking for analyze files in the given directory
  69 + """
52 70 imagedata = None
53 71 for root, sub_folders, files in os.walk(dir_):
54 72 for file in files:
... ... @@ -57,45 +75,3 @@ def ReadDirectory(dir_):
57 75 imagedata = ReadAnalyze(filename)
58 76 return imagedata
59 77 return imagedata
60   -
61   -
62   -class ItktoVtk(multiprocessing.Process):
63   -
64   - def __init__(self, pipe, filename):
65   - multiprocessing.Process.__init__(self)
66   - self.filename = filename
67   - self.pipe = pipe
68   -
69   - def run(self):
70   - self.Convert()
71   -
72   - def Convert(self):
73   -
74   - import ItkVtkGlue
75   -
76   - reader = itk.ImageFileReader.IUC3.New()
77   - reader.SetFileName(self.filename)
78   - reader.Update()
79   -
80   - x_spacing = reader.GetOutput().GetSpacing().GetElement(0)
81   - y_spacing = reader.GetOutput().GetSpacing().GetElement(1)
82   - z_spacing = reader.GetOutput().GetSpacing().GetElement(2)
83   - spacing = (x_spacing, y_spacing, z_spacing)
84   -
85   - glue = ItkVtkGlue.ImageToVTKImageFilter.IUC3.New()
86   - glue.SetInput(reader.GetOutput())
87   - glue.Update()
88   -
89   - imagedata = vtk.vtkImageData()
90   - imagedata.DeepCopy(glue.GetOutput())
91   - imagedata.SetSpacing(spacing)
92   -
93   - filename = tempfile.mktemp()
94   - writer = vtk.vtkXMLImageDataWriter()
95   - writer.SetInput(imagedata)
96   - writer.SetFileName(filename)
97   - writer.Write()
98   -
99   - self.pipe.send(None)
100   - self.pipe.send(filename)
101   -
102 78 \ No newline at end of file
... ...