[vtkusers] Bug in vtkTIFFReader reading multi-paged tiff file

David Gobbi david.gobbi at gmail.com
Fri Jan 17 15:43:22 EST 2014


Until VTK 5.10, vtkImageActor required uchar data.  Since VTK 5.10, it
converts non-uchar data into uchar data before rendering.  Take a look
at the SetLookupTable() method of vtkImageProperty.

On Fri, Jan 17, 2014 at 1:34 PM, Maarten Beek <beekmaarten at yahoo.com> wrote:
> I think I have it working now.
>
> Set opacity for 2d image to 1.0 (removed SetOpacity(0.5) call)
>
> Changed image data of 3d tiff image into unsigned char (vtkShiftScale) and
> called tiffactor->SetOpacity(0.5).
>
> Order of loading actors into renderer doesn't seem to be an issue.
> I am not using my custom addalpha algorithm, so the tiff image has one
> component.
>
> Not sure I fully understand...
> The HasTransparency() function of vtkImageActor requires uchar data and 2 or
> 4 components in order to return 1...
>
> Anyway - I go into the weekend happily.
> Thanks again for all your time.
>
> Maarten
>
>
> On Friday, January 17, 2014 3:10:33 PM, David Gobbi <david.gobbi at gmail.com>
> wrote:
> You would have to turn depth peeling on explicitly in order to enable
> it, so if you haven't turned it on, we can be pretty sure that it
> isn't being used.
>
> So I can't understand why the translucency isn't working for you.
> I've done translucency in VTK quite a bit (and I still do).  I've done
> it with vtkActor and vtkTexture, with vtkImageActor, and with
> vtkImageSliceMapper.  The only trick I've ever had to use is that with
> vtkTexture and vtkImageActor, the alpha component of the image is
> ignored unless I set the opacity to a value less than 1.0.
>
> There are even VTK regression tests for image alpha blending:
> TestTranslucentImageActorAlphaBlending, TestImageSliceMapperAlpha.
>
>   David
>
> On Fri, Jan 17, 2014 at 12:51 PM, Maarten Beek <beekmaarten at yahoo.com>
> wrote:
>> no - at least not intentionally.
>>
>>
>>
>>
>> On Friday, January 17, 2014 2:50:04 PM, David Gobbi
>> <david.gobbi at gmail.com>
>> wrote:
>> Are you doing anything that would interfere with the alpha blending,
>> like using depth peeling?
>>
>> On Fri, Jan 17, 2014 at 12:26 PM, Maarten Beek <beekmaarten at yahoo.com>
>> wrote:
>>> Setting the opacity in the callback would enable me to check the order in
>>> which they were added to the renderer:
>>>
>>>            if( m_pWidget->m_pDrrActor && m_pWidget->m_pTIFFActor )
>>>            {
>>>                vtkPropCollection* props =
>>> m_pWidget->m_pRenderer->GetViewProps();
>>>                props->InitTraversal();
>>>                vtkProp* prop = NULL;
>>>                while( prop = props->GetNextProp() )
>>>                {
>>>                    if( prop ==
>>> vtkProp::SafeDownCast(m_pWidget->m_pDrrActor) )
>>>                    {
>>>                        m_pWidget->m_pDrrActor->SetOpacity(1.0);
>>>                        m_pWidget->m_pTIFFActor->SetOpacity(0.5);
>>>                        break;
>>>                    }
>>>                    if( prop ==
>>> vtkProp::SafeDownCast(m_pWidget->m_pTIFFActor) )
>>>                    {
>>>                        m_pWidget->m_pTIFFActor->SetOpacity(1.0);
>>>                        m_pWidget->m_pDrrActor->SetOpacity(0.5);
>>>                        break;
>>>                    }
>>>                }
>>>            }
>>>
>>> Didn't solve to problem though....
>>>
>>> I have made an algorithm that adds an alpha value to the tiff image:
>>>
>>>    vtkImageIterator<T> inIt(inData, outExt);
>>>    vtkImageIterator<float> outIt(outData, outExt);
>>>    int numIn = inData->GetNumberOfScalarComponents();
>>>    float alpha = self->GetAlpha();
>>>
>>>    // Loop through ouput pixels
>>>    while( !outIt.IsAtEnd() )
>>>    {
>>>        T* inSI = inIt.BeginSpan();
>>>        float* outSI = outIt.BeginSpan();
>>>        float* outSIEnd = outIt.EndSpan();
>>>        while( outSI < outSIEnd )
>>>        {
>>>            // now process the components
>>>            for( int i = 0; i < numIn; ++i )
>>>            {
>>>                *outSI = static_cast<float>(*inSI);
>>>                ++outSI;
>>>                ++inSI;
>>>            }
>>>            *outSI = alpha;
>>>            ++outSI;
>>>        }
>>>        inIt.NextSpan();
>>>        outIt.NextSpan();
>>>    }
>>>
>>> in order to go through vtkImageActor::HasTranslucentPolygonalGeometry()
>>> successfully.
>>>
>>> Didn't solve it either.
>>>
>>> I checked an older app of me in which I overlayed a transparent binary
>>> image
>>> on top of its original image. This worked fine using vtkActors. But in
>>> the
>>> example both images had the same extent and the order of the actors was
>>> predetermined.
>>>
>>> Maarten
>>>
>>>
>>> On Thursday, January 16, 2014 5:30:47 PM, David Gobbi
>>> <david.gobbi at gmail.com> wrote:
>>> On Thu, Jan 16, 2014 at 3:13 PM, Maarten Beek <beekmaarten at yahoo.com>
>>> wrote:
>>>> I think I want to blend 50/50, so I could set the opacity accordingly in
>>>> a
>>>> callback initiated by a StartRender event?
>>>
>>> You can set the opacity anywhere.  You just have to make sure that the
>>> opacity
>>> is set correctly, and you have to make sure that the images are in the
>>> correct order. The thing about the images being in the correct order
>>> is non-negotiable.  You have to do it.  Playing with depth isn't going
>>> to help.  The images actually have to be rendered in the right order
>>> (an opaque image first, and a 50% opacity image after).
>>>
>>>> I have played around with vtkImageStack; I seemed to get only the first
>>>> (or
>>>> last) image of the stack or (with transparency) all images blended
>>>> together... I want one image of the stack blended with another (2d)
>>>> image.
>>>> Secondly, I thought creating 100 actors and adding them to a stack was
>>>> quite
>>>> slow.
>>>
>>> Were you setting layer numbers (in the vtkImageProperty) for the images
>>> that
>>> you added to the stack?  Were you setting VisibilityOff for the images
>>> that
>>> you
>>> didn't want to show, and setting the correct Opacity for the images that
>>> you
>>> wanted to blend?
>>>
>>> David
>>>
>>>
>>>
>>>
>>>> On Thursday, January 16, 2014 4:58:53 PM, David Gobbi
>>>> <david.gobbi at gmail.com> wrote:
>>>> On Thu, Jan 16, 2014 at 2:45 PM, Maarten Beek <beekmaarten at yahoo.com>
>>>> wrote:
>>>>> vtkImageActor::HasTranslucentPolygonalGeometry() seems to want image
>>>>> data
>>>>> of
>>>>> type unsigned char and 2 or 4 components in order to do transparency.
>>>>> I'm
>>>>> using vtkImageShiftScale to get unsigned char and am working on an
>>>>> algorithm
>>>>> to add an alpha component to my one component tiff data. Curious if
>>>>> this
>>>>> does the trick.
>>>>
>>>> I strongly suggest that you use vtkImageSliceMapper and vtkImageSlice
>>>> to display your images instead of using vtkImageActor.
>>>>
>>>>> I can understand the order is important if one of the actor is opaque,
>>>>> but
>>>>> why would this still be important when both are 50% transparent.
>>>>
>>>> That's not how alpha-blending works.  If both images are 50%, then the
>>>> frontmost image is displayed at 50%, and the second image gets 25%,
>>>> and the background gets the remaining 25%.  That's how translucency
>>>> works, both in real-life and in computer graphics.
>>>>
>>>> If you want to blend images 50/50, then the frontmost image should have
>>>> 50% opacity and the backmost image should have 100% opacity.
>>>>
>>>>> In my app the loading of each image is initiated through a button. I
>>>>> would
>>>>> like to create an app which is independent of the order in which the
>>>>> user
>>>>> clicks these buttons.
>>>>
>>>> Order is crucial.  That's why I recommend that you use vtkImageStack.
>>>> It makes it possible to explicitly set the layer number for each image.
>>>>
>>>>  - David
>>>>
>>>>
>>>>
>>>>> On Thursday, January 16, 2014 3:25:11 PM, David Gobbi
>>>>> <david.gobbi at gmail.com> wrote:
>>>>> Are you using vtk-master (or perhaps a vtk 6.1 release candidate)?
>>>>> The TIFF reader had a serious multi-frame bug in older versions.
>>>>>
>>>>> First, note that the vtkTIFFReader doesn't just give you the raw data
>>>>> from the files, it seems to pass it through a lookup table sometimes.
>>>>> And I'm not sure exactly how it deals with alpha, and to be honest,
>>>>> I wouldn't trust it.
>>>>>
>>>>> I'm really not sure what you mean when you say "The order of adding
>>>>> the actors to the renderer matters, but I try to avoid this by using
>>>>> transparency."  The order in which you add images is _crucial_ when
>>>>> you are using transparency.
>>>>>
>>>>> Are you using the vtkImageStack?  It's a class that is designed
>>>>> specifically to handle layered rendering of images.
>>>>>
>>>>>  David
>>>>>
>>>>>
>>>>>
>>>>> On Thu, Jan 16, 2014 at 12:40 PM, Maarten Beek <beekmaarten at yahoo.com>
>>>>> wrote:
>>>>>> Hi David,
>>>>>>
>>>>>> Is it possible to show all images in a multi-paged tiff transparently?
>>>>>>
>>>>>> Only when I show the 1st image (page), I see a 2nd 2d image (both are
>>>>>> transparent).
>>>>>> As soon as I move to another tiff image (page), the 2d image
>>>>>> disappears.
>>>>>> It
>>>>>> returns when I move back to the 1st tiff page.
>>>>>>
>>>>>> The multi-paged tiff is one component, and I am thinking of an
>>>>>> algorithm
>>>>>> to
>>>>>> add an alpha component, but can hardly believe this would be
>>>>>> required...
>>>>>>
>>>>>> The order of adding the actors to the renderer matters, but I try to
>>>>>> avoid
>>>>>> this by using transparency.
>>>>>>
>>>>>> Moving one image in front of the other by changing its z-coordinate
>>>>>> using
>>>>>> vtkImageActor::SetPosition() doesn't help.
>>>>>>
>>>>>> Maarten
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Friday, November 8, 2013 4:36:06 PM, Maarten Beek
>>>>>> <beekmaarten at yahoo.com>
>>>>>> wrote:
>>>>>> Hi David,
>>>>>>
>>>>>> Using VTK 6.0.0, sorry ;-)
>>>>>>
>>>>>> Should I send you the tiff file so you can play with it?
>>>>>>
>>>>>> Now I seem to have your attention:
>>>>>>
>>>>>> - How do I display a multi-page tif? I don't seem to see the different
>>>>>> images using a vtkImageSlice.
>>>>>>
>>>>>> - What would be good values for the window and level parameters? I am
>>>>>> using
>>>>>> window = range[1]-range[0] and level = 0.5*(range[0]+range[1]) which
>>>>>> works
>>>>>> ok for this multi-page tif, but gets me nowhere when I try to display
>>>>>> a
>>>>>> drr.
>>>>>>
>>>>>> Thanks - Maarten
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Friday, November 8, 2013 4:23:23 PM, David Gobbi
>>>>>> <david.gobbi at gmail.com>
>>>>>> wrote:
>>>>>> Hi Maarten,
>>>>>>
>>>>>> Which version of VTK are you using?  I believe that this bug has been
>>>>>> fixed in the master branch by a commits in the following topic merge:
>>>>>> http://vtk.org/gitweb?p=VTK.git;a=commitdiff;h=7e3d5270
>>>>>>
>>>>>> It was not fixed in time for VTK 5.10, however.
>>>>>>
>>>>>>  David
>>>>>>
>>>>>>
>>>>>> On Fri, Nov 8, 2013 at 2:12 PM, Maarten Beek <beekmaarten at yahoo.com>
>>>>>> wrote:
>>>>>>> Hi all,
>>>>>>>
>>>>>>> vtkTIFFReader crashed for me while loading a multi-paged tiff file.
>>>>>>>
>>>>>>> The crash occured in vtkTIFFReader::ReadGenericImage(), because
>>>>>>> this->OutputExtent was not set (still NULL).
>>>>>>> The scalar type for the image I was loading was unsigned short, so it
>>>>>>> happened at line 1368.
>>>>>>>
>>>>>>> I changed void vtkTIFFReader::ReadVolume(void* buffer) into void
>>>>>>> vtkTIFFReader::ReadVolume(void* buffer, int outExt[6]) and added the
>>>>>>> line
>>>>>>> this->outputExtent = outExt.
>>>>>>>
>>>>>>> This solved my crash.
>>>>>>> I am not sure I am on to something, but thought to let you know.
>>>>>>>
>>>>>>> Maarten
>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>
>


More information about the vtkusers mailing list