Commit 4893bc0acd48b6a8f880c2c5a877a27829e5becc
1 parent
5ba88607
Exists in
master
and in
68 other branches
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 | ... | ... |