<html><body><div style="color:#000; background-color:#fff; font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:12pt">Your suggestions helped fix me my bug!<br><br>I'll try your iterator. Maybe I can improve the speed of my algorithm with it.<br><br><br>On a different note:<br>Any ideas/suggestions on the display 2 data arrays in an vtkImageData at the same time? I would like an intensity image coloured by the input flag I (we) just added. A drr with multiple bones in which each bone has its own colour. Depending on which data array I use in vtkTexture I now see an intensity (xray) image or solid coloured bones. Should I create separate mask images and use them to show a transparent colour on top of the intensity image? or use stencils? <br><br>Thanks - Maarten<br><div><span><br></span></div><div style="display: block;" class="yahoo_quoted"> <div style="font-family: HelveticaNeue, Helvetica Neue, Helvetica,
 Arial, Lucida Grande, sans-serif; font-size: 12pt;"> <div style="font-family: HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif; font-size: 12pt;"> <div dir="ltr"> <font face="Arial" size="2"> On Thursday, May 8, 2014 11:11:55 AM, David Gobbi <david.gobbi@gmail.com> wrote:<br> </font> </div>  <div class="y_msg_container">Hi Maarten,<br clear="none"><br clear="none">I actually did write an iterator with such a function, but I never got<br clear="none">around to contributing it to VTK.  I called it vtkImageRegionIterator.<br clear="none">The source code is here:<br clear="none"><a shape="rect" href="http://github.com/dgobbi/AIRS/tree/master/ImageSegmentation" target="_blank">http://github.com/dgobbi/AIRS/tree/master/ImageSegmentation</a><br clear="none"><br clear="none">It has three separate inline methods for getting the voxel:<br clear="none">GetIndexX(), GetIndexY(), GetIndexZ().<br clear="none"><br clear="none">A
 couple years ago I had some big plans for improving the VTK<br clear="none">image iterators, but like so many things, there was never enough<br clear="none">time.<br clear="none"><br clear="none">  David<br clear="none"><br clear="none"><br clear="none"><div class="yqt0219172552" id="yqtfd43706"><br clear="none">On Thu, May 8, 2014 at 7:20 AM, Maarten Beek <<a shape="rect" ymailto="mailto:beekmaarten@yahoo.com" href="mailto:beekmaarten@yahoo.com">beekmaarten@yahoo.com</a>> wrote:<br clear="none">> Hi David,<br clear="none">><br clear="none">> Thanks so much for your clarification!<br clear="none">> I did see issues in the resulting image but was attributing them to noise in<br clear="none">> the original images. Now I see my code just had a huge bug in it.<br clear="none">><br clear="none">> I guess I would need a row counter in order to initialize voxelid correctly.<br clear="none">><br clear="none">> Wouldn't it
 be nice if the image iterator had a function like getVoxel(int<br clear="none">> ijk[3])...? I believe ITK has such an iterator.<br clear="none">><br clear="none">> Maarten<br clear="none">><br clear="none">><br clear="none">> On Wednesday, May 7, 2014 5:26:23 PM, David Gobbi <<a shape="rect" ymailto="mailto:david.gobbi@gmail.com" href="mailto:david.gobbi@gmail.com">david.gobbi@gmail.com</a>><br clear="none">> wrote:<br clear="none">> I should add: you actually have to re-initialize the voxelid at the<br clear="none">> beginning of each row (i.e. at the beginning of each span of the<br clear="none">> iterator).<br clear="none">><br clear="none">> On Wed, May 7, 2014 at 3:22 PM, David Gobbi <<a shape="rect" ymailto="mailto:david.gobbi@gmail.com" href="mailto:david.gobbi@gmail.com">david.gobbi@gmail.com</a>> wrote:<br clear="none">>> Hi Maarten,<br clear="none">>><br clear="none">>> Since
 you know it's a vtkUnsignedCharArray, you shouldn't be using<br clear="none">>> the SetTuple/GetTuple methods.  Use the SetTupleValue and<br clear="none">>> GetTupleValue methods, they're much faster because 1) they aren't<br clear="none">>> virtual methods and 2) they don't have to convert to/from double.<br clear="none">>> Or even better, if you know that your array only has one component,<br clear="none">>> you can use SetValue/GetValue.<br clear="none">>><br clear="none">>> Your math for voxelid is too simplistic.  Depending on how the update<br clear="none">>> extent is divided amongst the threads, it might give you a location<br clear="none">>> that is totally wrong.  To see why, draw a square on a piece of paper.<br clear="none">>> That square represents the total extent of the output.  Then divide<br clear="none">>> that square into quadrants, and imagine that
 each quadrant goes<br clear="none">>> to a different Execute method.  Then think about how each thread<br clear="none">>> is going to march through the data.<br clear="none">>><br clear="none">>>  David<br clear="none">>><br clear="none">>><br clear="none">>> On Wed, May 7, 2014 at 2:20 PM, Maarten Beek <<a shape="rect" ymailto="mailto:beekmaarten@yahoo.com" href="mailto:beekmaarten@yahoo.com">beekmaarten@yahoo.com</a>><br clear="none">>> wrote:<br clear="none">>>> Hi all,<br clear="none">>>><br clear="none">>>> I experienced a crash in my algorithm derived from<br clear="none">>>> vtkThreadedImageAlgorithm, that (I think) I solved, but that I don't<br clear="none">>>> understand. Is there some one who can shed some light on the following?<br clear="none">>>><br clear="none">>>> What I am trying to do is adding a flag
 identifying the input(s) that<br clear="none">>>> contribute to the value of each pixel in the output image<br clear="none">>>><br clear="none">>>><br clear="none">>>> //----------------------------------------------------------------------------<br clear="none">>>> // This templated function executes the filter for any type of data.<br clear="none">>>> template <class OT><br clear="none">>>> void cmvtkTemplatedExecute(cmvtkDRRGenerator2* self,<br clear="none">>>>                                vtkDataSetCollection* inputs,<br clear="none">>>> vtkImageData*<br clear="none">>>> output,<br clear="none">>>>                                int extent[6], int threadId, OT*)<br
 clear="none">>>> {<br clear="none">>>>    vtkUnsignedCharArray* uchararray =<br clear="none">>>><br clear="none">>>> vtkUnsignedCharArray::SafeDownCast(output->GetPointData()->GetScalars("input_flag"));<br clear="none">>>><br clear="none">>>>    int numinputs = inputs->GetNumberOfItems();<br clear="none">>>>    for( int input_i = 0; input_i < numinputs; ++input_i )<br clear="none">>>>    {<br clear="none">>>>        vtkImageData* input =<br clear="none">>>> vtkImageData::SafeDownCast(inputs->GetItem(input_i));<br clear="none">>>>        if( 0 == input )<br clear="none">>>>        {<br clear="none">>>>            // should not happen<br clear="none">>>>         
   continue;<br clear="none">>>>        }<br clear="none">>>>        const int* dims= output->GetDimensions();<br clear="none">>>><br clear="none">>>>        vtkImageProgressIterator<OT> outIt(output, extent, self,<br clear="none">>>> threadId);<br clear="none">>>>        vtkIdType voxelid = extent[0] + size[0]*extent[2] +<br clear="none">>>> size[0]*size[1]*extent[4];<br clear="none">>>><br clear="none">>>>        // Loop through output pixels<br clear="none">>>>        while( !outIt.IsAtEnd() )<br clear="none">>>>        {<br clear="none">>>>            OT* outSI = outIt.BeginSpan();<br clear="none">>>>            OT* outSIEnd
 = outIt.EndSpan();<br clear="none">>>><br clear="none">>>>            while( outSI != outSIEnd )<br clear="none">>>>            {<br clear="none">>>>                // start with setting pixel to 0.0<br clear="none">>>>                if( input_i == 0 )<br clear="none">>>>                {<br clear="none">>>>                    *outSI = 0.0;<br clear="none">>>>                }<br clear="none">>>><br clear="none">>>>                OT result = 0.0;<br clear="none">>>><br clear="none">>>>               
 //.... some math resulting in a value for result....<br clear="none">>>><br clear="none">>>>                *outSI += result;<br clear="none">>>><br clear="none">>>>                // this input image participates in voxel values; adjust<br clear="none">>>> bit<br clear="none">>>>                if( 0.0 < result && 0 != uchararray )<br clear="none">>>>                {<br clear="none">>>>                    // The commented code crashes...<br clear="none">>>><br clear="none">>>>                    //unsigned char oldvalue =<br clear="none">>>> uchararray->GetTuple1(voxelid);<br
 clear="none">>>>                    //unsigned char newvalue = oldvalue | (1<<input_i);<br clear="none">>>>                    //uchararray->SetTuple1(voxelid, newvalue);<br clear="none">>>><br clear="none">>>>                    double dOldValue;<br clear="none">>>>                    uchararray->GetTuple(voxelid, &dOldValue);<br clear="none">>>>                    unsigned char chOldValue = static_cast<unsigned<br clear="none">>>> char>(dOldValue);<br clear="none">>>>                    unsigned char chNewValue = chOldValue | (1<<input_i);<br
 clear="none">>>>                    double dNewValue = static_cast<double>(chNewValue);<br clear="none">>>>                    uchararray->SetTuple(voxelid, &dNewValue);<br clear="none">>>>                }<br clear="none">>>><br clear="none">>>>                ++outSI;<br clear="none">>>>                ++voxelid;<br clear="none">>>>            }<br clear="none">>>>            outIt.NextSpan();<br clear="none">>>>        }<br clear="none">>>>    } // input_i < numinputs<br clear="none">>>> }<br clear="none">><br clear="none">><br
 clear="none"></div><br><br></div>  </div> </div>  </div> </div></body></html>