def __init__(self, module_manager): # initialise our base class ModuleBase.__init__(self, module_manager) self._input_mmd = None self._output_mmd = MedicalMetaData() self._output_mmd.medical_image_properties = \ vtk.vtkMedicalImageProperties() self._output_mmd.direction_cosines = \ vtk.vtkMatrix4x4() # if the value (as it appears in mk.vtk_kit.constants.mipk) # appears in the dict, its value refers to the user supplied # value. when the user resets a field, that key is removed # from the dict self._config.new_value_dict = {} # this is the list of relevant properties self.mip_attr_l = \ module_kits.vtk_kit.constants.medical_image_properties_keywords # this will be used to keep track of changes made to the prop # grid before they are applied to the config self._grid_value_dict = {} self._view_frame = None self.sync_module_logic_with_config()
def img2dcm(self, input_img, output, img_type, img_number): if img_type == "jpg": print "JPG" image = vtk.vtkJPEGReader() image.SetFileName(input_img) image.Update() elif img_type == "tif": print "TIF" image = vtk.vtkTIFFReader() image.SetFileName(input_img) image.Update() elif img_type == "bmp": print "BMP" image = vtk.vtkBMPReader() image.SetFileName(input_img) image.Allow8BitBMPOn() image.Update() elif img_type == "png": print "PNG" image = vtk.vtkPNGReader() image.SetFileName(input_img) image.SetDataSpacing(self.spacing) image.Update() elif img_type == "vti": print "VTI" image = vtk.vtkXMLImageDataReader() image.SetFileName(input_img) image.Update() #if (orientation == 0): image_pos = img_number * self.spacing[2] image_localization = image_pos # print image_pos, img_number, image.GetOutput().GetScalarRange() img_clone = vtk.vtkImageData() img_clone.DeepCopy(image.GetOutput()) img_clone.SetSpacing(self.spacing) img_clone.Update() # v = vtk.vtkImageViewer() # v.SetInput(image.GetOutput()) # v.SetColorLevel(500) # v.SetColorWindow(240) # v.Render() # time.sleep(3) # a = vtk.vtkImageCast() # a.SetOutputScalarTypeToUnsignedChar() # a.SetInput(image.GetOutput()) # a.ClampOverflowOn() # a.Update() #b = vtk.vtkJPEGWriter() #b.SetFileName("C:\\teste.jpg") #b.SetInput(a.GetOutput()) #b.writer() #spacing = image.GetOutput().GetSpacing() #elif (orientation == 1): # image_pos[0] = image_pos[0] + thickness # image_localization = image_localization + thickness # img_number = img_number + 1 #elif (orientation == 2): # image_pos[1] = image_pos[1] + thickness # image_localization = image_localization + thickness # img_number = img_number + 1 pos = 0, 0, image_pos print pos # transform = vtk.vtkTransform() # transform.Translate(pos) # transform_filter = vtk.vtkImageReslice() # transform_filter.SetInput(image.GetOutput()) # transform_filter.SetResliceTransform(transform) # transform_filter.Update() properties = vtk.vtkMedicalImageProperties() properties.SetModality(self.modality) properties.SetInstitutionName(self.institution) properties.SetPatientName(self.patient) properties.SetSliceThickness(str(self.spacing[2])) properties.SetSeriesNumber(str(self.serie)) properties.SetImageNumber(str(img_number)) properties.SetPatientID(self.patient_id) properties.SetStudyID(self.study_id) properties.AddUserDefinedValue("Image Position (Patient)", "%.5f\\%.5f\\%.5f" % (pos[0], pos[1], pos[2])) properties.AddUserDefinedValue("Instance Number", str(img_number)) print str(img_number), properties.GetNumberOfUserDefinedValues() writer = vtkgdcm.vtkGDCMImageWriter() writer.SetInput(img_clone) writer.SetStudyUID(self.study_uid) writer.SetSeriesUID(self.series_uid) writer.SetMedicalImageProperties(properties) writer.SetFileName(output) # writer.SetImageFormat(vtk.VTK_LUMINANCE) writer.SetFileDimensionality(3) writer.Write() reader = gdcm.Reader() reader.SetFileName(output) reader.Read() anon = gdcm.Anonymizer() anon.SetFile(reader.GetFile()) anon.Replace(gdcm.Tag(0x0020, 0x0013), str(img_number)) anon.Replace(gdcm.Tag(0x0028, 0x0030), "%.6f\\%.6f" % (self.spacing[0], self.spacing[1])) writer = gdcm.Writer() writer.SetFile(reader.GetFile()) writer.SetFileName(output) writer.Write() # print spacing, pos, image.GetOutput().GetScalarRange() # writer = ivDicom.DicomWriter() # writer.SetFileName(output) # writer.SaveIsNew(image.GetOutput()) # # writer.SetAcquisitionModality(self.modality) # writer.SetInstitutionName(self.institution) # writer.SetStudyID(self.study_uid) # writer.SetPatientID(self.patient_id) # writer.SetPatientName(self.patient) # writer.SetImageThickness(self.spacing[2]) # writer.SetImageSeriesNumber(self.serie) # writer.SetImageNumber(img_number) # writer.SetImagePosition(pos) # writer.SetImageLocation(image_localization) # writer.SetPixelSpacing(self.spacing[:2]) # writer.Save() print "Written", input_img, "->", output
def execute_module(self): if self._config.output_mode == 0: # slice-per-file mode if not os.path.isdir(self._config.output_directory): raise RuntimeError('Please specify a valid output directory.') # generate filenamelist with as many entries as there are # z-slices self._input_data.UpdateInformation() # shouldn't be nec. z_len = self._input_data.GetDimensions()[2] odir = self._config.output_directory fn_list = [ os.path.join(odir, 'im%05d.dcm' % (i, )) for i in range(1, z_len + 1) ] fn_sa = vtk.vtkStringArray() [fn_sa.InsertNextValue(fn) for fn in fn_list] self._writer.SetFileNames(fn_sa) self._writer.SetFileDimensionality(2) else: # output_mode == 1, multi-slices per file if not self._config.output_filename: raise RuntimeError('Please specify an output filename.') self._writer.SetFileName(self._config.output_filename) self._writer.SetFileDimensionality(3) # now setup the common stuff mip = vtk.vtkMedicalImageProperties() try: mip.DeepCopy(self._input_metadata.medical_image_properties) except AttributeError: # this simply means that we have no input metadata pass self._writer.SetMedicalImageProperties(mip) try: self._writer.SetDirectionCosines( self._input_metadata.direction_cosines) except AttributeError: # we have no input metadata, set the default # identity matrix m = vtk.vtkMatrix4x4() self._writer.SetDirectionCosines(m) if self._config.cast_to_short: self._caster.SetInput(self._input_data) # if we don't call this update, it crashes on Windows with # GDCM 2.0.5, and everything else shortly before DeVIDE # 8.5. The crash is inside the vtkGDCMImageWriter. self._caster.Update() self._writer.SetInput(self._caster.GetOutput()) else: # just to be sure self._caster.SetInput(None) self._writer.SetInput(self._input_data) self._writer.Write()
def execute_module(self): if self._config.output_mode == 0: # slice-per-file mode if not os.path.isdir(self._config.output_directory): raise RuntimeError( 'Please specify a valid output directory.') # generate filenamelist with as many entries as there are # z-slices self._input_data.UpdateInformation() # shouldn't be nec. z_len = self._input_data.GetDimensions()[2] odir = self._config.output_directory fn_list = [os.path.join(odir,'im%05d.dcm' % (i,)) for i in range(1, z_len+1)] fn_sa = vtk.vtkStringArray() [fn_sa.InsertNextValue(fn) for fn in fn_list] self._writer.SetFileNames(fn_sa) self._writer.SetFileDimensionality(2) else: # output_mode == 1, multi-slices per file if not self._config.output_filename: raise RuntimeError( 'Please specify an output filename.') self._writer.SetFileName(self._config.output_filename) self._writer.SetFileDimensionality(3) # now setup the common stuff mip = vtk.vtkMedicalImageProperties() try: mip.DeepCopy(self._input_metadata.medical_image_properties) except AttributeError: # this simply means that we have no input metadata pass self._writer.SetMedicalImageProperties(mip) try: self._writer.SetDirectionCosines( self._input_metadata.direction_cosines) except AttributeError: # we have no input metadata, set the default # identity matrix m = vtk.vtkMatrix4x4() self._writer.SetDirectionCosines(m) if self._config.cast_to_short: self._caster.SetInput(self._input_data) # if we don't call this update, it crashes on Windows with # GDCM 2.0.5, and everything else shortly before DeVIDE # 8.5. The crash is inside the vtkGDCMImageWriter. self._caster.Update() self._writer.SetInput(self._caster.GetOutput()) else: # just to be sure self._caster.SetInput(None) self._writer.SetInput(self._input_data) self._writer.Write()