Commit 1a61d02abd994b1126db3ce3d6a007d035ee7bf9
1 parent
bdb92e42
Exists in
master
and in
6 other branches
ENH: Transforming dicom in images to show in import panel. Ticket #74
Showing
2 changed files
with
91 additions
and
43 deletions
Show diff stats
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 | ... | ... |