Commit 1a61d02abd994b1126db3ce3d6a007d035ee7bf9

Authored by tfmoraes
1 parent bdb92e42

ENH: Transforming dicom in images to show in import panel. Ticket #74

invesalius/gui/dicom_preview_panel.py
... ... @@ -274,8 +274,8 @@ class Preview(wx.Panel):
274 274 # Will it be white?
275 275 self.select_on = False
276 276 self._init_ui()
277   - self._init_vtk()
278   - self._bind_events()
  277 + #self._init_vtk()
  278 + #self._bind_events()
279 279  
280 280 def _init_ui(self):
281 281  
... ... @@ -285,7 +285,9 @@ class Preview(wx.Panel):
285 285 self.subtitle = wx.StaticText(self, -1, "Image",
286 286 style=wx.ALIGN_CENTER)
287 287  
288   - self.panel = wx.Panel(self, -1)
  288 + self.image_viewer = wx.StaticBitmap(self, -1)
  289 +
  290 + #self.panel = wx.Panel(self, -1)
289 291  
290 292 self.SetBackgroundColour((255,255,255))
291 293  
... ... @@ -295,7 +297,7 @@ class Preview(wx.Panel):
295 297 wx.GROW|wx.EXPAND|wx. ALIGN_CENTER_HORIZONTAL)
296 298 self.sizer.Add(self.subtitle, 1,
297 299 wx.GROW|wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL)
298   - self.sizer.Add(self.panel, 5, wx.GROW|wx.EXPAND|wx.ALL, 4)
  300 + self.sizer.Add(self.image_viewer, 5, wx.GROW|wx.EXPAND|wx.ALL, 4)
299 301 self.sizer.Fit(self)
300 302  
301 303  
... ... @@ -408,7 +410,7 @@ class Preview(wx.Panel):
408 410 def SetSubtitle(self, subtitle):
409 411 self.subtitle.SetLabel(subtitle)
410 412  
411   - def SetImage(self, image_file):
  413 + def SetDicomToPreview(self, image_file):
412 414 """
413 415 Set a Image to preview.
414 416 """
... ... @@ -424,31 +426,35 @@ class Preview(wx.Panel):
424 426 #image_reader.SetFileName(image_file[0])
425 427 #image = image_reader.GetOutput()
426 428  
427   - image = image_file[0]
428   -
429   - scale = image.GetScalarRange()
430   -
431   - cast = vtk.vtkImageMapToWindowLevelColors()
432   - #cast.SetShift(abs(scale[0]))
433   - #cast.SetScale(255.0/(scale[1] - scale[0]))
434   - #cast.ClampOverflowOn()
435   - cast.SetInput(image)
436   - #cast.SetOutputScalarTypeToUnsignedChar()
437   - try:
438   - window = float(image_file[1])
439   - level = float(image_file[2])
440   - except TypeError:
441   - #TODO: These values are good?
442   - level = 230
443   - window = 150
444   -
445   - self.data = image_file[-1]
446   -
447   - cast.SetWindow(window)
448   - cast.SetLevel(level)
449   - self.actor.SetInput(cast.GetOutput())
450   - self.render.ResetCamera()
451   - self.interactor.Render()
  429 + image = image_file[-1].image.jpeg_file
  430 + #img = wx.Image(image, wx.BITMAP_TYPE_JPEG)
  431 + #img.Rescale(70, 70)
  432 + #bmp = wx.BitmapFromImage(img)
  433 + self.image_viewer.SetBitmap(image)
  434 +
  435 + #scale = image.GetScalarRange()
  436 +
  437 + #cast = vtk.vtkImageMapToWindowLevelColors()
  438 + ##cast.SetShift(abs(scale[0]))
  439 + ##cast.SetScale(255.0/(scale[1] - scale[0]))
  440 + ##cast.ClampOverflowOn()
  441 + #cast.SetInput(image)
  442 + ##cast.SetOutputScalarTypeToUnsignedChar()
  443 + #try:
  444 + # window = float(image_file[1])
  445 + # level = float(image_file[2])
  446 + #except TypeError:
  447 + # #TODO: These values are good?
  448 + # level = 230
  449 + # window = 150
  450 +
  451 + #self.data = image_file[-1]
  452 +
  453 + #cast.SetWindow(window)
  454 + #cast.SetLevel(level)
  455 + #self.actor.SetInput(cast.GetOutput())
  456 + #self.render.ResetCamera()
  457 + #self.interactor.Render()
452 458  
453 459 def ShowShadow(self):
454 460 self._nImgSize = 16
... ... @@ -605,13 +611,14 @@ class DicomPreviewSeries(wx.Panel):
605 611 self.group_list = group_list
606 612 n = 0
607 613 for group in group_list:
608   - info = (group.dicom.image.imagedata,
  614 + info = (group.dicom.image,
609 615 float(group.dicom.image.window),
610 616 float(group.dicom.image.level),
611 617 group.title,
612 618 "%d Images" %(group.nslices),
613 619 n,
614   - group_list)
  620 + group_list,
  621 + group.dicom)
