[vtkusers] How to create vtkActor2D from vtkContourFilter?

Andrej Gluhov realandron at gmail.com
Thu Apr 8 17:13:46 EDT 2010


Thank you very much for the idea! Specifically for use vtkImageActor. He did
not show Dicom-files, but I found out :))). And it was just a handy
vtkImageViewer2.
            //Create the RenderWindow, Renderer and RenderWindowInteractor
            vtkRenderer ren1 = new vtkRenderer();
            vtkRenderWindow renWin = new
vtkRenderWindow();//reWin.GetRenderWindow();
            renWin.AddRenderer(ren1);
            vtkRenderWindowInteractor iren = new
vtkRenderWindowInteractor();
            iren.SetRenderWindow(renWin);

            vtkDICOMImageReader DicomReader = new vtkDICOMImageReader();
            DicomReader.SetFileName(m_strFilePath);
            DicomReader.Update();

            vtkImageData vol = new vtkImageData();
            vol.SetDimensions(512, 512, 1);
            vol.SetSpacing(1, 1, 1);
            vol.SetOrigin(0, 0, 0);
            vol.SetScalarTypeToFloat();
            vol.AllocateScalars();

            vtkFloatArray scalars = new vtkFloatArray();
            for (int i = 0; i < 512; i++)
            {
                for (int j = 0; j < 512; j++)
                {
                    scalars.InsertTuple1(i * 512 + j, m_DoseMap[i * 512 +
j]);
                }
            }

            vol.GetPointData().SetScalars(scalars);
            vol.Update();

            double[] DoseRange = vol.GetScalarRange();

            vtkLookupTable LUT = new vtkLookupTable();
            LUT.SetTableRange(DoseRange[0], DoseRange[1]);//min dose,max
dose
            LUT.SetNumberOfColors(1000);
            LUT.SetSaturationRange(1, 1);
            LUT.SetHueRange(0.67, 0);//blue to red
            LUT.SetAlphaRange(0, 0.3);//opacity
            LUT.Build();

            vtkImageMapToColors mapToRGBA = new vtkImageMapToColors();
            mapToRGBA.SetInput(vol);
            mapToRGBA.SetOutputFormatToRGBA();
            mapToRGBA.SetLookupTable(LUT);

            vtkImageActor ColorActor = new vtkImageActor();
            ColorActor.SetInput(mapToRGBA.GetOutput());
            ColorActor.SetPosition(0, 0, 1);

            vtkContourFilter cf = new vtkContourFilter();
            cf.SetInput(vol);
            cf.SetValue(0, 100);
            cf.Update();

            vtkPolyDataMapper mapper = new vtkPolyDataMapper();
            mapper.SetInputConnection(cf.GetOutputPort());
            mapper.ScalarVisibilityOff();

            vtkActor actor = new vtkActor();
            actor.SetMapper(mapper);
            actor.GetProperty().SetColor(1, 0, 0);
            actor.SetPosition(0, 0, 2);

            vtkImageViewer2 viewer = new vtkImageViewer2();
            viewer.SetupInteractor(iren);
            viewer.SetInputConnection(DicomReader.GetOutputPort());
            viewer.GetRenderer().AddActor(ColorActor);
            viewer.GetRenderer().AddActor(actor);
            viewer.GetRenderer().ResetCamera();
            viewer.Render();

9 апреля 2010 г. 0:42 пользователь Eric E. Monson <emonson at cs.duke.edu>написал:

