[vtkusers] Re: 2d image extrude into 3d object

Chris Kennedy vtk072404 at thinkpeak.com
Thu Jul 29 09:47:14 EDT 2004


hi Goodwin,
Thanks for the help. I was able to get the images into a 3d set of 
surfaces.

If you revisit the URL I have png2.* and region2.tcl, segmented1.tcl  
that construct the model. I've also implemented vtkImageShrink3D which 
makes it feasible to do some of the large image sizes.

thanks

Goodwin Lawlor wrote:

> Hi Chris
>  
> I looked at your images png.0.png ... png.9.png. The image dimensions 
> are 2800 x 2100 and each one looks like they contain multiple slices 
> rather than just one. The file pattern for these is "%s.%d.png"
>  
> MCubes will automatically cap the geometry if you add a (in your case) 
> a white slice, above and below your volume.
>  
> MCubes expect the background of a volume to be black and the body to 
> be white, ie, the opposite to what you have. This will effect the 
> "sidedness" or normals of the triangles created. You could use 
> vtkImageThreshold to invert the volume (set tissue value to 0) or play 
> around with vtkImageMathematics to do the same.
>  
> hth
>  
> Goodwin
>
>     ----- Original Message -----
>     From: Chris Kennedy <mailto:vtk072404 at thinkpeak.com>
>     To: Goodwin Lawlor <mailto:goodwin.lawlor at ucd.ie>
>     Cc: vtkusers at vtk.org <mailto:vtkusers at vtk.org>
>     Sent: Wednesday, July 28, 2004 6:48 PM
>     Subject: Re: [vtkusers] Re: 2d image extrude into 3d object
>
>     hi Goodwin,
>     Thanks for the reply, although you've confused me with what I
>     should do with my data. 
>
>     I reduced all the images down to 10% of their original size. Now
>     I'm using this tcl script, basically going from reader directly
>     into marching cubes. I get some geometry in my Viz window, cool!.
>
>     What are the commands to cap the geometry? ie, for each x-section
>     that is extruded into 3d I want the not only the surfaces
>     representing the Z direction walls, but also the surfaces in the
>     x-section plane.
>
>     # A script to reconstruct surfaces from segmented images
>     # Adapted from Bill Lorensen's segmented16.tcl,
>     http://www.crd.ge.com/~lorensen/seg12/
>     # Goodwin Lawlor, 2004
>
>     package require vtk
>     wm withdraw .
>     wm protocol . WM_DELETE_WINDOW {vtkCommand DeleteAllObjects; exit}
>
>
>     vtkPNGReader reader
>         reader SetFilePrefix "./png"
>         reader SetFilePattern %s.%d
>         reader SetDataExtent 0 255 0 255 1 9
>         reader SetDataScalarTypeToShort
>         # data is in acsii, space delimited format
>         # this data mask is just a trick to cut out the space.
>         #reader SetDataMask 0x00FF
>         reader SetDataByteOrderToLittleEndian
>         reader SetDataSpacing 1.0 1.0 10.0
>         # decimator complains so...
>         #reader GlobalWarningDisplayOff
>
>
>     vtkImageThreshold selectTissue
>         selectTissue SetInput [reader GetOutput]
>         selectTissue SetInValue 255
>         selectTissue SetOutValue 0
>         selectTissue ReplaceInOn
>         selectTissue ReplaceOutOn
>
>     vtkImageShrink3D shrinker
>          #shrinker SetInput [selectTissue GetOutput]
>          shrinker SetInput [reader GetOutput]
>          shrinker SetShrinkFactors 1 1 1
>          shrinker AveragingOn
>
>     vtkImageGaussianSmooth gaussian
>         gaussian SetInput [shrinker GetOutput]
>         gaussian SetDimensionality 3
>         gaussian SetStandardDeviation  0 0 0
>
>
>     vtkMarchingCubes mcubes;
>         #mcubes SetInput [gaussian GetOutput]
>         #mcubes SetInput [shrinker GetOutput]
>         mcubes SetInput [reader GetOutput]
>         mcubes ComputeScalarsOff
>         mcubes ComputeGradientsOff
>         mcubes ComputeNormalsOff
>         mcubes SetValue 0 127.5
>
>     vtkDecimate decimator
>         decimator SetInput [mcubes GetOutput]
>         decimator SetInitialFeatureAngle 60
>         decimator SetMaximumIterations 5
>         decimator SetMaximumSubIterations 0
>         decimator PreserveEdgesOn
>         decimator SetMaximumError 1.0
>         decimator SetTargetReduction 0.95
>         decimator SetInitialError 0.0002
>         decimator SetErrorIncrement 0.0002
>
>     vtkWindowedSincPolyDataFilter smoother
>         smoother SetInput [decimator GetOutput]
>         smoother SetNumberOfIterations 20
>         smoother SetPassBand 0.1
>         smoother SetFeatureAngle 60
>         smoother FeatureEdgeSmoothingOff
>         smoother NonManifoldSmoothingOff;
>
>     vtkPolyDataNormals normals
>         #normals SetInput [smoother GetOutput]
>         normals SetInput [decimator GetOutput]
>         normals SetFeatureAngle 60
>
>     vtkStripper stripper
>         stripper SetInput [normals GetOutput]
>
>     vtkXMLPolyDataWriter writer
>         writer SetInput [stripper GetOutput]
>
>     # Write and render the models
>
>     vtkRenderer ren
>     vtkMath math
>     set tissue 0
>     #foreach tissue {0 } {
>     # write the models to file
>         #selectTissue ThresholdBetween $tissue $tissue
>         #reader.Update()
>         writer SetFileName model$tissue.vtp
>         writer Write
>
>     #create readers, mappers, and actors
>     vtkXMLPolyDataReader reader$tissue
>         reader$tissue SetFileName model$tissue.vtp
>
>     vtkPolyDataMapper mapper$tissue
>         mapper$tissue SetInput [reader$tissue GetOutput]
>
>     vtkProperty prop$tissue
>         prop$tissue SetDiffuseColor [math Random] [math Random] [math
>     Random]
>         prop$tissue SetSpecularPower 50
>         prop$tissue SetSpecular .5
>         prop$tissue SetDiffuse .8
>
>     vtkActor actor$tissue
>         actor$tissue SetMapper mapper$tissue
>         actor$tissue SetProperty prop$tissue
>
>     ren AddActor actor$tissue
>     #}
>
>     vtkRenderWindow renWin
>         renWin AddRenderer ren
>         renWin SetSize 600 600
>     vtkRenderWindowInteractor iren
>         iren SetRenderWindow renWin
>         iren Initialize
>            
>        
>
>
>     thanks
>
>     Goodwin Lawlor wrote:
>
>>Hi Chris,
>>
>>Your images are already binary (black and white) so you dont need
>>vtkImageThreshold. In segemented.tcl you should use vtkPNGReader. Try to get
>>your data into either one 3D image or multiple 2D (single) cross-sections.
>>
>>hth
>>
>>Goodwin
>>
>>"Chris Kennedy" <vtk072404 at thinkpeak.com> wrote in message
>>news:4107C8F4.8010404 at thinkpeak.com...
>>  
>>
>>>hi,
>>>I'd like to take several 2d images that represent cross-sections at
>>>different elevations through an object. I have PNG files that are black
>>>and white, with black being the "metal" content in the object.  I only
>>>want to take the black pixels and extrude them some distance. I have
>>>several different X-sections and I will  take them into GoFly for some
>>>assembly/collision work.
>>>
>>>Each x-section is standalone, in that it doesn't have to be averaged
>>>into the x-section above or below it.
>>>
>>>I've been trying to follow the seg12 example
>>>http://www.crd.ge.com/~lorensen/seg12/ using python instead. I have vtk
>>>recompiled with the required patented methods also. I get an error
>>>
>>>ERROR: In C:\apps\VTK42\Patented\vtkMarchingCubes.cxx, line 420
>>>vtkMarchingCubes (0x01E03640): Cannot contour data of dimension != 3
>>>
>>>thus I'm not applying a proper filter to the image.
>>>I suspect in I need to specify additional operations to get the image
>>>into a proper 3d format.  I don't understand what input the
>>>SetVectorInput option needs, for instance or if it is applicable here.
>>>
>>>At http://www.thinkpeak.com/cust/vtk/ I have sample png files and 2 tcl
>>>files.  The tcl files are similiar to what Goodwin posted to help Vidya,
>>>but I haven't been able to get that configured properly either...
>>>
>>>here is the python code:
>>>
>>>#!/usr/bin/env python
>>>
>>>
>>>fname='m10'
>>>slice_order='is'
>>>#file_pattern=%s.png
>>>#study=.
>>>pixel_size=1.0
>>>spacing=100.0
>>>start_slice=10
>>>end_slice=19
>>>zmax=end_slice-start_slice
>>>#voi="0=255=0=255=0=$zmax"
>>>sample_rate="1 1 1"
>>>decimate_reduction=.95
>>>decimate_iterations=5
>>>decimate_error=.0002
>>>decimate_error_increment=.0002
>>>decimate_angle=60
>>>smooth_iterations=0
>>>smooth_expand=-.34
>>>smooth_shrink=.33
>>>smooth_factor=.1
>>>smooth_angle=60
>>>feature_angle=60
>>>gaussian_standard_deviation=2
>>>
>>>import vtk
>>>from vtk.util.misc import vtkGetDataRoot
>>>VTK_DATA_ROOT = vtkGetDataRoot()
>>>
>>># Create the image
>>>reader = vtk.vtkPNGReader()
>>>reader.SetFilePrefix("./png")
>>>reader.SetFilePattern('%s.%d')
>>>reader.SetDataSpacing(0.8, 0.8, 1.5)
>>>#reader.SetFileName(VTK_DATA_ROOT + "/Data/fran_cut.png")
>>>reader.SetDataByteOrderToLittleEndian()
>>>reader.SetDataExtent(0,255,0,255,1,9,)
>>>reader.SetDataScalarTypeToShort()
>>>reader.SetDataSpacing(1, 1, 100)
>>>#reader.SetDataMask(0x7fff)
>>>
>>>#
>>># select the metal, two rgb values in png file:
>>># 255 - white
>>># 0 - black
>>>selectMetal=vtk.vtkImageThreshold()
>>>selectMetal.ReleaseDataFlagOff()
>>>selectMetal.ReplaceInOn()
>>>selectMetal.ReplaceOutOn()
>>>selectMetal.ThresholdBetween(0,0)
>>>selectMetal.SetInValue(0)
>>>selectMetal.SetOutValue(0)
>>>selectMetal.SetInput(reader.GetOutput())
>>>#selectMetal.Print()  # what's proper syntax?
>>>
>>>
>>># I don't think I need this action...
>>>gaussian=vtk.vtkImageGaussianSmooth()
>>>gaussian.SetDimensionality(3)
>>>gaussian.SetStandardDeviation(gaussian_standard_deviation)
>>>gaussian.SetInput(selectMetal.GetOutput())
>>>#gaussian.Print()    # what's the syntax?
>>>
>>>toStructuredPoints=vtk.vtkImageToStructuredPoints()
>>>toStructuredPoints.SetInput(gaussian.GetOutput())
>>>#toStructuredPoints.SetVectorInput(10)
>>># need more processing here... ie, how to specify thickness?
>>>
>>>mcubes=vtk.vtkMarchingCubes()
>>>mcubes.SetInput(toStructuredPoints.GetOutput())
>>>mcubes.ComputeScalarsOff()
>>>mcubes.ComputeGradientsOff()
>>>mcubes.ComputeNormalsOff()
>>>mcubes.SetValue(0,0)
>>>#mcubes.GetOutput()
>>>
>>>decimator=vtk.vtkDecimate()
>>>decimator.SetInput(mcubes.GetOutput())
>>>decimator.SetInitialFeatureAngle(decimate_angle)
>>>decimator.SetMaximumIterations(decimate_iterations)
>>>decimator.SetMaximumSubIterations(0)
>>>decimator.PreserveEdgesOn()
>>>decimator.SetMaximumError(1)
>>>decimator.SetTargetReduction(decimate_reduction)
>>>decimator.SetInitialError(decimate_error)
>>>decimator.SetErrorIncrement(decimate_error_increment)
>>>
>>>smoother=vtk.vtkSmoothPolyDataFilter()
>>>smoother.SetInput(decimator.GetOutput())
>>>smoother.SetNumberOfIterations(smooth_iterations)
>>>smoother.SetRelaxationFactor(smooth_factor)
>>>smoother.SetFeatureAngle(smooth_angle)
>>>smoother.FeatureEdgeSmoothingOff()
>>>smoother.BoundarySmoothingOff()
>>>smoother.SetConvergence(0)
>>>
>>>normals=vtk.vtkPolyDataNormals()
>>>normals.SetInput(smoother.GetOutput())
>>>normals.SetFeatureAngle(feature_angle)
>>>
>>>stripper=vtk.vtkStripper()
>>>stripper.SetInput(normals.GetOutput())
>>>
>>>writer=vtk.vtkPolyDataWriter()
>>>writer.SetInput(stripper.GetOutput())
>>>writer.SetFileName(fname+'.vtk')
>>>writer.SetFileType(2)
>>>
>>>mapOutline = vtk.vtkPolyDataMapper()
>>>mapOutline.SetInput(stripper.GetOutput())
>>>outline = vtk.vtkActor()
>>>outline.SetMapper(mapOutline)
>>>outline.GetProperty().SetColor(0, 0, 0)
>>>
>>>
>>>reader.Update()
>>>#shiftScale.Update()
>>>selectMetal.Update()
>>>#wpng.Update()
>>>gaussian.Update()
>>>toStructuredPoints.Update()
>>>#mcubes.Update()
>>>#decimator.Update()
>>>#smoother.Update()
>>>#normals.Update()
>>>#stripper.Update()
>>>
>>>
>>>aCamera = vtk.vtkCamera()
>>>aCamera.SetViewUp(0, 0, -1)
>>>aCamera.SetPosition(1, 1, 1)
>>>aCamera.SetFocalPoint(0, 0, 0)
>>>aCamera.ComputeViewPlaneNormal()
>>>
>>>
>>>
>>>ia = vtk.vtkImageActor()
>>>#ia.SetInput(shiftScale.GetOutput())
>>>ia.SetInput(selectMetal.GetOutput())
>>>
>>># Create the RenderWindow, Renderer and both Actors
>>>ren = vtk.vtkRenderer()
>>>renWin = vtk.vtkRenderWindow()
>>>renWin.AddRenderer(ren)
>>>iren = vtk.vtkRenderWindowInteractor()
>>>iren.SetRenderWindow(renWin)
>>>iren.Initialize()
>>>
>>># Actors are added to the renderer. An initial camera view is created.
>>># The Dolly() method moves the camera towards the FocalPoint,
>>># thereby enlarging the image.
>>>ren.AddActor(outline)
>>>ren.SetActiveCamera(aCamera)
>>>ren.ResetCamera()
>>>aCamera.Dolly(1.5)
>>>
>>># Add the actors to the renderer, set the background and size
>>>ren.AddActor(ia)
>>>ren.SetBackground(0.14, 0.2, 0.4)
>>>renWin.SetSize(300, 300)
>>>
>>>renWin.Render()
>>>
>>>cam1 = ren.GetActiveCamera()
>>>
>>>ren.ResetCameraClippingRange()
>>>
>>>renWin.Render()
>>>iren.Start()
>>>
>>>
>>>=======================================================
>>>
>>>How do I select pixels of a certain value from the image?
>>>What processing needs to be done so that the data can be operated on by
>>>MarchingCubes?
>>>
>>>I would like to get an assembly of these stacked images (converted into
>>>3d objects), and then  do  additional geometry definitions and then take
>>>it into  GoFly.
>>>Extensions I'd like to make to this:
>>>   - each image x-section may have a unique thickness
>>>   - the x-section in image png.9 actually represent spheres, not
>>>cylinders.
>>>   - I want to define additional rectangular volumes, and spline tubes
>>>and have this in the assembly file that is generated also
>>>   - names (metadata) assigned here and carried forward into GoFly
>>>
>>>Thanks for any assistance.
>>>
>>>Chris Kennedy
>>>Think Peak, Inc.
>>>
>>>
>>>
>>>
>>>_______________________________________________
>>>This is the private VTK discussion list.
>>>Please keep messages on-topic. Check the FAQ at:
>>>    
>>>
>><http://public.kitware.com/cgi-bin/vtkfaq>
>>  
>>
>>>Follow this link to subscribe/unsubscribe:
>>>http://www.vtk.org/mailman/listinfo/vtkusers
>>>
>>>    
>>>
>>
>>
>>
>>_______________________________________________
>>This is the private VTK discussion list. 
>>Please keep messages on-topic. Check the FAQ at: <http://public.kitware.com/cgi-bin/vtkfaq>
>>Follow this link to subscribe/unsubscribe:
>>http://www.vtk.org/mailman/listinfo/vtkusers
>>
>>  
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20040729/0ef1d063/attachment.htm>


More information about the vtkusers mailing list