615 622 self.files.append(info)
616 623 n+=1
617 624  
... ... @@ -647,7 +654,7 @@ class DicomPreviewSeries(wx.Panel):
647 654  
648 655 for f, p in zip(self.files[initial:final], self.previews):
649 656 #print "f", f
650   - p.SetImage(f)
  657 + p.SetDicomToPreview(f)
651 658 #p.interactor.Render()
652 659  
653 660 for f, p in zip(self.files[initial:final], self.previews):
... ... @@ -751,12 +758,13 @@ class DicomPreview(wx.Panel):
751 758 dicom_files = group.GetHandSortedList()
752 759 n = 0
753 760 for dicom in dicom_files:
754   - info = (dicom.image.imagedata,
  761 + info = (dicom.image,
755 762 dicom.image.window,
756 763 dicom.image.level,
757 764 "Image %d" % (dicom.image.number),
758 765 "%.2f" % (dicom.image.position[2]),
759   - n)
  766 + n,
  767 + dicom)
760 768 self.files.append(info)
761 769 n+=1
762 770  
... ... @@ -793,7 +801,7 @@ class DicomPreview(wx.Panel):
793 801 self.nhidden_last_display = 0
794 802  
795 803 for f, p in zip(self.files[initial:final], self.previews):
796   - p.SetImage(f)
  804 + p.SetDicomToPreview(f)
797 805 #p.interactor.Render()
798 806  
799 807 for f, p in zip(self.files[initial:final], self.previews):
... ...
invesalius/reader/dicom.py
... ... @@ -17,7 +17,16 @@
17 17 # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais
18 18 # detalhes.
19 19 #---------------------------------------------------------------------
20   -from numpy.lib import type_check
  20 +import tempfile
  21 +import time
  22 +
  23 +import gdcm
  24 +import Image
  25 +import vtk
  26 +import vtkgdcm
  27 +import wx
  28 +
  29 +from vtk.util import numpy_support
21 30  
22 31 # In DICOM file format, if multiple values are present for the
23 32 # "Window Center" (Level) and "Window Width", both attributes
... ... @@ -68,10 +77,6 @@ INFO_KEYS = \
68 77 'StudyAdmittingDiagnosis',
69 78 ]
70 79  
71   -import vtkgdcm
72   -import gdcm
73   -import time
74   -
75 80 class Parser():
76 81 """
77 82 Medical image parser. Used to parse medical image tags.
... ... @@ -1796,6 +1801,8 @@ class Dicom(object):
1796 1801  
1797 1802  
1798 1803  
  1804 +
  1805 +
1799 1806 class Patient(object):
1800 1807 def __init__(self):
1801 1808 pass
... ... @@ -1833,7 +1840,7 @@ class Acquisition(object):
1833 1840 class Image(object):
1834 1841  
1835 1842 def __init__(self):
1836   - pass
  1843 + self._jpeg_file = None
1837 1844  
1838 1845 def SetParser(self, parser):
1839 1846 self.level = parser.GetImageWindowLevel()
... ... @@ -1867,5 +1874,38 @@ class Image(object):
1867 1874 spacing[1] = round(spacing[1],2)
1868 1875 spacing[2] = round(spacing[2],2)
1869 1876 self.spacing = spacing
  1877 +
  1878 + def SetTempDir(self, directory):
  1879 + self.directory = directory
1870 1880  
1871   -
  1881 + @property
  1882 + def jpeg_file(self):
  1883 + if self._jpeg_file:
  1884 + return self._jpeg_file
  1885 + else:
  1886 + self._jpeg_file = tempfile.mktemp(suffix='.jpeg', dir=self.directory)
  1887 +
  1888 + colorer = vtk.vtkImageMapToWindowLevelColors()
  1889 + colorer.SetInput(self.imagedata)
  1890 + colorer.SetWindow(float(self.window))
  1891 + colorer.SetLevel(float(self.level))
  1892 + colorer.SetOutputFormatToRGB()
  1893 + colorer.Update()
  1894 +
  1895 + width, height, z = colorer.GetOutput().GetDimensions()
  1896 +
  1897 + #jpeg_writer = vtk.vtkJPEGWriter()
  1898 + #jpeg_writer.SetInput(colorer.GetOutput())
  1899 + ##jpeg_writer.SetFileName(self._jpeg_file)
  1900 + #jpeg_writer.WriteToMemoryOn()
  1901 + #jpeg_writer.Write()
  1902 + ##jpeg_writer.Write()
  1903 +
  1904 + r = colorer.GetOutput().GetPointData().GetScalars()
  1905 + ni = numpy_support.vtk_to_numpy(r)
  1906 + #ni = ni.reshape(width, height, 3)
  1907 + print width, height, z,ni.shape
  1908 + img = wx.ImageFromBuffer(width, height, ni)
  1909 + img.Rescale(70, 70)
  1910 + self._jpeg_file = wx.BitmapFromImage(img)
  1911 + return self._jpeg_file
... ...