> Hello Andrej,
>
> Well, maybe someone else can give their opinion, too, but personally I
> would just use a standard vtkRenderWindow, and add all three actors to the
> vtkRenderer that you add to that render window.
>
> Each of the images can be shown with a vtkImageActor, and those can be
> placed anywhere in 3D space with SetPosition(), and then you can just use a
> regular vtkActor for the contour filter output and place it "in front" of
> the image actors.
>
> Here's a piece of Python code that does this, if you want to have a look.
> (Sorry the beginning is more complicated than it should be, I was already
> playing with VTK/Examples/ImageProcessing/Python/ImageSlicing.py and this
> was an easy way to get two grayscale images to superimpose...) It takes two
> images, gives one an orange and one a yellow color map with transparency,
> then overlays them. (I positioned them separately in space, but I think you
> can put these on the same Z plane.) Then, I place the contour output "over
> the top" of the images. (If you change the interactor style to
> TrackballCamera, you can roll them around and see the separation, which
> doesn't have to be this extreme.)
>
> Again, maybe others have a better way to do this, but it works for keeping
> the spatial order as you want it, and they all move together in the window.
>
> Good luck,
> -Eric
>
> ===================
>
> #!/usr/bin/env python
>
> import vtk
>
> VTK_DATA_ROOT = '/Users/emonson/Programming/VTK_cvs/VTKData'
>
> # Start by loading some data.
> reader = vtk.vtkImageReader2()
> reader.SetFilePrefix(VTK_DATA_ROOT + "/Data/headsq/quarter")
> reader.SetDataExtent(0, 63, 0, 63, 1, 93)
> reader.SetDataSpacing(1.0, 1.0, 1.0)
> reader.SetDataOrigin(0.0, 0.0, 0.0)
> reader.SetDataScalarTypeToUnsignedShort()
> reader.UpdateWholeExtent()
>
> # Calculate the center of the volume
> reader.GetOutput().UpdateInformation()
> (xMin, xMax, yMin, yMax, zMin, zMax) = reader.GetOutput().GetWholeExtent()
> (xSpacing, ySpacing, zSpacing) = reader.GetOutput().GetSpacing()
> (x0, y0, z0) = reader.GetOutput().GetOrigin()
>
> center = [x0 + xSpacing * 0.5 * (xMin + xMax),
>           y0 + ySpacing * 0.5 * (yMin + yMax),
>           z0 + zSpacing * 0.5 * (zMin + zMax)]
>
> renderer = vtk.vtkRenderer()
> renderer.SetBackground(1,1,1)
>
> resliceList = []
> tableList = []
> colorList = []
> actorList = []
>
> imgOffset = 70
>
> for ii in range(2):
>  zpos = z0 + zSpacing*(zMin+ii*imgOffset)
> axial = vtk.vtkMatrix4x4()
> axial.DeepCopy((1, 0, 0, center[0],
> 0, 1, 0, center[1],
> 0, 0, 1, zpos,
> 0, 0, 0, 1))
>  # Extract a slice in the desired orientation
> reslice = vtk.vtkImageReslice()
> reslice.SetInputConnection(reader.GetOutputPort())
> reslice.SetOutputDimensionality(2)
> reslice.SetResliceAxes(axial)
> reslice.SetInterpolationModeToNearestNeighbor()
> reslice.Update()
>  resliceList.append(reslice)
>  # Create a greyscale lookup table
> table = vtk.vtkLookupTable()
> table.SetRange(0, 2000) # image intensity range
> table.SetHueRange(ii*0.1,0.1+ii*0.1)
> table.SetValueRange(0.0, 1.0) # from black to white
> table.SetSaturationRange(0.0, 0.8) # no color saturation
> table.SetAlphaRange(0,0.8)
> table.SetRampToLinear()
> table.Build()
>  tableList.append(table)
>  # Map the image through the lookup table
> color = vtk.vtkImageMapToColors()
> color.SetLookupTable(tableList[ii])
> color.SetInputConnection(resliceList[ii].GetOutputPort())
>  colorList.append(color)
>  # Display the image
> actor = vtk.vtkImageActor()
> actor.SetInput(colorList[ii].GetOutput())
> actor.SetPosition(0, 0, ii*1.0)
> actorList.append(actor)
>  renderer.AddActor(actorList[ii])
> contour = vtk.vtkContourFilter()
> contour.SetInputConnection(resliceList[0].GetOutputPort(0))
> contour.GenerateValues(5,0,2000)
> contour.SetComputeScalars(True)
>
> polyMapper = vtk.vtkPolyDataMapper()
> polyMapper.SetInputConnection(contour.GetOutputPort(0))
> # Uncomment next two to color contour lines
> # polyMapper.SetScalarModeToUsePointData()
> # polyMapper.SetScalarRange(0,2000)
> polyMapper.SetScalarVisibility(False)
> polyActor = vtk.vtkActor()
> polyActor.SetMapper(polyMapper)
> polyActor.GetProperty().SetColor(0,0,0)
> polyActor.GetProperty().SetLineWidth(1)
> polyActor.SetPosition(0,0,2.0)
>
> renderer.AddActor(polyActor)
>
> # Set up the interaction
> interactorStyle = vtk.vtkInteractorStyleImage()
> interactor = vtk.vtkRenderWindowInteractor()
> interactor.SetInteractorStyle(interactorStyle)
>
> window = vtk.vtkRenderWindow()
> window.AddRenderer(renderer)
> window.SetInteractor(interactor)
> window.Render()
>
> # Start interaction
> interactor.Start()
>
>
>
> On Apr 8, 2010, at 9:49 AM, Andrej Gluhov wrote:
>
> Hi, Eric.
>
> Thanks for the response. "Images from vtkActor2D gets under 2D images" is a
> mistake. Of course, I meant vtkActor. The problem is that the contour is
> not visible when displaying, but if you stretch the window and then
> vtkActor2D remains in the lower left corner, and the Contours can be seen in
> the background (under vtkActor2D). I tried to change the position of the
> coordinate Z, but it does not yield results. vtkActor2D has only x,y
> coordinates.
> And the window I create in order to then attach vtkImageViewer2 in
> WindowsForm.
>
> 8 апреля 2010 г. 17:16 пользователь Eric E. Monson <emonson at cs.duke.edu>написал:
>
>> Hey Andrej,
>>
>> I'm trying to understand your problem, but I'm not sure exactly what you
>> mean by "Images from vtkActor2D gets under 2D images". If the problem is
>> that your images show up in front of your contour lines so that the contours
>> are hidden, you can use something like:
>>
>> actor.SetPosition(0, 0, 0.01);
>>
>> to move the contours out in front of the image, and not have to change the
>> polydata into imagedata.
>>
>> Also, you seem to be trying to create a vtkRenderWindow at the beginning
>> of your code but you are using the vtkImageViewer2 later. If you want to
>> view all of your objects in one window, you can use just one or the other
>> (ImageViewer2 creates a render window for you).
>>
>> If this doesn't address your problem, be sure to try again to clarify the
>> trouble you're having and I'm sure someone can help.
>>
>> Talk to you later,
>> -Eric
>>
>> ------------------------------------------------------
>> Eric E Monson
>> Duke Visualization Technology Group
>>
>>
>> On Apr 8, 2010, at 3:17 AM, Andrej Gluhov wrote:
>>
>> > Hi.
>> > I have this problem of combining vtkActor and vtkActor2D for
>> vtkImageViewer2D. Images from vtkActor2D gets under 2D images. I understand
>> that the problem is converting vtkPolyData to vtkImageData, I could use
>> vtkImageData, but do not know how to create it on the contour points.
>> >
>> >             //Create the RenderWindow, Renderer and
>> RenderWindowInteractor
>> >             vtkRenderer ren1 = new vtkRenderer();
>> >             vtkRenderWindow renWin = reWin.GetRenderWindow();
>> >             renWin.AddRenderer(ren1);
>> >             vtkRenderWindowInteractor iren = new
>> vtkRenderWindowInteractor();
>> >             iren.SetRenderWindow(renWin);
>> >
>> >             vtkDICOMImageReader DicomReader = new vtkDICOMImageReader();
>> >             DicomReader.SetFileName(m_strFilePath);
>> >             DicomReader.Update();
>> >
>> >             vtkImageMapper DicomMapper = new vtkImageMapper();
>> >             DicomMapper.SetInputConnection(DicomReader.GetOutputPort());
>> >             DicomMapper.SetColorWindow(255.0);
>> >             DicomMapper.SetColorLevel(127.5);
>> >
>> >             vtkActor2D DicomActor = new vtkActor2D();
>> >             DicomActor.SetMapper(DicomMapper);
>> >
>> >             vtkImageData vol = new vtkImageData();
>> >             vol.SetDimensions(512, 512, 1);
>> >             vol.SetSpacing(1, 1, 1);
>> >             vol.SetOrigin(0, 0, 0);
>> >             vol.SetScalarTypeToFloat();
>> >             vol.AllocateScalars();
>> >
>> >             vtkFloatArray scalars = new vtkFloatArray();
>> >             for (int i = 0; i < 512; i++)
>> >             {
>> >                 for (int j = 0; j < 512; j++)
>> >                 {
>> >                     scalars.InsertTuple1(i * 512 + j, m_DoseMap[i * 512
>> + j]);
>> >                 }
>> >             }
>> >
>> >             vol.GetPointData().SetScalars(scalars);
>> >             vol.Update();
>> >
>> >             double[] DoseRange = vol.GetScalarRange();
>> >
>> >             vtkLookupTable LUT = new vtkLookupTable();
>> >             LUT.SetTableRange(DoseRange[0], DoseRange[1]);//min dose,max
>> dose
>> >             LUT.SetNumberOfColors(1000);
>> >             LUT.SetSaturationRange(1, 1);
>> >             LUT.SetHueRange(0.67, 0);//blue to red
>> >             LUT.SetAlphaRange(0, 0.3);//opacity
>> >             LUT.Build();
>> >
>> >             vtkImageMapToColors mapToRGBA = new vtkImageMapToColors();
>> >             mapToRGBA.SetInput(vol);
>> >             mapToRGBA.SetOutputFormatToRGBA();
>> >             mapToRGBA.SetLookupTable(LUT);
>> >
>> >             vtkImageMapper ColorMapper = new vtkImageMapper();
>> >             ColorMapper.SetInputConnection(mapToRGBA.GetOutputPort());
>> >             ColorMapper.SetColorWindow(255.0);
>> >             ColorMapper.SetColorLevel(127.5);
>> >
>> >             vtkActor2D ColorActor = new vtkActor2D();
>> >             ColorActor.SetMapper(ColorMapper);
>> >
>> >             vtkContourFilter cf = new vtkContourFilter();
>> >             cf.SetInput(vol);
>> >             //cf.SetValue(0,
>> Convert.ToDouble(dataGridViewIsodose.Rows[i].Cells[1].Value));
>> >             cf.SetValue(0, 100);
>> >             cf.Update();
>> >
>> >             vtkPolyDataMapper mapper = new vtkPolyDataMapper();
>> >             mapper.SetInputConnection(cf.GetOutputPort());
>> >             mapper.ScalarVisibilityOff();
>> >
>> >             vtkActor actor = new vtkActor();
>> >             actor.SetMapper(mapper);
>> >             actor.GetProperty().SetColor(1, 0, 0);
>> >
>> >             vtkImageViewer2 viewer = new vtkImageViewer2();
>> >             viewer.SetupInteractor(iren);
>> >             viewer.GetRenderer().AddActor(DicomActor);
>> >             viewer.GetRenderer().AddActor(ColorActor);
>> >             viewer.GetRenderer().AddActor(actor);
>> >             viewer.GetRenderer().ResetCamera();
>> >             viewer.Render();
>> >
>> > Thanks in advance.
>> >
>> > --
>> > С Уважением,
>> > Андрей.
>> > Best regards, Andrew
>> > _______________________________________________
>> > Powered by www.kitware.com
>> >
>> > Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>> >
>> > Please keep messages on-topic and check the VTK FAQ at:
>> http://www.vtk.org/Wiki/VTK_FAQ
>> >
>> > Follow this link to subscribe/unsubscribe:
>> > http://www.vtk.org/mailman/listinfo/vtkusers
>>
>>
>
>
> --
> С Уважением,
> Андрей.
> Best regards, Andrew
>
>
>


-- 
С Уважением,
Андрей.
Best regards, Andrew
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20100409/c7ebed99/attachment.htm>


More information about the vtkusers mailing list