<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=Content-Type content="text/html; charset=iso-8859-9">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.E-postaStili17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page Section1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang=TR link=blue vlink=purple>
<div class=Section1>
<p class=MsoNormal>Hi everyone;<o:p></o:p></p>
<p class=MsoNormal>I have a problem with vtkImageTracerWidget (i think)…I
am developing a multi planar reconstitution project for CT datasets using vtk
and java…I want to draw a closed region on a vtkImageActor and then calculate
the voxel count, min , max scalar values in this region and the density of this
region…I’ ve implemented the class below , but something goes wrong
here so sometimes the output of the textactor becomes: <o:p></o:p></p>
<p class=MsoNormal>“n:0<o:p></o:p></p>
<p class=MsoNormal>min:1.0E299 HU<o:p></o:p></p>
<p class=MsoNormal>max:-1.0E299 HU<o:p></o:p></p>
<p class=MsoNormal>mean:0.0 HU<o:p></o:p></p>
<p class=MsoNormal>den:0.0 mm^3”<o:p></o:p></p>
<p class=MsoNormal>Sometimes it shows some other values, but i am not sure the accuracy
of them…I tried every possible combination with vtkExtractVOI,
vtkLinearExtrusionFilter etc… but couldn’t manage to fix this…What
is wrong with this code? :<o:p></o:p></p>
<p class=MsoNormal>(Panel is an instance of vtkCanvas, and reslice is the
active vtkImageReslice)<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>import client3d.MPRPanel;<o:p></o:p></p>
<p class=MsoNormal>import vtk.vtkExtractVOI;<o:p></o:p></p>
<p class=MsoNormal>import vtk.vtkImageAccumulate;<o:p></o:p></p>
<p class=MsoNormal>import vtk.vtkImageStencil;<o:p></o:p></p>
<p class=MsoNormal>import vtk.vtkImageTracerWidget;<o:p></o:p></p>
<p class=MsoNormal>import vtk.vtkLinearExtrusionFilter;<o:p></o:p></p>
<p class=MsoNormal>import vtk.vtkPolyData;<o:p></o:p></p>
<p class=MsoNormal>import vtk.vtkPolyDataToImageStencil;<o:p></o:p></p>
<p class=MsoNormal>import vtk.vtkTextActor;<o:p></o:p></p>
<p class=MsoNormal>import vtk.vtkTextProperty;<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>public class DensityWidget {<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> private vtkImageTracerWidget itw;<o:p></o:p></p>
<p class=MsoNormal> private vtkExtractVOI extract;<o:p></o:p></p>
<p class=MsoNormal> private vtkLinearExtrusionFilter extrude;<o:p></o:p></p>
<p class=MsoNormal> private MPRPanel panel;<o:p></o:p></p>
<p class=MsoNormal> private vtkPolyData poly;<o:p></o:p></p>
<p class=MsoNormal> vtkImageStencil stencil;<o:p></o:p></p>
<p class=MsoNormal> private double[] range;<o:p></o:p></p>
<p class=MsoNormal> private double min;<o:p></o:p></p>
<p class=MsoNormal> private double max;<o:p></o:p></p>
<p class=MsoNormal> private double diff;<o:p></o:p></p>
<p class=MsoNormal> private double avg;<o:p></o:p></p>
<p class=MsoNormal> private double[] bounds;<o:p></o:p></p>
<p class=MsoNormal> private vtkImageAccumulate accum;<o:p></o:p></p>
<p class=MsoNormal> private vtkTextActor textActor;<o:p></o:p></p>
<p class=MsoNormal> java.text.DecimalFormat df = new
java.text.DecimalFormat("#00.0");<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> public DensityWidget(MPRPanel panel) {<o:p></o:p></p>
<p class=MsoNormal> this.panel = panel;<o:p></o:p></p>
<p class=MsoNormal> itw = new vtkImageTracerWidget();<o:p></o:p></p>
<p class=MsoNormal> extract = new vtkExtractVOI();<o:p></o:p></p>
<p class=MsoNormal> extrude = new vtkLinearExtrusionFilter();<o:p></o:p></p>
<p class=MsoNormal> poly = new vtkPolyData();<o:p></o:p></p>
<p class=MsoNormal> stencil = new vtkImageStencil();<o:p></o:p></p>
<p class=MsoNormal> accum = new vtkImageAccumulate();<o:p></o:p></p>
<p class=MsoNormal> textActor = new vtkTextActor();<o:p></o:p></p>
<p class=MsoNormal> createVTKPipeline();<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> public void createVTKPipeline() {<o:p></o:p></p>
<p class=MsoNormal>
extract.SetVOI(panel.getReslice().GetOutputExtent());<o:p></o:p></p>
<p class=MsoNormal> extract.SetSampleRate(1, 1, 1);<o:p></o:p></p>
<p class=MsoNormal> extract.SetInput(panel.getImagedata());<o:p></o:p></p>
<p class=MsoNormal> extract.ReleaseDataFlagOff();<o:p></o:p></p>
<p class=MsoNormal> extract.Update();<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> this.range = extract.GetOutput().GetScalarRange();<o:p></o:p></p>
<p class=MsoNormal> this.min = range[0];<o:p></o:p></p>
<p class=MsoNormal> this.max = range[1];<o:p></o:p></p>
<p class=MsoNormal> this.diff = max - min;<o:p></o:p></p>
<p class=MsoNormal> this.avg = (max + min) * 0.5;<o:p></o:p></p>
<p class=MsoNormal> this.bounds = extract.GetOutput().GetBounds();<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> itw.SetCaptureRadius(100000);<o:p></o:p></p>
<p class=MsoNormal> itw.GetGlyphSource().SetColor(1, 0, 0);<o:p></o:p></p>
<p class=MsoNormal> itw.GetGlyphSource().SetScale(3.0);<o:p></o:p></p>
<p class=MsoNormal> itw.GetGlyphSource().SetRotationAngle(45.0);<o:p></o:p></p>
<p class=MsoNormal> itw.GetGlyphSource().Modified();<o:p></o:p></p>
<p class=MsoNormal> itw.ProjectToPlaneOn();<o:p></o:p></p>
<p class=MsoNormal> itw.SetProjectionNormalToZAxes();<o:p></o:p></p>
<p class=MsoNormal> itw.SetViewProp(panel.getImageactor());<o:p></o:p></p>
<p class=MsoNormal> itw.SetInput(panel.getImagedata());<o:p></o:p></p>
<p class=MsoNormal> itw.SetInteractor(panel.getIren());<o:p></o:p></p>
<p class=MsoNormal> itw.PlaceWidget();<o:p></o:p></p>
<p class=MsoNormal> itw.SnapToImageOn();<o:p></o:p></p>
<p class=MsoNormal> itw.AutoCloseOn();<o:p></o:p></p>
<p class=MsoNormal> itw.AddObserver("EndInteractionEvent",
this, "AdjustROI");<o:p></o:p></p>
<p class=MsoNormal> itw.On();<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> extrude.SetScaleFactor(1);<o:p></o:p></p>
<p class=MsoNormal> extrude.SetExtrusionTypeToNormalExtrusion();<o:p></o:p></p>
<p class=MsoNormal> extrude.SetVector(0, 0, 1);<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> stencil.SetInputConnection(extract.GetOutputPort());<o:p></o:p></p>
<p class=MsoNormal> stencil.ReverseStencilOff();<o:p></o:p></p>
<p class=MsoNormal> stencil.SetBackgroundValue(128);<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> accum.SetInputConnection(extract.GetOutputPort());<o:p></o:p></p>
<p class=MsoNormal> accum.ReverseStencilOff();<o:p></o:p></p>
<p class=MsoNormal> accum.SetComponentSpacing(1, 0, 0);<o:p></o:p></p>
<p class=MsoNormal> accum.SetComponentExtent(0, (int) diff, 0, 0, 0, 0);<o:p></o:p></p>
<p class=MsoNormal> accum.SetComponentOrigin(min, 0, 0);<o:p></o:p></p>
<p class=MsoNormal> accum.ReleaseDataFlagOff();<o:p></o:p></p>
<p class=MsoNormal> accum.ReverseStencilOff();<o:p></o:p></p>
<p class=MsoNormal> accum.IgnoreZeroOff();<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> vtkTextProperty prop = new vtkTextProperty();<o:p></o:p></p>
<p class=MsoNormal> prop.SetFontSize(10);<o:p></o:p></p>
<p class=MsoNormal> prop.SetFontFamilyToArial();<o:p></o:p></p>
<p class=MsoNormal> prop.BoldOff();<o:p></o:p></p>
<p class=MsoNormal> prop.ItalicOff();<o:p></o:p></p>
<p class=MsoNormal> prop.ShadowOff();<o:p></o:p></p>
<p class=MsoNormal> prop.SetLineSpacing(0.9);<o:p></o:p></p>
<p class=MsoNormal> prop.SetJustificationToLeft();<o:p></o:p></p>
<p class=MsoNormal> prop.SetVerticalJustificationToTop();<o:p></o:p></p>
<p class=MsoNormal> prop.SetColor(1, 1, 0);<o:p></o:p></p>
<p class=MsoNormal> textActor.ScaledTextOff();<o:p></o:p></p>
<p class=MsoNormal> textActor.SetPosition(100, 40);<o:p></o:p></p>
<p class=MsoNormal> textActor.SetTextProperty(prop);<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> panel.GetRenderer().AddActor(textActor);<o:p></o:p></p>
<p class=MsoNormal> panel.resetCameraClippingRange();<o:p></o:p></p>
<p class=MsoNormal> panel.Render();<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> public void AdjustROI() {<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> int closed = itw.IsClosed();<o:p></o:p></p>
<p class=MsoNormal> if (closed == 1) {<o:p></o:p></p>
<p class=MsoNormal> itw.GetPath(poly);<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> extrude.SetInput(poly);<o:p></o:p></p>
<p class=MsoNormal> extrude.Update();<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> vtkPolyDataToImageStencil dataToStencil = new
vtkPolyDataToImageStencil();<o:p></o:p></p>
<p class=MsoNormal> dataToStencil.SetInputConnection(extrude.GetOutputPort());<o:p></o:p></p>
<p class=MsoNormal>
dataToStencil.SetOutputSpacing(extract.GetOutput().GetSpacing());<o:p></o:p></p>
<p class=MsoNormal>
dataToStencil.SetOutputOrigin(extract.GetOutput().GetOrigin());<o:p></o:p></p>
<p class=MsoNormal> dataToStencil.SetOutputWholeExtent(extract.GetOutput().GetExtent());<o:p></o:p></p>
<p class=MsoNormal> dataToStencil.Update();<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> stencil.SetStencil(dataToStencil.GetOutput());<o:p></o:p></p>
<p class=MsoNormal> stencil.Update();<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> accum.SetStencil(stencil.GetStencil());<o:p></o:p></p>
<p class=MsoNormal> accum.Update();<o:p></o:p></p>
<p class=MsoNormal> int aN = accum.GetVoxelCount();<o:p></o:p></p>
<p class=MsoNormal> double amin[] = accum.GetMin();<o:p></o:p></p>
<p class=MsoNormal> double amax[] = accum.GetMax();<o:p></o:p></p>
<p class=MsoNormal> double amean[] = accum.GetMean();<o:p></o:p></p>
<p class=MsoNormal> double den = Math.abs(amean[0]) *
panel.getSpacing()[0] * panel.getSpacing()[1] * panel.getSpacing()[2];<o:p></o:p></p>
<p class=MsoNormal> String atext = "";<o:p></o:p></p>
<p class=MsoNormal> atext += "n:";<o:p></o:p></p>
<p class=MsoNormal> atext += aN;<o:p></o:p></p>
<p class=MsoNormal> atext += "\n";<o:p></o:p></p>
<p class=MsoNormal> atext += "min:" + /*df.format*/
(amin[0]) + " HU";<o:p></o:p></p>
<p class=MsoNormal> atext += "\n";<o:p></o:p></p>
<p class=MsoNormal> atext += "max:" + /*df.format*/
(amax[0]) + " HU";<o:p></o:p></p>
<p class=MsoNormal> atext += "\n";<o:p></o:p></p>
<p class=MsoNormal> atext += "mean:" + /*df.format*/
(amean[0]) + " HU";<o:p></o:p></p>
<p class=MsoNormal> atext += "\n";<o:p></o:p></p>
<p class=MsoNormal> atext += "den:" + /*df.format*/ (den)
+ " mm^3";<o:p></o:p></p>
<p class=MsoNormal> System.out.println(atext);<o:p></o:p></p>
<p class=MsoNormal> textActor.SetInput(atext);<o:p></o:p></p>
<p class=MsoNormal> textActor.Modified();<o:p></o:p></p>
<p class=MsoNormal> textActor.SetPosition(150, 60);<o:p></o:p></p>
<p class=MsoNormal> } else {<o:p></o:p></p>
<p class=MsoNormal> textActor.SetInput("no ROI");<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> panel.Render();<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> public void destroy() {<o:p></o:p></p>
<p class=MsoNormal> itw.Off();<o:p></o:p></p>
<p class=MsoNormal> textActor.VisibilityOff();<o:p></o:p></p>
<p class=MsoNormal> extract.Delete();<o:p></o:p></p>
<p class=MsoNormal> extrude.Delete();<o:p></o:p></p>
<p class=MsoNormal> stencil.Delete();<o:p></o:p></p>
<p class=MsoNormal> accum.Delete();<o:p></o:p></p>
<p class=MsoNormal> textActor.Delete();<o:p></o:p></p>
<p class=MsoNormal> itw.Delete();<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal>}<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Thanks;<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Sercan….<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
</div>
</body>
</html>