<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)&#8230;I
am developing a multi planar reconstitution project for CT datasets using vtk
and java&#8230;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&#8230;I&#8217; 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>&#8220;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&#8221;<o:p></o:p></p>

<p class=MsoNormal>Sometimes it shows some other values, but i am not sure the accuracy
of them&#8230;I tried every possible combination with vtkExtractVOI,
vtkLinearExtrusionFilter etc&#8230; but couldn&#8217;t manage to fix this&#8230;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>&nbsp;</o:p></p>

<p class=MsoNormal><o:p>&nbsp;</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>&nbsp;</o:p></p>

<p class=MsoNormal>public class DensityWidget {<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</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(&quot;#00.0&quot;);<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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(&quot;EndInteractionEvent&quot;,
this, &quot;AdjustROI&quot;);<o:p></o:p></p>

<p class=MsoNormal>        itw.On();<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</o:p></p>

<p class=MsoNormal>    public void AdjustROI() {<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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 = &quot;&quot;;<o:p></o:p></p>

<p class=MsoNormal>            atext += &quot;n:&quot;;<o:p></o:p></p>

<p class=MsoNormal>            atext += aN;<o:p></o:p></p>

<p class=MsoNormal>            atext += &quot;\n&quot;;<o:p></o:p></p>

<p class=MsoNormal>            atext += &quot;min:&quot; + /*df.format*/
(amin[0]) + &quot; HU&quot;;<o:p></o:p></p>

<p class=MsoNormal>            atext += &quot;\n&quot;;<o:p></o:p></p>

<p class=MsoNormal>            atext += &quot;max:&quot; + /*df.format*/
(amax[0]) + &quot; HU&quot;;<o:p></o:p></p>

<p class=MsoNormal>            atext += &quot;\n&quot;;<o:p></o:p></p>

<p class=MsoNormal>            atext += &quot;mean:&quot; + /*df.format*/
(amean[0]) + &quot; HU&quot;;<o:p></o:p></p>

<p class=MsoNormal>            atext += &quot;\n&quot;;<o:p></o:p></p>

<p class=MsoNormal>            atext += &quot;den:&quot; + /*df.format*/ (den)
+ &quot; mm^3&quot;;<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(&quot;no ROI&quot;);<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>&nbsp;</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>&nbsp;</o:p></p>

<p class=MsoNormal>Thanks;<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Sercan&#8230;.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

</body>

</html>