[Insight-users] ImageFilter problems
Bill Lorensen
bill.lorensen at gmail.com
Sat Dec 24 11:05:24 EST 2011
The code you sent has a typo in it, so I doubt that you ran it:
writer->SetInput( shFIlter->GetOutput() );
has to be
writer->SetInput( shFilter->GetOutput() );
After I fixed the compile error, the code works for me, at least when
I use when I use the Laplacian. I ran it on your data file.
How are you running the program. I find it unusual to run it as:
TestFilter outputfile inputfile
I would have expected
TestFilter inputfile outputfile
but that is how the code is written.
Bill
On Sat, Dec 24, 2011 at 10:18 AM, Fleysher, Lazar
<lazar.fleysher at mountsinai.org> wrote:
> Hello Bill
>
> I am definitely missing something...
> Below is the code I use. There is a line with // which shows the Laplacian filter
> I tried to use with the same outcome....
>
> Thanks
>
> Lazar
> --------------------------------
> start code
> --------------------------------
> #include "itkArray.h"
> #include "itkVariableLengthVector.h"
> #include "itkImage.h"
> #include "itkImageRegionConstIterator.h"
> #include "itkImageFileReader.h"
> #include "itkImageFileWriter.h"
> #include "itkImageRegionIteratorWithIndex.h"
> #include "itkOptimalSharpeningImageFilter.h"
> #include "itkLaplacianSharpeningImageFilter.h"
>
>
> /////////////////////////////////////////////////////
> template <unsigned int ImageDimension,unsigned int NVectorComponents>
> int TestFilter(unsigned int argc, char *argv[])
> {
> std::cout << "testFilter executed" << std::endl;
>
> typedef float PixelType;
> typedef itk::Image<PixelType, ImageDimension> ImageType;
> typedef itk::ImageRegionIteratorWithIndex<ImageType> Iterator;
> typedef itk::ImageFileReader<ImageType> ImageFileReader;
> typedef itk::ImageFileWriter<ImageType> writertype;
>
> typename ImageType::Pointer averageimage = NULL;
>
> typename ImageFileReader::Pointer reader = ImageFileReader::New();
> reader->SetFileName(argv[2]); // load this image...
> reader->Update();
> averageimage=reader->GetOutput();
>
> typedef itk::OptimalSharpeningImageFilter<ImageType,ImageType > sharpeningFilter;
> // typedef itk::LaplacianSharpeningImageFilter<ImageType,ImageType > sharpeningFilter;
> typename sharpeningFilter::Pointer shFilter = sharpeningFilter::New();
>
> shFilter->SetInput( averageimage );
> shFilter->SetSValue(0.5);
> std::cout << "before" << std::endl;
> shFilter->Update();
> std::cout << "after" << std::endl;
>
> std::cout << " writing output ";
> {
> typename writertype::Pointer writer = writertype::New();
> writer->SetFileName(argv[1]); // save into this name....
> writer->SetInput( shFIlter->GetOutput() );
> writer->Update();
> }
>
> return 0;
> }
>
> /////////////////////////////////////////////////////
>
> int main(int argc, char * argv[])
> {
>
> TestFilter<3,1>(argc,argv);
> return 0;
> }
> ---------------------------------------------------
> end of code
> --------------------------------------------------
> ________________________________________
> From: Bill Lorensen [bill.lorensen at gmail.com]
> Sent: Saturday, December 24, 2011 07:52
> To: Fleysher, Lazar
> Cc: Insight-users at itk.org
> Subject: Re: [Insight-users] ImageFilter problems
>
> Please send me your code.
>
> On Sat, Dec 24, 2011 at 6:45 AM, Fleysher, Lazar
> <lazar.fleysher at mountsinai.org> wrote:
>> Hello Bill
>>
>> Yes I am modifying your code. The only difference between your code and mine
>> was the use of a pointer to access the filtered data... (was there anything else that I missed?)
>>
>> For laplacian example simply replace
>>
>> typedef itk::OptimalSharpeningImageFilter<ImageType,ImageType > sharpeningFilter;
>>
>> with
>>
>> typedef itk::LaplacianSharpeningImageFilter<ImageType,ImageType > sharpeningFilter;
>>
>>
>> Same result: seg fault on Update...
>>
>> Thanks
>>
>> Lazar
>>
>> ________________________________________
>> From: Bill Lorensen [bill.lorensen at gmail.com]
>> Sent: Friday, December 23, 2011 17:52
>> To: Fleysher, Lazar
>> Cc: Insight-users at itk.org
>> Subject: Re: [Insight-users] ImageFilter problems
>>
>> You are modifying my code, correct?
>>
>> Please send the code with the LaplacianSharpening.
>>
>>
>> On Fri, Dec 23, 2011 at 5:47 PM, Fleysher, Lazar
>> <lazar.fleysher at mountsinai.org> wrote:
>>> Dear Bill
>>>
>>> I did try catching am exception, but none is generated.
>>>
>>> The filter was there in the code. I tried to put another one (laplacian), but
>>> Result is the same: seg fault inside Update()....
>>>
>>> Lazar
>>>
>>> ________________________________________
>>> From: Bill Lorensen [bill.lorensen at gmail.com]
>>> Sent: Friday, December 23, 2011 17:21
>>> To: Fleysher, Lazar
>>> Cc: Insight-users at itk.org
>>> Subject: Re: [Insight-users] ImageFilter problems
>>>
>>> Where did you get the filter: OptimalSharpeningImageFilter?
>>>
>>> On Fri, Dec 23, 2011 at 4:41 PM, Bill Lorensen <bill.lorensen at gmail.com> wrote:
>>>> Put a try/catch block around your code:
>>>> try
>>>> {
>>>> your code
>>>> catch (itk::ExceptionObject& e)
>>>> {
>>>> std::cerr << "Exception detected: " << e;
>>>> return EXIT_FAILURE;
>>>> }
>>>>
>>>> On Fri, Dec 23, 2011 at 4:23 PM, Fleysher, Lazar
>>>> <lazar.fleysher at mountsinai.org> wrote:
>>>>> Hello Bill
>>>>>
>>>>> Yes of course I have tried your version. As I said, I will not be
>>>>> able to use your approach in the final application, but for test
>>>>> purposes I did run your program with the same segmentation violation.
>>>>> (in my final application I will need the pointer to filtered image as I will
>>>>> do more things to it)
>>>>>
>>>>> ProcessObject::UpdateOutputData and calls inside it
>>>>> cause segmentation violation whether update() is called directly or not.
>>>>>
>>>>> Thank you very much for your help
>>>>>
>>>>> Lazar
>>>>> ________________________________________
>>>>> From: Bill Lorensen [bill.lorensen at gmail.com]
>>>>> Sent: Friday, December 23, 2011 16:09
>>>>> To: Fleysher, Lazar
>>>>> Cc: Insight-users at itk.org
>>>>> Subject: Re: [Insight-users] ImageFilter problems
>>>>>
>>>>> itk does not use intermediate storage. When you say image1 = image2 it
>>>>> is just assigning pointers.
>>>>>
>>>>> I'll try compiling and running your test program if I get a chance.
>>>>>
>>>>> Did you try my test program?
>>>>>
>>>>> On Fri, Dec 23, 2011 at 3:42 PM, Fleysher, Lazar
>>>>> <lazar.fleysher at mountsinai.org> wrote:
>>>>>> Dear Bill
>>>>>>
>>>>>> You suggest to feed the output of filter directly into the writer without
>>>>>> the use of an intermediate storage. While in my end application
>>>>>> this will not work, I have tried it here and the same thing happens.
>>>>>>
>>>>>> The segmentation violation is generated on filter->update() call...
>>>>>>
>>>>>> There is something wong with ITK or libc
>>>>>>
>>>>>> What do you think?
>>>>>>
>>>>>> Lazar
>>>>>>
>>>>>> ________________________________________
>>>>>> From: Bill Lorensen [bill.lorensen at gmail.com]
>>>>>> Sent: Friday, December 23, 2011 15:01
>>>>>> To: Fleysher, Lazar
>>>>>> Cc: Insight-users at itk.org
>>>>>> Subject: Re: [Insight-users] ImageFilter problems
>>>>>>
>>>>>> Try my attached version
>>>>>>
>>>>>> On Fri, Dec 23, 2011 at 2:48 PM, Fleysher, Lazar
>>>>>> <lazar.fleysher at mountsinai.org> wrote:
>>>>>>> Hello Bill
>>>>>>>
>>>>>>> Sorry for not being clear. Attached is the example which I am trying to work out.
>>>>>>>
>>>>>>> The way to execute is :
>>>>>>>
>>>>>>> TestFilter blah.nii.gz r16slice.nii.gz
>>>>>>>
>>>>>>> (unfortunately the image file is too large to be accepted by the mailing list)
>>>>>>>
>>>>>>> The function reads the file r16slice and applies filter to it and saves it on disk into blah.nii.gz
>>>>>>>
>>>>>>> If I do not exectute shFilter->Update(); than averageimage has no pixels just before write.
>>>>>>> If I do execute shFilter->Update(); then this causes segmentation violation.
>>>>>>> If I do not execute shFilter->Update(); and do not execute averageimage = shFilter->GetOutput();
>>>>>>> then the function works as copy and blah.nii.gz is identical to the r16slice.nii.gz....
>>>>>>>
>>>>>>> Thank you very much for your help
>>>>>>>
>>>>>>> Lazar
>>>>>>> ________________________________________
>>>>>>> From: Bill Lorensen [bill.lorensen at gmail.com]
>>>>>>> Sent: Friday, December 23, 2011 12:44
>>>>>>> To: Fleysher, Lazar
>>>>>>> Cc: Insight-users at itk.org
>>>>>>> Subject: Re: [Insight-users] ImageFilter problems
>>>>>>>
>>>>>>> itk is a demand driven pipelined system. Typically you set the input
>>>>>>> to the next filter to be the output of the previous filter. Setting
>>>>>>> the input/output chain just establishes the pipeline and does not
>>>>>>> execute it. When you do an Updtae() on the last filter, the pipeline
>>>>>>> executes.
>>>>>>>
>>>>>>> averageimage=shFilter->GetOutput() is OK, but in your first email you had said:
>>>>>>> shFilter->SetInput( averageimage );
>>>>>>> shFilter->SetSValue(0.5);
>>>>>>> // shFilter->Update();
>>>>>>> averageimage = shFilter->GetOutput();
>>>>>>>
>>>>>>> This modified averageimage was was the input to shFilter.
>>>>>>>
>>>>>>>
>>>>>>> Please post a complete small, compilable example that fails. Including
>>>>>>> snippets in e-mails is too prone to error and misinterpretation.
>>>>>>>
>>>>>>> thanks,
>>>>>>>
>>>>>>> Bill
>>>>>>>
>>>>>>> On Fri, Dec 23, 2011 at 11:39 AM, Fleysher, Lazar
>>>>>>> <lazar.fleysher at mountsinai.org> wrote:
>>>>>>>> Dear Bill Lorensen
>>>>>>>>
>>>>>>>> averageimage is decleared as float 3D and then it is read from a (NIFTI) file....
>>>>>>>>
>>>>>>>> typename ImageFileReader::Pointer reader = ImageFileReader::New();
>>>>>>>> reader->SetFileName(argv[bigimage]);
>>>>>>>> reader->Update();
>>>>>>>> averageimage=reader->GetOutput();
>>>>>>>>
>>>>>>>> If I understood you correctly, I should run filter-> Update()
>>>>>>>> than to save the image do writer->SetInput(shFilter->GetOutput());
>>>>>>>> What is wrong with doing averageimage=shFilter->GetOutput()
>>>>>>>> followed by writer->SetInput(averageimage) ?
>>>>>>>>
>>>>>>>>
>>>>>>>> Regardless, shFilter->Update() generates a segmentation violation.
>>>>>>>> If I comment out the filter part, the image gets saved in to a file
>>>>>>>> and everything seem to work correctly.
>>>>>>>>
>>>>>>>> So there is something strange with the filter ... but what?
>>>>>>>>
>>>>>>>> Here is the output of gdb. Definitely there is a problem with some threads...
>>>>>>>>
>>>>>>>>
>>>>>>>> [New Thread 2122320192 (LWP 15648)]
>>>>>>>> [New Thread 46912496267840 (LWP 15512)]
>>>>>>>> [New Thread 46913547483456 (LWP 15649)]
>>>>>>>> [New Thread 46914596063552 (LWP 15650)]
>>>>>>>> [Thread 2122320192 (LWP 15648) exited]
>>>>>>>> [Thread 46914596063552 (LWP 15650) exited]
>>>>>>>> [Thread 46913547483456 (LWP 15649) exited]
>>>>>>>>
>>>>>>>> Program received signal SIGSEGV, Segmentation fault.
>>>>>>>> [Switching to Thread 46912496267840 (LWP 15512)]
>>>>>>>> 0x0000003482c076e8 in pthread_join () from /lib64/libpthread.so.0
>>>>>>>>
>>>>>>>> Here we see that the filter created 4 threads, but could not join them correctly.
>>>>>>>> Furthermore:
>>>>>>>>
>>>>>>>> (gdb) where
>>>>>>>> #0 0x0000003482c076e8 in pthread_join () from /lib64/libpthread.so.0
>>>>>>>> #1 0x00000000007dd2b5 in itk::MultiThreader::WaitForSingleMethodThread (this=0x1a11160, threadHandle=3)
>>>>>>>> at /work/home/xxx/ANTS/ITK_SOURCE/ITK/Modules/Core/Common/src/itkMultiThreaderPThreads.cxx:210
>>>>>>>> #2 0x00000000007dd9af in itk::MultiThreader::SingleMethodExecute (this=0x1a11160)
>>>>>>>> at /work/home/xxx/ANTS/ITK_SOURCE/ITK/Modules/Core/Common/src/itkMultiThreader.cxx:332
>>>>>>>> #3 0x00000000007207fb in itk::ImageSource<itk::Image<double, 3u> >::GenerateData (this=0x19cf700)
>>>>>>>> at /work/home/xxx/ANTS/ITK_SOURCE/ITK/Modules/Core/Common/include/itkImageSource.hxx:275
>>>>>>>> #4 0x00000000007d36a6 in itk::ProcessObject::UpdateOutputData (this=0x19cf700)
>>>>>>>> at /work/home/xxx/ANTS/ITK_SOURCE/ITK/Modules/Core/Common/src/itkProcessObject.cxx:1500
>>>>>>>> #5 0x00000000007e18f8 in itk::DataObject::UpdateOutputData (this=0x19c3830) at /work/home/xxx/ANTS/ITK_SOURCE/ITK/Modules/Core/Common/src/itkDataObject.cxx:434
>>>>>>>> #6 0x0000000000705f43 in itk::ImageBase<3u>::UpdateOutputData (this=0x19c3830) at /work/home/xxx/ANTS/ITK_SOURCE/ITK/Modules/Core/Common/include/itkImageBase.hxx:285
>>>>>>>> #7 0x00000000007e1816 in itk::DataObject::Update (this=0x19c3830) at /work/home/xxx/ANTS/ITK_SOURCE/ITK/Modules/Core/Common/src/itkDataObject.cxx:359
>>>>>>>> #8 0x00000000007d3bc1 in itk::ProcessObject::Update (this=0x19cf700) at /work/home/xxx/ANTS/ITK_SOURCE/ITK/Modules/Core/Common/src/itkProcessObject.cxx:1096
>>>>>>>> #9 0x000000000077a82a in itk::OptimalSharpeningImageFilter<itk::Image<float, 3u>, itk::Image<float, 3u> >::GenerateData (this=0x19ce520)
>>>>>>>> at /work/home/xxx/ANTS/ANTS_SOURCE/ANTS/Examples/../Utilities/itkOptimalSharpeningImageFilter.hxx:142
>>>>>>>> #10 0x00000000007d36a6 in itk::ProcessObject::UpdateOutputData (this=0x19ce520)
>>>>>>>> at /work/home/xxx/ANTS/ITK_SOURCE/ITK/Modules/Core/Common/src/itkProcessObject.cxx:1500
>>>>>>>> #11 0x00000000007e18f8 in itk::DataObject::UpdateOutputData (this=0x19b52b0) at /work/home/xxx/ANTS/ITK_SOURCE/ITK/Modules/Core/Common/src/itkDataObject.cxx:434
>>>>>>>> #12 0x0000000000705f43 in itk::ImageBase<3u>::UpdateOutputData (this=0x19b52b0) at /work/home/xxx/ANTS/ITK_SOURCE/ITK/Modules/Core/Common/include/itkImageBase.hxx:285
>>>>>>>> #13 0x00000000007e1816 in itk::DataObject::Update (this=0x19b52b0) at /work/home/xxx/ANTS/ITK_SOURCE/ITK/Modules/Core/Common/src/itkDataObject.cxx:359
>>>>>>>> #14 0x00000000007d3bc1 in itk::ProcessObject::Update (this=0x19ce520) at /work/home/xxx/ANTS/ITK_SOURCE/ITK/Modules/Core/Common/src/itkProcessObject.cxx:1096
>>>>>>>> #15 0x000000000077d9ad in AverageImages1<3u, 1u> (argc=10, argv=0x7fffffffd7f8) at /work/home/xxx/ANTS/ANTS_SOURCE/ANTS/Examples/AverageImages.cxx:121
>>>>>>>> #16 0x0000000000633770 in main (argc=10, argv=0x7fffffffd7f8) at /work/home/xxx/ANTS/ANTS_SOURCE/ANTS/Examples/AverageImages.cxx:308
>>>>>>>>
>>>>>>>> Does this provide some information about what is happening????
>>>>>>>>
>>>>>>>> The system I am running on is CentOS5, I guess:
>>>>>>>>
>>>>>>>> cat /etc/redhat-release
>>>>>>>> Red Hat Enterprise Linux ES release 5
>>>>>>>>
>>>>>>>> cat /etc/redhat-release.CENTOS5.orig
>>>>>>>> CentOS release 5.4 (Final)
>>>>>>>>
>>>>>>>> yum gives me this:
>>>>>>>>
>>>>>>>> yum list|grep libc
>>>>>>>> glibc.i686 2.5-42 installed
>>>>>>>> glibc.x86_64 2.5-42 installed
>>>>>>>> glibc-common.x86_64 2.5-42 installed
>>>>>>>> glibc-devel.i386 2.5-42 installed
>>>>>>>> glibc-devel.x86_64 2.5-42 installed
>>>>>>>> glibc-headers.x86_64 2.5-42 installed
>>>>>>>>
>>>>>>>>
>>>>>>>> Is this a problem with libc6?
>>>>>>>>
>>>>>>>> Thanks
>>>>>>>>
>>>>>>>> Lazar
>>>>>>>>
>>>>>>>> ________________________________________
>>>>>>>> From: Bill Lorensen [bill.lorensen at gmail.com]
>>>>>>>> Sent: Friday, December 23, 2011 08:37
>>>>>>>> To: Fleysher, Lazar
>>>>>>>> Cc: Insight-users at itk.org
>>>>>>>> Subject: Re: [Insight-users] ImageFilter problems
>>>>>>>>
>>>>>>>> For a filter to run, you must either explicitly call Update() on it,
>>>>>>>> or a filter down stream.
>>>>>>>>
>>>>>>>> Can you show the code that creates averageimage?
>>>>>>>>
>>>>>>>> Also, you should remove the statement:
>>>>>>>> averageimage = shFilter->GetOutput();
>>>>>>>>
>>>>>>>> It is already used as input to your filter. You are probably
>>>>>>>> introducing some sort of cycle in the pipeline.
>>>>>>>>
>>>>>>>> Try
>>>>>>>> writer->SetInput(shFilter->GetOutput());
>>>>>>>>
>>>>>>>>
>>>>>>>> On Fri, Dec 23, 2011 at 8:19 AM, Fleysher, Lazar
>>>>>>>> <lazar.fleysher at mountsinai.org> wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Hello insight-users at itk.org.
>>>>>>>>>
>>>>>>>>> I am new to ITK and I am experiencing a strange problem with the image filters.
>>>>>>>>> So I was wondering if someone could shed some light on this.
>>>>>>>>>
>>>>>>>>> I have this code
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> typedef itk::OptimalSharpeningImageFilter<ImageType,ImageType > sharpeningFilter;
>>>>>>>>> typename sharpeningFilter::Pointer shFilter = sharpeningFilter::New();
>>>>>>>>> shFilter->SetInput( averageimage );
>>>>>>>>> shFilter->SetSValue(0.5);
>>>>>>>>> // shFilter->Update();
>>>>>>>>> averageimage = shFilter->GetOutput();
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> which should filter the averageimage.
>>>>>>>>>
>>>>>>>>> Unfortunately, when I run this code the resulting averageimage contains zero pixels.
>>>>>>>>> If I uncomment the "Update()" call (which I do not know if is needed) then
>>>>>>>>> the Update() generates a segmentation violation.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> I have ITK installed from sources using git clone git://itk.org/ITK.git from
>>>>>>>>> 2 days ago. I think it is version 4.1.
>>>>>>>>>
>>>>>>>>> Also, I have noticed that if I do not call Update() and try to save the image with
>>>>>>>>>
>>>>>>>>> typename writertype::Pointer writer = writertype::New();
>>>>>>>>> writer->SetFileName("aaa");
>>>>>>>>> writer->SetInput( averageimage );
>>>>>>>>> writer->Update();
>>>>>>>>>
>>>>>>>>> writer->Update() never returns. That is, it cannot write an empty image.
>>>>>>>>>
>>>>>>>>> Am I doing something wrong? What is going on?
>>>>>>>>>
>>>>>>>>> Thank you very much for your help
>>>>>>>>>
>>>>>>>>> Lazar
>>>>>>>>> _____________________________________
>>>>>>>>> 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.html
>>>>>>>>>
>>>>>>>>> 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://www.itk.org/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
>>>>
>>>>
>>>>
>>>> --
>>>> 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
--
Unpaid intern in BillsBasement at noware dot com
More information about the Insight-users
mailing list