[ITK] [ITK-users] LabelGeometryImageFilter: empty output of GetOrientedLabelImage and GetOrientedIntensityImage

Bradley Lowekamp blowekamp at mail.nih.gov
Tue Apr 7 14:56:29 EDT 2015


Bill,

I just have my external modules in the "ITK/Modules/External" directory. I manually manage the git process. Just do:

cd ITK/Modules/External
git clone https://github.com/blowekamp/itkOBBLabelMap.git

When you run ccmake the "ITKOBBLabelMap" module should show up where you can enable it.

HTH,
Brad

On Apr 7, 2015, at 2:51 PM, Bill Lorensen <bill.lorensen at gmail.com> wrote:

> Brad,
> 
> I don't see a remote.cmake file for your external module.
> 
> Bill
> 
> On Tue, Apr 7, 2015 at 5:37 AM, Bradley Lowekamp <blowekamp at mail.nih.gov> wrote:
>> Hello,
>> 
>> I have a much improved version of the algorithm to compute oriented bounding boxes here:
>> 
>> https://github.com/blowekamp/itkOBBLabelMap
>> 
>> It is correctly accounts for the image's physical spacing, origin, and direction cosines, significantly faster,  and more memory efficient. Here would be a close to turn-key test/example for this task:
>> 
>> https://github.com/blowekamp/itkOBBLabelMap/blob/master/test/itkOrientedBoundingBoxImageLabelMapFilterTest2.cxx
>> 
>> HTH,
>> Brad
>> 
>> On Apr 7, 2015, at 1:38 AM, Bill Lorensen <bill.lorensen at gmail.com> wrote:
>> 
>>> I have a 2D example that fails when the origin is not 0.0. Now I'll
>>> try to find the bug.
>>> 
>>> 
>>> On Mon, Apr 6, 2015 at 10:13 AM, Bill Lorensen <bill.lorensen at gmail.com> wrote:
>>>> Could be a bug. Need to find a smaller test case that fails. Maybe
>>>> because of non-zero origin. I'll take a look.
>>>> 
>>>> 
>>>> On Mon, Apr 6, 2015 at 9:55 AM, Thomas Seidel <seidel at cvrti.utah.edu> wrote:
>>>>> I tried it again. I am quite sure there is nothing wrong with my input
>>>>> files because the filter apparently creates correct output measures for
>>>>> all labels (e.g. eigenvalues, bounding box, volume, etc).
>>>>> But the orientedlabelimages are all zero, except for label 0 (which is my
>>>>> background). The dimension of these images corresponds to the size
>>>>> (length, width, depth) of the oriented bounding boxes.
>>>>> 
>>>>> I think the image origins are all messed up. May there something be wrong
>>>>> with the center of rotation?
>>>>> 
>>>>> E.g.: label 0, which is background, has the same bounding box size as the
>>>>> input label image.
>>>>> Input LabelImage:
>>>>> dimensions: 512 1024 130 (in pixels)
>>>>> origin: [102.273, 0, 5.96985] (in physical size)
>>>>> 
>>>>> oriented image of label 0:
>>>>> dimensions: 1026 515 131
>>>>> origin: [-51.2878, 50.6859, -0.132971]
>>>>> 
>>>>> 
>>>>> Is this a bug, or did I forget to set a parameter?
>>>>> 
>>>>> Thanks,
>>>>> Thomas
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> On 4/6/15 12:02 AM, "Bill Lorensen" <bill.lorensen at gmail.com> wrote:
>>>>> 
>>>>>> Thomas,
>>>>>> 
>>>>>> I compiled your program and ran it on one of my labeled images and it
>>>>>> produces the expected output.
>>>>>> 
>>>>>> On Sun, Apr 5, 2015 at 2:52 PM, Thomas Seidel <seidel at cvrti.utah.edu>
>>>>>> wrote:
>>>>>>> Hi Bill,
>>>>>>> 
>>>>>>> Thanks for your answer. Here is (part of the) source I am using.
>>>>>>> Do you need the image or source files?
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> #include "itkImage.h"
>>>>>>> #include "itkImageFileReader.h"
>>>>>>> #include "itkImageFileWriter.h"
>>>>>>> #include "itkLabelGeometryImageFilter.h"
>>>>>>> 
>>>>>>> #include "itksys/SystemTools.hxx"
>>>>>>> 
>>>>>>> #include <sstream>
>>>>>>> 
>>>>>>> 
>>>>>>> int main(int argc, char * argv[])
>>>>>>> {
>>>>>>> // Verify command line arguments
>>>>>>> if( argc < 2 )
>>>>>>>   {
>>>>>>>   std::cerr << "Usage: " << std::endl;
>>>>>>>   std::cerr << argv[0] << " InputImageFile [-intensity
>>>>>>> <IntensityImageFile>]" << std::endl;
>>>>>>>   return EXIT_FAILURE;
>>>>>>>   }
>>>>>>> std::string inputFilename = argv[1];
>>>>>>> std::string intensityFile;
>>>>>>> bool calcIntensity = false;
>>>>>>> 
>>>>>>> 
>>>>>>>   int argcounter = 2;
>>>>>>> while (argc>argcounter)
>>>>>>> {
>>>>>>>       if (!strncmp(argv[argcounter],"-intensity",10) ) {intensityFile
>>>>>>> =
>>>>>>> argv[argcounter + 1]; calcIntensity = true; }
>>>>>>>       argcounter++;
>>>>>>> }
>>>>>>> 
>>>>>>> // Setup types
>>>>>>> typedef itk::Image<unsigned int, 3> IntImageType;
>>>>>>> typedef itk::Image<float, 3> FloatImageType;
>>>>>>> typedef itk::ImageFileReader<IntImageType>               ReaderType;
>>>>>>> typedef itk::ImageFileReader<FloatImageType>
>>>>>>> FloatReaderType;
>>>>>>> 
>>>>>>> ReaderType::Pointer reader = ReaderType::New();
>>>>>>> reader->SetFileName( inputFilename );
>>>>>>> FloatReaderType::Pointer FloatReader = FloatReaderType::New();
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>  typedef itk::LabelGeometryImageFilter< IntImageType, FloatImageType >
>>>>>>> LabelGeometryImageFilterType;
>>>>>>>  LabelGeometryImageFilterType::Pointer labelGeometryImageFilter =
>>>>>>> LabelGeometryImageFilterType::New();
>>>>>>>  labelGeometryImageFilter->SetInput( reader->GetOutput() );
>>>>>>> 
>>>>>>> 
>>>>>>>  if (calcIntensity)
>>>>>>>  {
>>>>>>>       FloatReader->SetFileName(intensityFile);
>>>>>>>       FloatReader->Update();
>>>>>>> 
>>>>>>> labelGeometryImageFilter->SetIntensityInput(FloatReader->GetOutput());
>>>>>>> labelGeometryImageFilter->CalculateOrientedIntensityRegionsOn();
>>>>>>> 
>>>>>>>  }
>>>>>>> 
>>>>>>> 
>>>>>>>    labelGeometryImageFilter->CalculatePixelIndicesOn();
>>>>>>> labelGeometryImageFilter->CalculateOrientedBoundingBoxOn();
>>>>>>>   labelGeometryImageFilter->CalculateOrientedLabelRegionsOn();
>>>>>>> 
>>>>>>> labelGeometryImageFilter->Update();
>>>>>>> 
>>>>>>>  LabelGeometryImageFilterType::LabelsType allLabels =
>>>>>>> labelGeometryImageFilter->GetLabels();
>>>>>>> LabelGeometryImageFilterType::LabelsType::iterator allLabelsIt;
>>>>>>> std::cout << "Number of labels: " <<
>>>>>>> labelGeometryImageFilter->GetNumberOfLabels() << std::endl;
>>>>>>> std::cout << std::endl;
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> for( allLabelsIt = allLabels.begin(); allLabelsIt != allLabels.end();
>>>>>>> allLabelsIt++ )
>>>>>>>   {
>>>>>>> 
>>>>>>>       LabelGeometryImageFilterType::LabelPixelType labelValue =
>>>>>>> *allLabelsIt;
>>>>>>> 
>>>>>>> 
>>>>>>>       std::ostringstream stream;
>>>>>>>       stream << labelValue << ".vtk";
>>>>>>>       typedef itk::ImageFileWriter<IntImageType> WriterType;
>>>>>>>       WriterType::Pointer writer = WriterType::New();
>>>>>>>       writer->SetFileName(stream.str());
>>>>>>> 
>>>>>>> writer->SetInput(labelGeometryImageFilter->GetOrientedLabelImage(labelVal
>>>>>>> u
>>>>>>> e));
>>>>>>>       writer->Update();
>>>>>>> 
>>>>>>>       std::ostringstream stream2;
>>>>>>>       stream2 << labelValue << "-intensity.vtk";
>>>>>>> 
>>>>>>>       if (calcIntensity) {
>>>>>>>               typedef itk::ImageFileWriter<FloatImageType>
>>>>>>> FloatWriterType;
>>>>>>>               FloatWriterType::Pointer Floatwriter =
>>>>>>> FloatWriterType::New();
>>>>>>>               Floatwriter->SetFileName(stream2.str());
>>>>>>> 
>>>>>>> Floatwriter->SetInput(labelGeometryImageFilter->GetOrientedIntensityImage
>>>>>>> (labelValue));
>>>>>>>               Floatwriter->Update();
>>>>>>>       }
>>>>>>>   }
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> return EXIT_SUCCESS;
>>>>>>> }
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> On 4/5/15 12:10 PM, "Bill Lorensen" <bill.lorensen at gmail.com> wrote:
>>>>>>> 
>>>>>>>> Do you have a small, compilable example that illustrates the problem?
>>>>>>>> 
>>>>>>>> On Sun, Apr 5, 2015 at 10:09 AM, Thomas Seidel <seidel at cvrti.utah.edu>
>>>>>>>> wrote:
>>>>>>>>> Hi all,
>>>>>>>>> 
>>>>>>>>> I am using the itkLabelGeometryImageFilter to get information about
>>>>>>>>> the
>>>>>>>>> orientation of labeled objects.
>>>>>>>>> I provide a LabelImage and a IntensityImage.
>>>>>>>>> I set CalculateOrientedLabelRegionsOn() and
>>>>>>>>> CalculateOrientedIntensityRegionsOn().
>>>>>>>>> 
>>>>>>>>> However, when I use
>>>>>>>>> writer->SetInput(filter->GetOrientedLabelImage());
>>>>>>>>> writer->Update();
>>>>>>>>> or
>>>>>>>>> writer->SetInput(filter->GetOrientedIntensityImage());
>>>>>>>>> writer->Update();
>>>>>>>>> 
>>>>>>>>> it just generates empty images (all values 0) with the size of the
>>>>>>>>> oriented
>>>>>>>>> bounding box.
>>>>>>>>> 
>>>>>>>>> Is this how the filter is supposed to work?? I was expecting the
>>>>>>>>> rotated
>>>>>>>>> labels and the rotated region of the intensity image defined by the
>>>>>>>>> oriented
>>>>>>>>> bounding box, respectively.
>>>>>>>>> 
>>>>>>>>> Thanks,
>>>>>>>>> Thomas
>>>>>>>>> 
>>>>>>>>> _____________________________________
>>>>>>>>> Powered by www.kitware.com
>>>>>>>>> 
>>>>>>>>> Visit other Kitware open-source projects at
>>>>>>>>> http://www.kitware.com/opensource/opensource.html
>>>>>>>>> 
>>>>>>>>> Kitware offers ITK Training Courses, for more information visit:
>>>>>>>>> http://www.kitware.com/products/protraining.php
>>>>>>>>> 
>>>>>>>>> Please keep messages on-topic and check the ITK FAQ at:
>>>>>>>>> http://www.itk.org/Wiki/ITK_FAQ
>>>>>>>>> 
>>>>>>>>> Follow this link to subscribe/unsubscribe:
>>>>>>>>> http://public.kitware.com/mailman/listinfo/insight-users
>>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> --
>>>>>>>> Unpaid intern in BillsBasement at noware dot com
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> --
>>>>>> Unpaid intern in BillsBasement at noware dot com
>>>>> 
>>>>> 
>>>>> 
>>>> 
>>>> 
>>>> 
>>>> --
>>>> Unpaid intern in BillsBasement at noware dot com
>>> 
>>> 
>>> 
>>> --
>>> Unpaid intern in BillsBasement at noware dot com
>>> _____________________________________
>>> Powered by www.kitware.com
>>> 
>>> Visit other Kitware open-source projects at
>>> http://www.kitware.com/opensource/opensource.html
>>> 
>>> Kitware offers ITK Training Courses, for more information visit:
>>> http://www.kitware.com/products/protraining.php
>>> 
>>> Please keep messages on-topic and check the ITK FAQ at:
>>> http://www.itk.org/Wiki/ITK_FAQ
>>> 
>>> Follow this link to subscribe/unsubscribe:
>>> http://public.kitware.com/mailman/listinfo/insight-users
>> 
> 
> 
> 
> -- 
> Unpaid intern in BillsBasement at noware dot com

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/community/attachments/20150407/506d175f/attachment-0001.html>
-------------- next part --------------
_____________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html

Kitware offers ITK Training Courses, for more information visit:
http://www.kitware.com/products/protraining.php

Please keep messages on-topic and check the ITK FAQ at:
http://www.itk.org/Wiki/ITK_FAQ

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/insight-users


More information about the Community mailing list