def __init__(self, module_manager): SimpleVTKClassModuleBase.__init__( self, module_manager, vtk.vtkImageLogarithmicScale(), 'Processing.', ('vtkImageData',), ('vtkImageData',), replaceDoc=True, inputFunctions=None, outputFunctions=None)
def fft(self, mode='magnitude', logscale=12, center=True): """Fast Fourier transform of a picture. :param float logscale: if non-zero, take the logarithm of the intensity and scale it by this factor. :param str mode: either [magnitude, real, imaginary, complex], compute the point array data accordingly. :param bool center: shift constant zero-frequency to the center of the image for display. (FFT converts spatial images into frequency space, but puts the zero frequency at the origin) """ ffti = vtk.vtkImageFFT() ffti.SetInputData(self._data) ffti.Update() if 'mag' in mode: mag = vtk.vtkImageMagnitude() mag.SetInputData(ffti.GetOutput()) mag.Update() out = mag.GetOutput() elif 'real' in mode: extractRealFilter = vtk.vtkImageExtractComponents() extractRealFilter.SetInputData(ffti.GetOutput()) extractRealFilter.SetComponents(0) extractRealFilter.Update() out = extractRealFilter.GetOutput() elif 'imaginary' in mode: extractImgFilter = vtk.vtkImageExtractComponents() extractImgFilter.SetInputData(ffti.GetOutput()) extractImgFilter.SetComponents(1) extractImgFilter.Update() out = extractImgFilter.GetOutput() elif 'complex' in mode: out = ffti.GetOutput() else: colors.printc("Error in fft(): unknown mode", mode) raise RuntimeError() if center: center = vtk.vtkImageFourierCenter() center.SetInputData(out) center.Update() out = center.GetOutput() if 'complex' not in mode: if logscale: ils = vtk.vtkImageLogarithmicScale() ils.SetInputData(out) ils.SetConstant(logscale) ils.Update() out = ils.GetOutput() return Picture(out)
def main(): # Initialize argument and constant variables parser = ArgumentParser("Create isosurfacing of object") parser.add_argument("infections") parser.add_argument("recovered") parser.add_argument("deaths") parser.add_argument("density") parser.add_argument("climate_max") parser.add_argument("climate_min") parser.add_argument("location") parser.add_argument("migration") parser.add_argument("sat") parser.add_argument("--camera", type=str, help="Optional camera settings file") args = parser.parse_args() global sat_x global sat_y global max_cases global max_radius global infections_color global recovered_color global deaths_color global infections_opacity global recovered_opacity global deaths_opacity global infections_data global recovered_data global deaths_data global legend_circle_actors global legend_text_actors global max_weight global ren app = QApplication([]) window = QMainWindow() ui = Ui_MainWindow() ui.setupUi(window) # Read in data for global confirmed cases with open(args.infections) as csvDataFile: csv_reader = csv.reader(csvDataFile) for row in csv_reader: # We do not need country/province name, so we remove the first two columns if (row[2] != 0 or row[3] != 0): infections_data.append(row[2:]) infections_data = infections_data[1:] # Read in data for global deaths with open(args.deaths) as csvDataFile: csv_reader = csv.reader(csvDataFile) for row in csv_reader: if (row[2] != 0 or row[3] != 0): deaths_data.append(row[2:]) deaths_data = deaths_data[1:] # Read in data for global recovered cases with open(args.recovered) as csvDataFile: csv_reader = csv.reader(csvDataFile) for row in csv_reader: if (row[2] != 0 or row[3] != 0): recovered_data.append(row[2:]) recovered_data = recovered_data[1:] numDates = len(infections_data[0]) - 3 max_cases = compute_max(date) # Create reader for density file density_reader = vtk.vtkTIFFReader() density_reader.SetFileName(args.density) density_reader.Update() density_log = vtk.vtkImageLogarithmicScale() density_log.SetInputConnection(density_reader.GetOutputPort()) density_log.SetConstant(0.435) density_log.Update() density_range = density_log.GetOutput().GetScalarRange() climate_max_reader = vtk.vtkTIFFReader() climate_max_reader.SetFileName(args.climate_max + "-" + str(initial_date.month.real).zfill(2) + ".tif") climate_max_reader.Update() climate_max_range = [-40, 45] climate_min_reader = vtk.vtkTIFFReader() climate_min_reader.SetFileName(args.climate_min + "-" + str(initial_date.month.real).zfill(2) + ".tif") climate_min_reader.Update() climate_min_range = [-50, 30] sat_reader = vtk.vtkJPEGReader() sat_reader.SetFileName(args.sat) sat_reader.Update() sat_dimensions = sat_reader.GetOutput().GetDimensions() sat_x = sat_dimensions[0] sat_y = sat_dimensions[1] # Read in data for migration location_map = create_long_lat(args.location) migrations = [] for filename in os.listdir(args.migration): if filename.endswith(".csv"): with open(args.migration + "\\" + filename) as csvDataFile: country = filename.split(".")[0] if country not in location_map: continue loc_dst = location_map[country] csv_reader = csv.reader(csvDataFile) for row in csv_reader: if row[2] not in location_map: continue loc_src = location_map[row[2]] try: migrations.append( add_migration_info(loc_src, loc_dst, int(row[9]))) except ValueError: continue line_actors = process_migration_actors(migrations) # Create a plane to map the satellite image onto plane = vtk.vtkPlaneSource() plane.SetCenter(0.0, 0.0, 0.0) plane.SetNormal(0.0, 0.0, 1.0) plane.SetPoint1(sat_x, 0, 0) plane.SetPoint2(0, sat_y, 0) # Create satellite image texture texture = vtk.vtkTexture() texture.SetInputConnection(sat_reader.GetOutputPort()) # Map satellite texture to plane texturePlane = vtk.vtkTextureMapToPlane() texturePlane.SetInputConnection(plane.GetOutputPort()) max_val = 100 color_count = 1000 density_ctf = vtk.vtkColorTransferFunction() density_ctf.AddRGBPoint(0, 0, 0, 0) density_ctf.AddRGBPoint(10, 0, 0, 1) density_ctf.AddRGBPoint(30, 0, 1, 1) density_ctf.AddRGBPoint(50, 1, 1, 0) density_ctf.AddRGBPoint(65, 1, 0.5, 0) density_ctf.AddRGBPoint(80, 1, 0, 0) density_lut = vtk.vtkLookupTable() density_lut.SetNumberOfTableValues(color_count) density_lut.Build() rgb = list(density_ctf.GetColor(0)) + [0] density_lut.SetTableValue(0, rgb) for i in range(1, color_count): rgb = list(density_ctf.GetColor( max_val * float(i) / color_count)) + [1] density_lut.SetTableValue(i, rgb) climate_ctf = vtk.vtkColorTransferFunction() climate_ctf.AddRGBPoint(5, 0, 0, 1) climate_ctf.AddRGBPoint(35, 0, 1, 1) climate_ctf.AddRGBPoint(65, 1, 1, 0) climate_ctf.AddRGBPoint(95, 1, 0, 0) climate_lut = vtk.vtkLookupTable() climate_lut.SetNumberOfTableValues(color_count) climate_lut.Build() for i in range(0, color_count): rgb = list(climate_ctf.GetColor( max_val * float(i) / color_count)) + [1] climate_lut.SetTableValue(i, rgb) # Create mappers density_mapper = vtk.vtkDataSetMapper() density_mapper.SetInputConnection(density_log.GetOutputPort()) density_mapper.SetLookupTable(density_lut) density_mapper.SetScalarRange([0, density_range[1]]) density_mapper.Update() climate_max_mapper = vtk.vtkDataSetMapper() climate_max_mapper.SetInputConnection(climate_max_reader.GetOutputPort()) climate_max_mapper.SetLookupTable(climate_lut) climate_max_mapper.SetScalarRange(climate_max_range) climate_max_mapper.Update() climate_min_mapper = vtk.vtkDataSetMapper() climate_min_mapper.SetInputConnection(climate_min_reader.GetOutputPort()) climate_min_mapper.SetLookupTable(climate_lut) climate_min_mapper.SetScalarRange(climate_min_range) climate_min_mapper.Update() sat_mapper = vtk.vtkPolyDataMapper() sat_mapper.SetInputConnection(texturePlane.GetOutputPort()) density_actor = vtk.vtkActor() density_actor.SetMapper(density_mapper) density_actor.GetProperty().SetOpacity(0.99) density_actor.VisibilityOn() climate_max_actor = vtk.vtkActor() climate_max_actor.SetMapper(climate_max_mapper) climate_max_actor.GetProperty().SetOpacity(0.6) climate_max_actor.VisibilityOff() climate_min_actor = vtk.vtkActor() climate_min_actor.SetMapper(climate_min_mapper) climate_min_actor.GetProperty().SetOpacity(0.6) climate_min_actor.VisibilityOff() sat_actor = vtk.vtkActor() sat_actor.SetMapper(sat_mapper) sat_actor.SetTexture(texture) sat_actor.GetProperty().SetOpacity(0.6) # Make satellite image same size as contour map crange = sat_actor.GetXRange()[0] - sat_actor.GetXRange()[1] mrange = density_actor.GetXRange()[0] - density_actor.GetXRange()[1] density_actor.SetScale(crange / mrange) crange = sat_actor.GetXRange()[0] - sat_actor.GetXRange()[1] mrange = climate_max_actor.GetXRange()[0] - climate_max_actor.GetXRange( )[1] climate_max_actor.SetScale(crange / mrange) climate_min_actor.SetScale(crange / mrange) # Initialize renderer and place actors ren = vtk.vtkRenderer() ren.AddActor(density_actor) ren.AddActor(climate_max_actor) ren.AddActor(climate_min_actor) # Add legend actors add_legend_actors() # Add infections, recovered, and deaths actors infections_actors = [] if (ui.infections_check.isChecked()): add_case_actors(date, infections_data, infections_actors, infections_color, infections_opacity) recovered_actors = [] if (ui.recovered_check.isChecked()): add_case_actors(date, recovered_data, recovered_actors, recovered_color, recovered_opacity) deaths_actors = [] if (ui.deaths_check.isChecked()): add_case_actors(date, deaths_data, deaths_actors, deaths_color, deaths_opacity) for line_actor in line_actors: line_actor.VisibilityOn() ren.AddActor(line_actor) ren.AddActor(sat_actor) ren.ResetCamera() ren.SetBackground(0, 0, 0) # Initialize camera settings cam1 = ren.GetActiveCamera() cam1.Azimuth(0) cam1.Elevation(0) cam1.Roll(360) cam1.Zoom(1.5) ren.ResetCameraClippingRange() if args.camera: reader = open(args.camera, "r") line = reader.readline().split(",") cam1.SetPosition(float(line[0]), float(line[1]), float(line[2])) line = reader.readline().split(",") cam1.SetFocalPoint(float(line[0]), float(line[1]), float(line[2])) line = reader.readline().split(",") cam1.SetViewUp(float(line[0]), float(line[1]), float(line[2])) line = reader.readline().split(",") cam1.SetClippingRange(float(line[0]), float(line[1])) line = reader.readline().split(",") cam1.SetViewAngle(float(line[0])) line = reader.readline().split(",") cam1.SetParallelScale(float(line[0])) # Initialize PyQT5 UI and link to renderer ui.vtkWidget.GetRenderWindow().AddRenderer(ren) ui.vtkWidget.GetRenderWindow().SetSize(1280, 720) ui.vtkWidget.GetRenderWindow().AddRenderer(ren) ui.vtkWidget.GetRenderWindow().SetAlphaBitPlanes(True) ui.vtkWidget.GetRenderWindow().SetMultiSamples(False) iren = ui.vtkWidget.GetRenderWindow().GetInteractor() # create the scalar_bar density_scalar_bar = vtk.vtkScalarBarActor() density_scalar_bar.SetOrientationToHorizontal() density_scalar_bar.SetMaximumNumberOfColors(color_count) density_scalar_bar.SetLookupTable(density_lut) density_scalar_bar.SetTitle("Density (Log 10)") # create the scalar_bar_widget density_scalar_bar_widget = vtk.vtkScalarBarWidget() density_scalar_bar_widget.SetInteractor(iren) density_scalar_bar_widget.SetScalarBarActor(density_scalar_bar) density_scalar_bar_widget.On() # create the scalar_bar climate_scalar_bar = vtk.vtkScalarBarActor() climate_scalar_bar.SetOrientationToHorizontal() climate_scalar_bar.SetMaximumNumberOfColors(color_count) climate_scalar_bar.SetLookupTable(climate_lut) climate_scalar_bar.SetTitle("Temparature (Celsius)") # create the scalar_bar_widget climate_scalar_bar_widget = vtk.vtkScalarBarWidget() climate_scalar_bar_widget.SetInteractor(iren) climate_scalar_bar_widget.SetScalarBarActor(climate_scalar_bar) climate_scalar_bar_widget.Off() # Function to initialize slider settings def slider_setup(slider, val, bounds, interv): slider.setOrientation(QtCore.Qt.Horizontal) slider.setValue(float(val)) slider.setSliderPosition(val) slider.setTracking(False) slider.setTickInterval(interv) slider.setTickPosition(QSlider.TicksAbove) slider.setRange(bounds[0], bounds[1]) slider_setup(ui.time_slider, 0, [0, numDates], 1) window.show() window.setWindowState(Qt.WindowMaximized) iren.Initialize() def time_slider_callback(val): global max_cases global date date = val new_date = initial_date + timedelta(val) if new_date.month.real != ui.curr_month: ui.curr_month = new_date.month.real climate_max_reader.SetFileName(args.climate_max + "-" + str(ui.curr_month).zfill(2) + ".tif") climate_max_reader.Update() climate_min_reader.SetFileName(args.climate_min + "-" + str(ui.curr_month).zfill(2) + ".tif") climate_min_reader.Update() ui.date_label.setText("Date (" + new_date.strftime('%m/%d/%Y') + "):") # Remove old infections, recovered, and deaths actors remove_case_actors(infections_actors) remove_case_actors(recovered_actors) remove_case_actors(deaths_actors) remove_legend_actors() # Recompute max cases max_cases = compute_max(date) # Add infections, recovered, and deaths actors if (ui.infections_check.isChecked()): add_case_actors(date, infections_data, infections_actors, infections_color, infections_opacity) if (ui.recovered_check.isChecked()): add_case_actors(date, recovered_data, recovered_actors, recovered_color, recovered_opacity) if (ui.deaths_check.isChecked()): add_case_actors(date, deaths_data, deaths_actors, deaths_color, deaths_opacity) add_legend_actors() ui.vtkWidget.GetRenderWindow().Render() def infections_callback(): if (ui.infections_check.isChecked()): add_case_actors(date, infections_data, infections_actors, infections_color, infections_opacity) else: remove_case_actors(infections_actors) ui.vtkWidget.GetRenderWindow().Render() def recovered_callback(): if (ui.recovered_check.isChecked()): add_case_actors(date, recovered_data, recovered_actors, recovered_color, recovered_opacity) else: remove_case_actors(recovered_actors) ui.vtkWidget.GetRenderWindow().Render() def deaths_callback(): if (ui.deaths_check.isChecked()): add_case_actors(date, deaths_data, deaths_actors, deaths_color, deaths_opacity) else: remove_case_actors(deaths_actors) ui.vtkWidget.GetRenderWindow().Render() def density_callback(): if ui.density_check.isChecked(): ui.climate_max_check.setChecked(False) ui.climate_min_check.setChecked(False) density_actor.VisibilityOn() density_scalar_bar_widget.On() ui.vtkWidget.GetRenderWindow().Render() else: density_actor.VisibilityOff() density_scalar_bar_widget.Off() ui.vtkWidget.GetRenderWindow().Render() def climate_max_callback(): if ui.climate_max_check.isChecked(): ui.density_check.setChecked(False) ui.climate_min_check.setChecked(False) climate_max_actor.VisibilityOn() climate_scalar_bar_widget.On() ui.vtkWidget.GetRenderWindow().Render() else: climate_max_actor.VisibilityOff() climate_scalar_bar_widget.Off() ui.vtkWidget.GetRenderWindow().Render() def climate_min_callback(): if ui.climate_min_check.isChecked(): ui.density_check.setChecked(False) ui.climate_max_check.setChecked(False) climate_min_actor.VisibilityOn() climate_scalar_bar_widget.On() ui.vtkWidget.GetRenderWindow().Render() else: climate_min_actor.VisibilityOff() climate_scalar_bar_widget.Off() ui.vtkWidget.GetRenderWindow().Render() def migration_callback(): if ui.migration_check.isChecked(): for line_actor in line_actors: line_actor.VisibilityOn() ui.vtkWidget.GetRenderWindow().Render() else: for line_actor in line_actors: line_actor.VisibilityOff() ui.vtkWidget.GetRenderWindow().Render() # Handle screenshot button event def screenshot_callback(): save_frame(ren.GetActiveCamera(), ui.vtkWidget.GetRenderWindow(), ui.log) # Handle show camera settings button event def camera_callback(): print_camera_settings(ren.GetActiveCamera(), ui.camera_info, ui.log) # Handle quit button event def quit_callback(): sys.exit() # Register callbacks to UI ui.time_slider.valueChanged.connect(time_slider_callback) ui.push_screenshot.clicked.connect(screenshot_callback) ui.push_camera.clicked.connect(camera_callback) ui.push_quit.clicked.connect(quit_callback) ui.infections_check.stateChanged.connect(infections_callback) ui.recovered_check.stateChanged.connect(recovered_callback) ui.deaths_check.stateChanged.connect(deaths_callback) ui.density_check.stateChanged.connect(density_callback) ui.climate_max_check.stateChanged.connect(climate_max_callback) ui.climate_min_check.stateChanged.connect(climate_min_callback) ui.migration_check.stateChanged.connect(migration_callback) # Terminate setup for PyQT5 interface sys.exit(app.exec_())
#!/usr/bin/env python import vtk from vtk.test import Testing from vtk.util.misc import vtkGetDataRoot VTK_DATA_ROOT = vtkGetDataRoot() # This scripts shows a compressed spectrum of an image. # Image pipeline reader = vtk.vtkPNGReader() reader.SetFileName("" + str(VTK_DATA_ROOT) + "/Data/fullhead15.png") fft = vtk.vtkImageFFT() fft.SetInputConnection(reader.GetOutputPort()) fft.ReleaseDataFlagOff() #fft DebugOn magnitude = vtk.vtkImageMagnitude() magnitude.SetInputConnection(fft.GetOutputPort()) magnitude.ReleaseDataFlagOff() center = vtk.vtkImageFourierCenter() center.SetInputConnection(magnitude.GetOutputPort()) compress = vtk.vtkImageLogarithmicScale() compress.SetInputConnection(center.GetOutputPort()) compress.SetConstant(15) viewer = vtk.vtkImageViewer2() viewer.SetInputConnection(compress.GetOutputPort()) viewer.SetColorWindow(150) viewer.SetColorLevel(170) viewInt = vtk.vtkRenderWindowInteractor() viewer.SetupInteractor(viewInt) viewer.Render() # --- end of script --
def main(): colors = vtk.vtkNamedColors() fileName = get_program_parameters() # Read the image. readerFactory = vtk.vtkImageReader2Factory() reader = readerFactory.CreateImageReader2(fileName) reader.SetFileName(fileName) reader.Update() fft = vtk.vtkImageFFT() fft.SetInputConnection(reader.GetOutputPort()) mag = vtk.vtkImageMagnitude() mag.SetInputConnection(fft.GetOutputPort()) center = vtk.vtkImageFourierCenter() center.SetInputConnection(mag.GetOutputPort()) compress = vtk.vtkImageLogarithmicScale() compress.SetInputConnection(center.GetOutputPort()) compress.SetConstant(15) compress.Update() # Create the actors. originalActor = vtk.vtkImageActor() originalActor.GetMapper().SetInputConnection(reader.GetOutputPort()) originalActor.GetProperty().SetInterpolationTypeToNearest() compressedActor = vtk.vtkImageActor() compressedActor.GetMapper().SetInputConnection(compress.GetOutputPort()) compressedActor.GetProperty().SetInterpolationTypeToNearest() CreateImageActor(compressedActor, 160, 120) # Define the viewport ranges. # (xmin, ymin, xmax, ymax) originalViewport = [0.0, 0.0, 0.5, 1.0] compressedViewport = [0.5, 0.0, 1.0, 1.0] # Setup the renderers. originalRenderer = vtk.vtkRenderer() originalRenderer.SetViewport(originalViewport) originalRenderer.AddActor(originalActor) originalRenderer.ResetCamera() originalRenderer.SetBackground(colors.GetColor3d("SlateGray")) compressedRenderer = vtk.vtkRenderer() compressedRenderer.SetViewport(compressedViewport) compressedRenderer.AddActor(compressedActor) compressedRenderer.ResetCamera() compressedRenderer.SetBackground(colors.GetColor3d("LightSlateGray")) renderWindow = vtk.vtkRenderWindow() renderWindow.SetSize(600, 300) renderWindow.SetWindowName('VTKSpectrum') renderWindow.AddRenderer(originalRenderer) renderWindow.AddRenderer(compressedRenderer) renderWindowInteractor = vtk.vtkRenderWindowInteractor() style = vtk.vtkInteractorStyleImage() renderWindowInteractor.SetInteractorStyle(style) renderWindowInteractor.SetRenderWindow(renderWindow) renderWindowInteractor.Initialize() renderWindowInteractor.Start()
def scatterPlot(imagedata1, imagedata2, z, countVoxels=True, wholeVolume=True, logarithmic=True, bitDepth=8): """ Create scatterplot """ imagedata1.SetUpdateExtent(imagedata1.GetWholeExtent()) imagedata2.SetUpdateExtent(imagedata1.GetWholeExtent()) imagedata1.Update() imagedata2.Update() range1 = imagedata1.GetScalarRange() range2 = imagedata2.GetScalarRange() n = 255 # n = min(max(sc1max,sc2max),255) # d = (n+1) / float(2**bitDepth) if bitDepth is None: spacing1 = float(abs(range1[1] - range1[0])) / (n + 1) spacing2 = float(abs(range2[1] - range2[0])) / (n + 1) else: spacing1 = float(2 ** bitDepth) / (n + 1) spacing2 = float(2 ** bitDepth) / (n + 1) app = vtk.vtkImageAppendComponents() app.AddInput(imagedata1) app.AddInput(imagedata2) # shiftscale = vtk.vtkImageShiftScale() # shiftscale.SetOutputScalarTypeToUnsignedChar() # shiftscale.SetScale(d) # shiftscale.SetInputConnection(app.GetOutputPort()) acc = vtk.vtkImageAccumulate() acc.SetComponentExtent(0, n, 0, n, 0, 0) acc.SetComponentOrigin(range1[0], range2[0], 0) acc.SetComponentSpacing(spacing1, spacing2, 0) # acc.SetInputConnection(shiftscale.GetOutputPort()) acc.SetInputConnection(app.GetOutputPort()) acc.Update() data = acc.GetOutput() origData = data originalRange = data.GetScalarRange() if logarithmic: Logging.info("Scaling scatterplot logarithmically", kw="imageop") logscale = vtk.vtkImageLogarithmicScale() logscale.SetInputConnection(acc.GetOutputPort()) logscale.Update() data = logscale.GetOutput() x0, x1 = data.GetScalarRange() if countVoxels: Logging.info("Scalar range of scatterplot = ", x0, x1, kw="imageop") ctf = fire(x0, x1) ctf = equalize(data, ctf, x1) maptocolor = vtk.vtkImageMapToColors() maptocolor.SetInputConnection(data.GetProducerPort()) maptocolor.SetLookupTable(ctf) maptocolor.SetOutputFormatToRGB() maptocolor.Update() data = maptocolor.GetOutput() ctf.originalRange = originalRange Logging.info("Scatterplot has dimensions: ", data.GetDimensions(), data.GetExtent(), kw="imageop") data.SetWholeExtent(data.GetExtent()) img = vtkImageDataToWxImage(data) # w, h = img.GetWidth(), img.GetHeight() # if w < 255 or h < 255: # dh = 255-h # img.Resize((255, 255),(0, 0), 0,0,0) return img, ctf, origData
def scatterPlot(imagedata1, imagedata2, z, countVoxels=True, wholeVolume=True, logarithmic=True, bitDepth=8): """ Create scatterplot """ imagedata1.SetUpdateExtent(imagedata1.GetWholeExtent()) imagedata2.SetUpdateExtent(imagedata1.GetWholeExtent()) imagedata1.Update() imagedata2.Update() range1 = imagedata1.GetScalarRange() range2 = imagedata2.GetScalarRange() n = 255 #n = min(max(sc1max,sc2max),255) #d = (n+1) / float(2**bitDepth) if bitDepth is None: spacing1 = float(abs(range1[1] - range1[0])) / (n + 1) spacing2 = float(abs(range2[1] - range2[0])) / (n + 1) else: spacing1 = float(2**bitDepth) / (n + 1) spacing2 = float(2**bitDepth) / (n + 1) app = vtk.vtkImageAppendComponents() app.AddInput(imagedata1) app.AddInput(imagedata2) #shiftscale = vtk.vtkImageShiftScale() #shiftscale.SetOutputScalarTypeToUnsignedChar() #shiftscale.SetScale(d) #shiftscale.SetInputConnection(app.GetOutputPort()) acc = vtk.vtkImageAccumulate() acc.SetComponentExtent(0, n, 0, n, 0, 0) acc.SetComponentOrigin(range1[0], range2[0], 0) acc.SetComponentSpacing(spacing1, spacing2, 0) #acc.SetInputConnection(shiftscale.GetOutputPort()) acc.SetInputConnection(app.GetOutputPort()) acc.Update() data = acc.GetOutput() origData = data originalRange = data.GetScalarRange() if logarithmic: Logging.info("Scaling scatterplot logarithmically", kw="imageop") logscale = vtk.vtkImageLogarithmicScale() logscale.SetInputConnection(acc.GetOutputPort()) logscale.Update() data = logscale.GetOutput() x0, x1 = data.GetScalarRange() if countVoxels: Logging.info("Scalar range of scatterplot = ", x0, x1, kw="imageop") ctf = fire(x0, x1) ctf = equalize(data, ctf, x1) maptocolor = vtk.vtkImageMapToColors() maptocolor.SetInputConnection(data.GetProducerPort()) maptocolor.SetLookupTable(ctf) maptocolor.SetOutputFormatToRGB() maptocolor.Update() data = maptocolor.GetOutput() ctf.originalRange = originalRange Logging.info("Scatterplot has dimensions: ", data.GetDimensions(), data.GetExtent(), kw="imageop") data.SetWholeExtent(data.GetExtent()) img = vtkImageDataToWxImage(data) #w, h = img.GetWidth(), img.GetHeight() #if w < 255 or h < 255: # dh = 255-h # img.Resize((255, 255),(0, 0), 0,0,0) return img, ctf, origData
def main(): # Initialize argument and constant variables parser = ArgumentParser("Create isosurfacing of object") parser.add_argument("density") parser.add_argument("climate") parser.add_argument("sat") parser.add_argument("--camera", type=str, help="Optional camera settings file") args = parser.parse_args() # Create reader for ct scan density_reader = vtk.vtkTIFFReader() density_reader.SetFileName(args.density) density_reader.Update() print(density_reader.GetOutput().GetScalarRange()[1]) density_log = vtk.vtkImageLogarithmicScale() density_log.SetInputConnection(density_reader.GetOutputPort()) density_log.SetConstant(0.435) density_log.Update() density_range = density_log.GetOutput().GetScalarRange() climate_reader = vtk.vtkTIFFReader() climate_reader.SetFileName(args.climate + "-" + str(initial_date.month.real).zfill(2) + ".tif") climate_reader.Update() climate_range = climate_reader.GetOutput().GetScalarRange() sat_reader = vtk.vtkJPEGReader() sat_reader.SetFileName(args.sat) max_val = 100 color_count = 1000 density_ctf = vtk.vtkColorTransferFunction() density_ctf.AddRGBPoint(0, 0, 0, 0) density_ctf.AddRGBPoint(10, 0, 0, 1) density_ctf.AddRGBPoint(30, 0, 1, 1) density_ctf.AddRGBPoint(50, 1, 1, 0) density_ctf.AddRGBPoint(65, 1, 0.5, 0) density_ctf.AddRGBPoint(80, 1, 0, 0) density_lut = vtk.vtkLookupTable() density_lut.SetNumberOfTableValues(color_count) density_lut.Build() rgb = list(density_ctf.GetColor(0)) + [0] density_lut.SetTableValue(0, rgb) for i in range(1, color_count): rgb = list(density_ctf.GetColor( max_val * float(i) / color_count)) + [1] density_lut.SetTableValue(i, rgb) climate_ctf = vtk.vtkColorTransferFunction() climate_ctf.AddRGBPoint(5, 0, 0, 1) climate_ctf.AddRGBPoint(35, 0, 1, 1) climate_ctf.AddRGBPoint(65, 1, 1, 0) climate_ctf.AddRGBPoint(95, 1, 0, 0) climate_lut = vtk.vtkLookupTable() climate_lut.SetNumberOfTableValues(color_count) climate_lut.Build() for i in range(0, color_count): rgb = list(climate_ctf.GetColor( max_val * float(i) / color_count)) + [1] climate_lut.SetTableValue(i, rgb) density_mapper = vtk.vtkDataSetMapper() density_mapper.SetInputConnection(density_log.GetOutputPort()) density_mapper.SetLookupTable(density_lut) density_mapper.SetScalarRange([0, density_range[1]]) density_mapper.Update() climate_mapper = vtk.vtkDataSetMapper() climate_mapper.SetInputConnection(climate_reader.GetOutputPort()) climate_mapper.SetLookupTable(climate_lut) climate_mapper.SetScalarRange(climate_range) climate_mapper.Update() sat_mapper = vtk.vtkDataSetMapper() sat_mapper.SetInputConnection(sat_reader.GetOutputPort()) density_actor = vtk.vtkActor() density_actor.SetMapper(density_mapper) density_actor.GetProperty().SetOpacity(0.99) density_actor.VisibilityOn() climate_actor = vtk.vtkActor() climate_actor.SetMapper(climate_mapper) climate_actor.GetProperty().SetOpacity(0.6) climate_actor.VisibilityOff() sat_actor = vtk.vtkActor() sat_actor.SetMapper(sat_mapper) sat_actor.GetProperty().SetOpacity(0.7) # Make satellite image same size as contour map crange = sat_actor.GetXRange()[0] - sat_actor.GetXRange()[1] mrange = density_actor.GetXRange()[0] - density_actor.GetXRange()[1] density_actor.SetScale(crange / mrange) crange = sat_actor.GetXRange()[0] - sat_actor.GetXRange()[1] mrange = climate_actor.GetXRange()[0] - climate_actor.GetXRange()[1] climate_actor.SetScale(crange / mrange) # Initialize renderer and place actors ren = vtk.vtkRenderer() ren.AddActor(density_actor) ren.AddActor(climate_actor) ren.AddActor(sat_actor) ren.ResetCamera() ren.SetBackground(0, 0, 0) # Initialize camera settings cam1 = ren.GetActiveCamera() cam1.Azimuth(0) cam1.Elevation(0) cam1.Roll(360) cam1.Zoom(1) ren.ResetCameraClippingRange() if args.camera: reader = open(args.camera, "r") line = reader.readline().split(",") cam1.SetPosition(float(line[0]), float(line[1]), float(line[2])) line = reader.readline().split(",") cam1.SetFocalPoint(float(line[0]), float(line[1]), float(line[2])) line = reader.readline().split(",") cam1.SetViewUp(float(line[0]), float(line[1]), float(line[2])) line = reader.readline().split(",") cam1.SetClippingRange(float(line[0]), float(line[1])) line = reader.readline().split(",") cam1.SetViewAngle(float(line[0])) line = reader.readline().split(",") cam1.SetParallelScale(float(line[0])) # Initialize PyQT5 UI and link to renderer app = QApplication([]) window = QMainWindow() ui = Ui_MainWindow() ui.setupUi(window) ui.vtkWidget.GetRenderWindow().AddRenderer(ren) ui.vtkWidget.GetRenderWindow().SetSize(1280, 720) ui.vtkWidget.GetRenderWindow().AddRenderer(ren) ui.vtkWidget.GetRenderWindow().SetAlphaBitPlanes(True) ui.vtkWidget.GetRenderWindow().SetMultiSamples(False) iren = ui.vtkWidget.GetRenderWindow().GetInteractor() # create the scalar_bar density_scalar_bar = vtk.vtkScalarBarActor() density_scalar_bar.SetOrientationToHorizontal() density_scalar_bar.SetMaximumNumberOfColors(color_count) density_scalar_bar.SetLookupTable(density_lut) density_scalar_bar.SetTitle("Density (Log 10)") # create the scalar_bar_widget density_scalar_bar_widget = vtk.vtkScalarBarWidget() density_scalar_bar_widget.SetInteractor(iren) density_scalar_bar_widget.SetScalarBarActor(density_scalar_bar) density_scalar_bar_widget.On() # create the scalar_bar climate_scalar_bar = vtk.vtkScalarBarActor() climate_scalar_bar.SetOrientationToHorizontal() climate_scalar_bar.SetMaximumNumberOfColors(color_count) climate_scalar_bar.SetLookupTable(climate_lut) climate_scalar_bar.SetTitle("Temparature (Celsius)") # create the scalar_bar_widget climate_scalar_bar_widget = vtk.vtkScalarBarWidget() climate_scalar_bar_widget.SetInteractor(iren) climate_scalar_bar_widget.SetScalarBarActor(climate_scalar_bar) climate_scalar_bar_widget.Off() # Function to initialize slider settings def slider_setup(slider, val, bounds, interv): slider.setOrientation(QtCore.Qt.Horizontal) slider.setValue(float(val)) slider.setSliderPosition(val) slider.setTracking(False) slider.setTickInterval(interv) slider.setTickPosition(QSlider.TicksAbove) slider.setRange(bounds[0], bounds[1]) slider_setup(ui.time_slider, 0, [0, (curr_date - initial_date).days], 1) window.show() window.setWindowState(Qt.WindowMaximized) iren.Initialize() def time_slider_callback(val): new_date = initial_date + timedelta(val) if new_date.month.real != ui.curr_month: ui.curr_month = new_date.month.real climate_reader.SetFileName(args.climate + "-" + str(ui.curr_month).zfill(2) + ".tif") climate_reader.Update() new_range = climate_reader.GetOutput().GetScalarRange() climate_mapper.SetScalarRange(new_range) ui.date_label.setText("Date (" + new_date.strftime('%m/%d/%Y') + "):") def density_callback(): isOn = density_actor.GetVisibility() if isOn: density_actor.VisibilityOff() density_scalar_bar_widget.Off() ui.vtkWidget.GetRenderWindow().Render() ui.push_density.setText('Enable Density') else: density_actor.VisibilityOn() density_scalar_bar_widget.On() ui.vtkWidget.GetRenderWindow().Render() ui.push_density.setText('Disable Density') def climate_callback(): isOn = climate_actor.GetVisibility() if isOn: climate_actor.VisibilityOff() climate_scalar_bar_widget.Off() ui.vtkWidget.GetRenderWindow().Render() ui.push_climate.setText('Enable Temperature') else: climate_actor.VisibilityOn() climate_scalar_bar_widget.On() ui.vtkWidget.GetRenderWindow().Render() ui.push_climate.setText('Disable Temperature') # Handle screenshot button event def screenshot_callback(): save_frame(ren.GetActiveCamera(), ui.vtkWidget.GetRenderWindow(), ui.log) # Handle show camera settings button event def camera_callback(): print_camera_settings(ren.GetActiveCamera(), ui.camera_info, ui.log) # Handle quit button event def quit_callback(): sys.exit() # Register callbacks to UI ui.time_slider.valueChanged.connect(time_slider_callback) ui.push_screenshot.clicked.connect(screenshot_callback) ui.push_camera.clicked.connect(camera_callback) ui.push_quit.clicked.connect(quit_callback) ui.push_density.clicked.connect(density_callback) ui.push_climate.clicked.connect(climate_callback) # Terminate setup for PyQT5 interface sys.exit(app.exec_())