[vtkusers] 2d image extrude into 3d object

Chris Kennedy vtk072404 at thinkpeak.com
Wed Jul 28 11:40:36 EDT 2004


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.







More information about the vtkusers mailing list