diff --git a/src/Cxx/Images/RGBToYIQ.cxx b/src/Cxx/Images/RGBToYIQ.cxx index afd499cbeea000c0529d5e37f924051dedbd094c..ae1d08c811178cbdf3b5d975875fad87d88aa5e8 100644 --- a/src/Cxx/Images/RGBToYIQ.cxx +++ b/src/Cxx/Images/RGBToYIQ.cxx @@ -1,5 +1,6 @@ #include <vtkCamera.h> #include <vtkImageActor.h> +#include <vtkImageCast.h> #include <vtkImageExtractComponents.h> #include <vtkImageMapper3D.h> #include <vtkImageRGBToYIQ.h> @@ -30,8 +31,13 @@ int main(int argc, char* argv[]) reader.TakeReference(readerFactory->CreateImageReader2(argv[1])); reader->SetFileName(argv[1]); + // Convert data to float for conversion (YIQ is signed). + vtkNew<vtkImageCast> cast; + cast->SetInputConnection(reader->GetOutputPort()); + cast->SetOutputScalarTypeToFloat(); + vtkNew<vtkImageRGBToYIQ> yiqFilter; - yiqFilter->SetInputConnection(reader->GetOutputPort()); + yiqFilter->SetInputConnection(cast->GetOutputPort()); vtkNew<vtkImageExtractComponents> extractYFilter; extractYFilter->SetInputConnection(yiqFilter->GetOutputPort()); diff --git a/src/PythonicAPI.md b/src/PythonicAPI.md index 8022658fffa022bc3bfeb88eb844f59330eff4d5..4dacbc575eb6b81c6b9d55565b584ca6ab340dd7 100644 --- a/src/PythonicAPI.md +++ b/src/PythonicAPI.md @@ -613,6 +613,7 @@ See [this tutorial](http://www.vtk.org/Wiki/VTK/Tutorials/3DDataTypes) for a bri [ImageNonMaximumSuppression](/PythonicAPI/Images/ImageNonMaximumSuppression) | Find peaks in an image using non maximum suppression. [ImageOpenClose3D](/PythonicAPI/Images/ImageOpenClose3D) | Open or close (morphologically) an image. [ImageOrientation](/PythonicAPI/Images/ImageOrientation) | Reorder the axes of the image. +[ImageToPolyDataFilter](/PythonicAPI/Images/ImageToPolyDataFilter) | Convert a vtkImageData to a vtkPolyData. [MarkKeypoints](/PythonicAPI/Images/MarkKeypoints) | Mark keypoints in an image. @@ -641,6 +642,9 @@ See [this tutorial](http://www.vtk.org/Wiki/VTK/Tutorials/3DDataTypes) for a bri [MorphologyComparison](/PythonicAPI/ImageProcessing/MorphologyComparison) | This figure demonstrates various binary filters that can alter the shape of segmented regions. [ImageWarp](/PythonicAPI/Images/ImageWarp) | Combine the imaging and visualization pipelines to deform an image in the z-direction. The vtkMergeFilter is used to combine the warped surface with the original color data. [Pad](/PythonicAPI/ImageProcessing/Pad) | Convolution in frequency space treats the image as a periodic function. A large kernel can pick up features from both sides of the image. The left image has been padded with a constant to eliminate wraparound during convolution. On the right, mirror padding has been used to remove artificial edges introduced by borders. +[RGBToHSI](/PythonicAPI/Images/RGBToHSI) | Convert RGB to HSI. +[RGBToHSV](/PythonicAPI/Images/RGBToHSV) | Convert RGB to HSV. +[RGBToYIQ](/PythonicAPI/Images/RGBToYIQ) | Convert RGB to YIQ. [VTKSpectrum](/PythonicAPI/ImageProcessing/VTKSpectrum) | The discrete Fourier transform changes an image from the spatial domain into the frequency domain, where each pixel represents a sinusoidal function. This figure shows an image and its power spectrum displayed using a logarithmic transfer function. ## Widgets @@ -662,6 +666,7 @@ See [this tutorial](http://www.vtk.org/Wiki/VTK/Tutorials/3DDataTypes) for a bri [ContourWidget](/PythonicAPI/Widgets/ContourWidget) | Draw a contour (line) which can be deformed by the user. [DistanceWidget](/PythonicAPI/Widgets/DistanceWidget) | [HoverWidget](/PythonicAPI/Widgets/HoverWidget) | How to detect a hover. +[ImagePlaneWidget](/PythonicAPI/Widgets/ImagePlaneWidget) | [ImplicitConeWidget](/PythonicAPI/Widgets/ImplicitConeWidget) | An interactive implicit cone widget. [ImplicitPlaneWidget2](/PythonicAPI/Widgets/ImplicitPlaneWidget2) | Clip polydata with an implicit plane. [PolygonalSurfacePointPlacer](/PythonicAPI/PolyData/PolygonalSurfacePointPlacer) | Used in conjunction with vtkContourWidget to draw curves on a surface. diff --git a/src/PythonicAPI/Images/ImageOpenClose3D.py b/src/PythonicAPI/Images/ImageOpenClose3D.py index 80ca130f3cf070911cba0a01b04cb4aa638611a1..69c2f76152af9b850638fe0849ca96b82b9de224 100755 --- a/src/PythonicAPI/Images/ImageOpenClose3D.py +++ b/src/PythonicAPI/Images/ImageOpenClose3D.py @@ -7,9 +7,7 @@ import vtkmodules.vtkInteractionStyle # noinspection PyUnresolvedReferences import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkNamedColors -from vtkmodules.vtkIOImage import vtkImageReader2Factory, vtkPNGReader, vtkJPEGReader -from vtkmodules.vtkImagingCore import vtkImageCast -from vtkmodules.vtkImagingGeneral import vtkImageCityBlockDistance +from vtkmodules.vtkIOImage import vtkImageReader2Factory from vtkmodules.vtkImagingMorphological import vtkImageOpenClose3D from vtkmodules.vtkInteractionStyle import vtkInteractorStyleImage from vtkmodules.vtkRenderingCore import ( @@ -53,7 +51,7 @@ def main(): reader.Update() - open_close = vtkImageOpenClose3D(open_value = 0,close_value = 255,kernel_size = (5, 5, 3),release_data_flag = False) + open_close = vtkImageOpenClose3D(open_value=0, close_value=255, kernel_size=(5, 5, 3), release_data_flag=False) reader >> open_close original_actor = vtkImageActor() diff --git a/src/PythonicAPI/Images/ImageToPolyDataFilter.py b/src/PythonicAPI/Images/ImageToPolyDataFilter.py new file mode 100755 index 0000000000000000000000000000000000000000..d8fd0dcb175055f734a63965e05895829689ff57 --- /dev/null +++ b/src/PythonicAPI/Images/ImageToPolyDataFilter.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 + +from pathlib import Path + +# noinspection PyUnresolvedReferences +import vtkmodules.vtkInteractionStyle +# noinspection PyUnresolvedReferences +import vtkmodules.vtkRenderingOpenGL2 +from vtkmodules.vtkCommonColor import vtkNamedColors +from vtkmodules.vtkFiltersCore import vtkTriangleFilter +from vtkmodules.vtkFiltersHybrid import vtkImageToPolyDataFilter +from vtkmodules.vtkIOImage import vtkImageReader2Factory +from vtkmodules.vtkImagingColor import vtkImageQuantizeRGBToIndex +from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, + vtkRenderer, + vtkRenderWindow, + vtkRenderWindowInteractor +) + + +def get_program_parameters(): + import argparse + description = 'ImageToPolyDataFilter.' + epilogue = ''' + ''' + parser = argparse.ArgumentParser(description=description, epilog=epilogue, + formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument('file_name', help='The image file name to use e.g. Gourds.png.') + args = parser.parse_args() + return args.file_name + + +def main(): + fn = get_program_parameters() + fp = Path(fn) + file_check = True + if not fp.is_file(): + print(f'Missing image file: {fp}.') + file_check = False + if not file_check: + return + + colors = vtkNamedColors() + + # Read the image. + reader: vtkImageReader2Factory = vtkImageReader2Factory().CreateImageReader2(str(fp)) + reader.file_name = fp + + # Alternatively, use vtkPNGReader. + # reader = vtkPNGReader(file_name = fp) + + quant = vtkImageQuantizeRGBToIndex(number_of_colors=16) + + i2pd = vtkImageToPolyDataFilter(lookup_table=quant.lookup_table, error=0, + decimation=True, decimation_error=0.0, + sub_image_size=25) + i2pd.SetColorModeToLUT() + i2pd.SetOutputStyleToPolygonalize() + + # Need a triangle filter because the polygons are complex and concave. + tf = vtkTriangleFilter() + + mapper = vtkPolyDataMapper() + reader >> quant >> i2pd >> tf >> mapper + + actor = vtkActor(mapper=mapper) + actor.property.SetRepresentationToWireframe() + + # Visualize + renderer = vtkRenderer(background=colors.GetColor3d('DarkSlateGray')) + render_window = vtkRenderWindow(size=(300, 250), window_name='ImageToPolyDataFilter') + render_window.AddRenderer(renderer) + interactor = vtkRenderWindowInteractor() + interactor.render_window = render_window + + renderer.AddActor(actor) + + render_window.Render() + interactor.Initialize() + interactor.Start() + + +if __name__ == '__main__': + main() diff --git a/src/PythonicAPI/Images/RGBToHSI.md b/src/PythonicAPI/Images/RGBToHSI.md new file mode 100644 index 0000000000000000000000000000000000000000..d8d3b5f64f4b49dafb24098f1e078291091d42d7 --- /dev/null +++ b/src/PythonicAPI/Images/RGBToHSI.md @@ -0,0 +1,6 @@ +### Description + +Convert RGB channels to HSI channels. See [this article](https://en.wikipedia.org/wiki/HSL_and_HSV) for a description of the HSI colormodel. + +!!! seealso + [RGBToYIQ](../RGBToYIQ) and [RGBToHSV](../RGBToHSV) diff --git a/src/PythonicAPI/Images/RGBToHSI.py b/src/PythonicAPI/Images/RGBToHSI.py new file mode 100755 index 0000000000000000000000000000000000000000..0a753a3a8ca394c693a328e4c83a547043ff9285 --- /dev/null +++ b/src/PythonicAPI/Images/RGBToHSI.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 + +from pathlib import Path + +# noinspection PyUnresolvedReferences +import vtkmodules.vtkInteractionStyle +# noinspection PyUnresolvedReferences +import vtkmodules.vtkRenderingOpenGL2 +from vtkmodules.vtkCommonColor import vtkNamedColors +from vtkmodules.vtkIOImage import vtkImageReader2Factory +from vtkmodules.vtkImagingColor import vtkImageRGBToHSI +from vtkmodules.vtkImagingCore import vtkImageExtractComponents +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleImage +from vtkmodules.vtkRenderingCore import ( + vtkCamera, + vtkImageActor, + vtkRenderer, + vtkRenderWindow, + vtkRenderWindowInteractor +) + + +def get_program_parameters(): + import argparse + description = 'RGBToHSI.' + epilogue = ''' + ''' + parser = argparse.ArgumentParser(description=description, epilog=epilogue, + formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument('file_name', help='The image file name to use e.g. Gourds2.jpg.') + args = parser.parse_args() + return args.file_name + + +def main(): + fn = get_program_parameters() + fp = Path(fn) + file_check = True + if not fp.is_file(): + print(f'Missing image file: {fp}.') + file_check = False + if not file_check: + return + + colors = vtkNamedColors() + + # Read the image. + reader: vtkImageReader2Factory = vtkImageReader2Factory().CreateImageReader2(str(fp)) + reader.file_name = fp + + # Alternatively, use vtkPNGReader. + # reader = vtkJPEGReader(file_name = fp) + + hsi_filter = vtkImageRGBToHSI() + reader >> hsi_filter + + extract_h_filter = vtkImageExtractComponents(components=0) + hsi_filter >> extract_h_filter + + extract_s_filter = vtkImageExtractComponents(components=1) + hsi_filter >> extract_s_filter + + extract_i_filter = vtkImageExtractComponents(components=2) + hsi_filter >> extract_i_filter + + # Create the actors. + input_actor = vtkImageActor() + reader >> input_actor.mapper + + h_actor = vtkImageActor() + extract_h_filter >> h_actor.mapper + + s_actor = vtkImageActor() + extract_s_filter >> s_actor.mapper + + i_actor = vtkImageActor() + extract_i_filter >> i_actor.mapper + + # Define the viewport ranges.(x_min, y_min, x_max, y_max). + input_viewport = (0.0, 0.0, 0.25, 1.0) + h_viewport = (0.25, 0.0, 0.5, 1.0) + s_viewport = (0.5, 0.0, 0.75, 1.0) + i_viewport = (0.75, 0.0, 1.0, 1.0) + + # Shared camera. + shared_camera = vtkCamera() + + # Setup renderers. + input_renderer = vtkRenderer(viewport=input_viewport, background=colors.GetColor3d('CornflowerBlue')) + input_renderer.AddActor(input_actor) + input_renderer.active_camera = shared_camera + + h_renderer = vtkRenderer(viewport=h_viewport, background=colors.GetColor3d('MistyRose')) + h_renderer.AddActor(h_actor) + h_renderer.active_camera = shared_camera + + s_renderer = vtkRenderer(viewport=s_viewport, background=colors.GetColor3d('LavenderBlush')) + s_renderer.AddActor(s_actor) + s_renderer.active_camera = shared_camera + + i_renderer = vtkRenderer(viewport=i_viewport, background=colors.GetColor3d('Lavender')) + i_renderer.AddActor(i_actor) + i_renderer.active_camera = shared_camera + + # Setup render window. + render_window = vtkRenderWindow(size=(1000, 250), window_name='RGBToHSI') + render_window.AddRenderer(input_renderer) + render_window.AddRenderer(h_renderer) + render_window.AddRenderer(s_renderer) + render_window.AddRenderer(i_renderer) + input_renderer.ResetCamera() + + # Setup the render window interactor. + render_window_interactor = vtkRenderWindowInteractor() + style = vtkInteractorStyleImage() + render_window_interactor.interactor_style = style + + # Render and start the interaction. + render_window_interactor.render_window = render_window + render_window.Render() + render_window_interactor.Initialize() + + render_window_interactor.Start() + + +if __name__ == '__main__': + main() diff --git a/src/PythonicAPI/Images/RGBToHSV.md b/src/PythonicAPI/Images/RGBToHSV.md new file mode 100644 index 0000000000000000000000000000000000000000..69ad716809d002849e18b2fbbaaf31582b333344 --- /dev/null +++ b/src/PythonicAPI/Images/RGBToHSV.md @@ -0,0 +1,6 @@ +### Description + +Convert RGB channels to HSV channels. See [this article](https://en.wikipedia.org/wiki/HSL_and_HSV) for a description of the RGB colormodel. + +!!! seealso + [RGBToYIQ](../RGBToYIQ) and [RGBToHSI](../RGBToHSI) diff --git a/src/PythonicAPI/Images/RGBToHSV.py b/src/PythonicAPI/Images/RGBToHSV.py new file mode 100755 index 0000000000000000000000000000000000000000..d5ec06f70fc8234f9a72b3dfa35d5cfddd30c751 --- /dev/null +++ b/src/PythonicAPI/Images/RGBToHSV.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 + +from pathlib import Path + +# noinspection PyUnresolvedReferences +import vtkmodules.vtkInteractionStyle +# noinspection PyUnresolvedReferences +import vtkmodules.vtkRenderingOpenGL2 +from vtkmodules.vtkCommonColor import vtkNamedColors +from vtkmodules.vtkIOImage import vtkImageReader2Factory +from vtkmodules.vtkImagingColor import vtkImageRGBToHSV +from vtkmodules.vtkImagingCore import vtkImageExtractComponents +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleImage +from vtkmodules.vtkRenderingCore import ( + vtkCamera, + vtkImageActor, + vtkRenderer, + vtkRenderWindow, + vtkRenderWindowInteractor +) + + +def get_program_parameters(): + import argparse + description = 'RGBToHSV.' + epilogue = ''' + ''' + parser = argparse.ArgumentParser(description=description, epilog=epilogue, + formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument('file_name', help='The image file name to use e.g. Gourds.png.') + args = parser.parse_args() + return args.file_name + + +def main(): + fn = get_program_parameters() + fp = Path(fn) + file_check = True + if not fp.is_file(): + print(f'Missing image file: {fp}.') + file_check = False + if not file_check: + return + + colors = vtkNamedColors() + + # Read the image. + reader: vtkImageReader2Factory = vtkImageReader2Factory().CreateImageReader2(str(fp)) + reader.file_name = fp + + # Alternatively, use vtkPNGReader. + # reader = vtkPNGReader(file_name = fp) + + hsv_filter = vtkImageRGBToHSV() + reader >> hsv_filter + + extract_hue_filter = vtkImageExtractComponents(components=0) + hsv_filter >> extract_hue_filter + + extract_saturation_filter = vtkImageExtractComponents(components=1) + hsv_filter >> extract_saturation_filter + + extract_value_filter = vtkImageExtractComponents(components=2) + hsv_filter >> extract_value_filter + + # Create the actors. + input_actor = vtkImageActor() + reader >> input_actor.mapper + + h_actor = vtkImageActor() + extract_hue_filter >> h_actor.mapper + + s_actor = vtkImageActor() + extract_saturation_filter >> s_actor.mapper + + i_actor = vtkImageActor() + extract_value_filter >> i_actor.mapper + + # Define the viewport ranges.(x_min, y_min, x_max, y_max). + input_viewport = (0.0, 0.0, 0.25, 1.0) + h_viewport = (0.25, 0.0, 0.5, 1.0) + s_viewport = (0.5, 0.0, 0.75, 1.0) + v_viewport = (0.75, 0.0, 1.0, 1.0) + + # Shared camera. + shared_camera = vtkCamera() + + # Setup renderers. + input_renderer = vtkRenderer(viewport=input_viewport, background=colors.GetColor3d('CornflowerBlue')) + input_renderer.AddActor(input_actor) + input_renderer.active_camera = shared_camera + + h_renderer = vtkRenderer(viewport=h_viewport, background=colors.GetColor3d('MistyRose')) + h_renderer.AddActor(h_actor) + h_renderer.active_camera = shared_camera + + v_renderer = vtkRenderer(viewport=s_viewport, background=colors.GetColor3d('LavenderBlush')) + v_renderer.AddActor(s_actor) + v_renderer.active_camera = shared_camera + + i_renderer = vtkRenderer(viewport=v_viewport, background=colors.GetColor3d('Lavender')) + i_renderer.AddActor(i_actor) + i_renderer.active_camera = shared_camera + + # Setup render window. + render_window = vtkRenderWindow(size=(1000, 250), window_name='RGBToHSV') + render_window.AddRenderer(input_renderer) + render_window.AddRenderer(h_renderer) + render_window.AddRenderer(v_renderer) + render_window.AddRenderer(i_renderer) + input_renderer.ResetCamera() + + # Setup the render window interactor. + render_window_interactor = vtkRenderWindowInteractor() + style = vtkInteractorStyleImage() + render_window_interactor.interactor_style = style + + # Render and start the interaction. + render_window_interactor.render_window = render_window + render_window.Render() + render_window_interactor.Initialize() + + render_window_interactor.Start() + + +if __name__ == '__main__': + main() diff --git a/src/PythonicAPI/Images/RGBToYIQ.md b/src/PythonicAPI/Images/RGBToYIQ.md new file mode 100644 index 0000000000000000000000000000000000000000..7da79252d6fba1114c3399f55cbb04681e5956cd --- /dev/null +++ b/src/PythonicAPI/Images/RGBToYIQ.md @@ -0,0 +1,6 @@ +### Description + +Convert RGB channels to YIQ channels. See [this article](https://en.wikipedia.org/wiki/YIQ) for a description of the YIQ colormodel. + +!!! seealso + [RGBToHSV](../RGBToHSV) and [RGBToHSI](../RGBToHSI) diff --git a/src/PythonicAPI/Images/RGBToYIQ.py b/src/PythonicAPI/Images/RGBToYIQ.py new file mode 100755 index 0000000000000000000000000000000000000000..e42c296f02abba9551b63ce27586b2c34ecba5e2 --- /dev/null +++ b/src/PythonicAPI/Images/RGBToYIQ.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python3 + +from pathlib import Path + +# noinspection PyUnresolvedReferences +import vtkmodules.vtkInteractionStyle +# noinspection PyUnresolvedReferences +import vtkmodules.vtkRenderingOpenGL2 +from vtkmodules.vtkCommonColor import vtkNamedColors +from vtkmodules.vtkIOImage import vtkImageReader2Factory +from vtkmodules.vtkImagingColor import vtkImageRGBToYIQ +from vtkmodules.vtkImagingCore import vtkImageExtractComponents, vtkImageCast +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleImage +from vtkmodules.vtkRenderingCore import ( + vtkCamera, + vtkImageActor, + vtkRenderer, + vtkRenderWindow, + vtkRenderWindowInteractor +) + + +def get_program_parameters(): + import argparse + description = 'RGBToYIQ.' + epilogue = ''' + ''' + parser = argparse.ArgumentParser(description=description, epilog=epilogue, + formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument('file_name', help='The image file name to use e.g. Gourds.png.') + args = parser.parse_args() + return args.file_name + + +def main(): + fn = get_program_parameters() + fp = Path(fn) + file_check = True + if not fp.is_file(): + print(f'Missing image file: {fp}.') + file_check = False + if not file_check: + return + + colors = vtkNamedColors() + + # Read the image. + reader: vtkImageReader2Factory = vtkImageReader2Factory().CreateImageReader2(str(fp)) + reader.file_name = fp + + # Alternatively, use vtkPNGReader. + # reader = vtkPNGReader(file_name = fp) + + # Convert data to float for conversion (YIQ is signed). + cast = vtkImageCast() + cast.SetOutputScalarTypeToFloat() + + yiq_filter = vtkImageRGBToYIQ() + reader >> cast >> yiq_filter + + extract_y_filter = vtkImageExtractComponents(components=0) + yiq_filter >> extract_y_filter + + extract_i_filter = vtkImageExtractComponents(components=1) + yiq_filter >> extract_i_filter + + extract_q_filter = vtkImageExtractComponents(components=2) + yiq_filter >> extract_q_filter + + # Create the actors. + input_actor = vtkImageActor() + reader >> input_actor.mapper + + y_actor = vtkImageActor() + extract_y_filter >> y_actor.mapper + + i_actor = vtkImageActor() + extract_i_filter >> i_actor.mapper + + q_actor = vtkImageActor() + extract_q_filter >> q_actor.mapper + + # Define the viewport ranges.(x_min, y_min, x_max, y_max). + input_viewport = (0.0, 0.0, 0.25, 1.0) + y_viewport = (0.25, 0.0, 0.5, 1.0) + i_viewport = (0.5, 0.0, 0.75, 1.0) + q_viewport = (0.75, 0.0, 1.0, 1.0) + + # Shared camera. + shared_camera = vtkCamera() + + # Setup renderers. + input_renderer = vtkRenderer(viewport=input_viewport, background=colors.GetColor3d('CornflowerBlue')) + input_renderer.AddActor(input_actor) + input_renderer.active_camera = shared_camera + + y_renderer = vtkRenderer(viewport=y_viewport, background=colors.GetColor3d('MistyRose')) + y_renderer.AddActor(y_actor) + y_renderer.active_camera = shared_camera + + i_renderer = vtkRenderer(viewport=i_viewport, background=colors.GetColor3d('LavenderBlush')) + i_renderer.AddActor(i_actor) + i_renderer.active_camera = shared_camera + + q_renderer = vtkRenderer(viewport=q_viewport, background=colors.GetColor3d('Lavender')) + q_renderer.AddActor(q_actor) + q_renderer.active_camera = shared_camera + + # Setup render window. + render_window = vtkRenderWindow(size=(1000, 250), window_name='RGBToYIQ') + render_window.AddRenderer(input_renderer) + render_window.AddRenderer(y_renderer) + render_window.AddRenderer(i_renderer) + render_window.AddRenderer(q_renderer) + input_renderer.ResetCamera() + + # Setup the render window interactor. + render_window_interactor = vtkRenderWindowInteractor() + style = vtkInteractorStyleImage() + render_window_interactor.interactor_style = style + + # Render and start the interaction. + render_window_interactor.render_window = render_window + render_window.Render() + render_window_interactor.Initialize() + + render_window_interactor.Start() + + +if __name__ == '__main__': + main() diff --git a/src/PythonicAPI/Widgets/ImagePlaneWidget.py b/src/PythonicAPI/Widgets/ImagePlaneWidget.py new file mode 100755 index 0000000000000000000000000000000000000000..400b8572df6cf441fdae3cc5ed570dfd9b9301ee --- /dev/null +++ b/src/PythonicAPI/Widgets/ImagePlaneWidget.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 + +# noinspection PyUnresolvedReferences +import vtkmodules.vtkInteractionStyle +# noinspection PyUnresolvedReferences +import vtkmodules.vtkRenderingFreeType +# noinspection PyUnresolvedReferences +import vtkmodules.vtkRenderingOpenGL2 +from vtkmodules.vtkCommonColor import vtkNamedColors +from vtkmodules.vtkFiltersSources import vtkSphereSource +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleTrackballCamera +from vtkmodules.vtkInteractionWidgets import vtkImagePlaneWidget +from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, + vtkRenderer, + vtkRenderWindow, + vtkRenderWindowInteractor, +) + + +def main(): + colors = vtkNamedColors() + + sphere_source = vtkSphereSource() + + # Create a mapper and actor. + mapper = vtkPolyDataMapper() + sphere_source >> mapper + actor = vtkActor(mapper=mapper) + actor.property.color = colors.GetColor3d('MistyRose') + + # A renderer and render window. + renderer = vtkRenderer(background=colors.GetColor3d('SlateGray')) + render_window = vtkRenderWindow(window_name='ImagePlaneWidget') + render_window.AddRenderer(renderer) + + renderer.AddActor(actor) + + # An interactor. + render_window_interactor = vtkRenderWindowInteractor() + render_window_interactor.render_window = render_window + + # style = vtkInteractorStyleTrackballActor() + style = vtkInteractorStyleTrackballCamera() + + render_window_interactor.interactor_style = style + + plane_widget = vtkImagePlaneWidget() + plane_widget.interactor = render_window_interactor + plane_widget.TextureVisibilityOff() + + origin = (0, 1, 0) + plane_widget.origin = origin + plane_widget.UpdatePlacement() + + # Render + render_window.Render() + + renderer.active_camera.Azimuth(-45) + renderer.active_camera.Zoom(0.85) + + render_window_interactor.Initialize() + render_window.Render() + plane_widget.On() + + # Begin mouse interaction. + render_window_interactor.Start() + + +if __name__ == '__main__': + main() diff --git a/src/Testing/Baseline/Cxx/Images/TestImageToPolyDataFilter.png b/src/Testing/Baseline/Cxx/Images/TestImageToPolyDataFilter.png index 25250fef6f70be35501b25d21cec04d7dbe22cf7..4c4da9a5793fa831e64181cf016a3f4e74434054 100644 --- a/src/Testing/Baseline/Cxx/Images/TestImageToPolyDataFilter.png +++ b/src/Testing/Baseline/Cxx/Images/TestImageToPolyDataFilter.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ee43b9373f81a109afe431697a66efd7dca89f5f3ebe90d804fd394f7b45a68 -size 59493 +oid sha256:aefa4f67e63fe3d0dbde5851c3edb2cfbb6867843268b45651b4c1cbf608c4c4 +size 59497 diff --git a/src/Testing/Baseline/Cxx/Images/TestRGBToYIQ.png b/src/Testing/Baseline/Cxx/Images/TestRGBToYIQ.png index a939c1362a83bf789acdfb3c0864a7d87ce2027d..029742d2fbf78b0a06f26411199cf44f67e2287a 100644 --- a/src/Testing/Baseline/Cxx/Images/TestRGBToYIQ.png +++ b/src/Testing/Baseline/Cxx/Images/TestRGBToYIQ.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:42be352138181c25eebb80f94e2d4fcd6ab87ab40c6bb11ed2bad8e31fb1d1df -size 206456 +oid sha256:51cc7a907616c664f5232ae78f08085b7a4b64d85839f6185430ebcec25182ae +size 159210 diff --git a/src/Testing/Baseline/PythonicAPI/Images/TestImageToPolyDataFilter.png b/src/Testing/Baseline/PythonicAPI/Images/TestImageToPolyDataFilter.png new file mode 100644 index 0000000000000000000000000000000000000000..4c4da9a5793fa831e64181cf016a3f4e74434054 --- /dev/null +++ b/src/Testing/Baseline/PythonicAPI/Images/TestImageToPolyDataFilter.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aefa4f67e63fe3d0dbde5851c3edb2cfbb6867843268b45651b4c1cbf608c4c4 +size 59497 diff --git a/src/Testing/Baseline/PythonicAPI/Images/TestRGBToHSI.png b/src/Testing/Baseline/PythonicAPI/Images/TestRGBToHSI.png new file mode 100644 index 0000000000000000000000000000000000000000..fef56ee4c29192398f2eeb58dfbc3e332a3778e8 --- /dev/null +++ b/src/Testing/Baseline/PythonicAPI/Images/TestRGBToHSI.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64664f65a09538f6ce01c82b5c3b844bc787bdbb70c1c1acfd6af2bf4ed0caaa +size 232140 diff --git a/src/Testing/Baseline/PythonicAPI/Images/TestRGBToHSV.png b/src/Testing/Baseline/PythonicAPI/Images/TestRGBToHSV.png new file mode 100644 index 0000000000000000000000000000000000000000..a240ebad33aa58252669329ac5ffa36e43b656bd --- /dev/null +++ b/src/Testing/Baseline/PythonicAPI/Images/TestRGBToHSV.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:310ccaf382359edcca0e306fcfa93fcc27ee8cfa6312c0841474da4df73ad07b +size 236407 diff --git a/src/Testing/Baseline/PythonicAPI/Images/TestRGBToYIQ.png b/src/Testing/Baseline/PythonicAPI/Images/TestRGBToYIQ.png new file mode 100644 index 0000000000000000000000000000000000000000..029742d2fbf78b0a06f26411199cf44f67e2287a --- /dev/null +++ b/src/Testing/Baseline/PythonicAPI/Images/TestRGBToYIQ.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51cc7a907616c664f5232ae78f08085b7a4b64d85839f6185430ebcec25182ae +size 159210 diff --git a/src/Testing/Baseline/PythonicAPI/Widgets/TestImagePlaneWidget.png b/src/Testing/Baseline/PythonicAPI/Widgets/TestImagePlaneWidget.png new file mode 100644 index 0000000000000000000000000000000000000000..2268967003209de4fc936b5df10cc3a81ca86d74 --- /dev/null +++ b/src/Testing/Baseline/PythonicAPI/Widgets/TestImagePlaneWidget.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5c1f7544dee8b6d3242f764b919ca7060da44bba46e9a80ea5b67e49f112cbb +size 16635