[Insight-users] MultiThreader error in SheppLoganFilter?

Ming Chao mingchao2005 at gmail.com
Mon Dec 14 09:30:04 EST 2009


Hi Louis,

Thanks very much for spotting the failure point. I realized that it was due
to the missing VRadius. I appreciate your comments on the coding
improvement.

I got the original code from online. I would be very happy to share it with
the insight community if I were the original author. Here is the link to the
code just in case you want to contact them:

http://www.perlproductions.at/index.php?choice=referenz&lang=en&id=15

Thanks,

Ming

On Fri, Dec 11, 2009 at 5:19 PM, Luis Ibanez <luis.ibanez at kitware.com>wrote:

> Hi Ming,
>
> Thanks for posting your code.
>
>
> The error is that you are not calling
> the method that sets the VRadius value.
>
>
> That's why you get the error message:
>
>
>    "Member variable VRadius
>       not properly initialized."
>
>
> You simply need to add:
>
>        filter->SetVRadius( 1 );
>
> before you make the call to Update();
>
> ...
>
> Of course,
> you may want to try values of "VRadius"
> different from 1.
>
>
> BTW: doing
>
>      "using namespace std;"
>
> is a really bad practice.
>
> Opening a namespace defeats the purpose
> of having namespaces at all.
>
>
> Please get used to typing:
>
>       std::string
>       std::cout
>       std::cerr
>       std::endl
>
> and so on....
>
>
>
> Also, please note that the implementation of
> templated classes shouldn't be put in .cpp files.
> We usually put this in .txx files.
>
> Please find attached the three files fixed
> along with a CMakeLists.txt file.
>
>
> BTW: your code was missing several
> essential lines of code, such as includes
> for ImageFileReader, ImageFileWriter and
> the ShepLogan filter itself.
>
>
> We strongly encourage you to share this
> filter with the ITK community by submitting
> it to the Insight Journal     :-)
>
>  http://www.insight-journal.org/
>
>
>
>    Regards,
>
>            Luis
>
>
> -------------------------------
> On Tue, Dec 8, 2009 at 6:19 PM, Ming Chao <mingchao2005 at gmail.com> wrote:
> > Hi,
> > I got a code of SheppLoganFilter and used it to filter a raw sinogram
> image
> > (I am not sure if this is a correct use though). However, I got the
> > following error:
> > writing image image/test2.png caused a problem.
> > itk::ExceptionObject (0122FEC4)
> > Location: "void __thiscall itk::MultiThreader::SingleMethodExecute(void)"
> > File: \ITK\InsightToolkit-3.8.0\Code\Common\itkMultiThreader.cxx
> > Line: 429
> > Description: itk::ERROR: MultiThreader(01870068): Exception occurred
> during
> > Sing
> > leMethodExecute
> > c:\my rsch work\image reconstruction\code\SheppLoganFilter.cpp:27:
> > itk::ERROR: SheppLoganFilter(0177DD28): Member variable VRadius not
> properly
> > ini
> > tialized.
> >
> > The codes I used are attached in the following. Any
> > comments/suggestions/help would be greatly appreciated.
> >
> > The main function:
> > #include "itkImage.h"
> > using namespace std;
> > int main(int argc, char* argv[])
> > {
> > string filename("image/test.png");
> > string filename2("image/test2.png");
> > typedef unsigned char uchar;
> > typedef uchar PixelType;
> > const int Dimension = 2;
> > typedef itk::Image< PixelType, 2 > ImageType;
> >
> > //reading image from disk
> > typedef itk::ImageFileReader< ImageType > ReaderType;
> > ReaderType::Pointer reader = ReaderType::New();
> > reader->SetFileName(filename);
> > reader->Update();
> > ImageType::Pointer input_image = ImageType::New();
> > input_image = reader->GetOutput();
> > typedef SheppLoganFilter<ImageType, ImageType>  FilterType;
> > FilterType::Pointer filter = FilterType::New();
> >         filter->SetInput(input_image);
> > typedef itk::ImageFileWriter< ImageType > WriterType;
> > WriterType::Pointer writer = WriterType::New();
> > writer->SetInput(filter->GetOutput());
> > writer->SetFileName(filename2);
> > try {
> > writer->Update();
> > }
> > catch( itk::ExceptionObject exp )
> > {
> > cerr << "writing image " << filename2 << " caused a problem." << endl;
> > cerr << exp << endl;
> > return 1;
> > }
> > }
> > The SheppLoganFilter.h:
> >
> > #ifndef __SheppLoganFilter_h
> > #define __SheppLoganFilter_h
> > #include <vector>
> >
> > //ITK includes
> > #include "itkImageToImageFilter.h"
> > #include "itkImageRegionIterator.h"
> > #include "itkConstNeighborhoodIterator.h"
> > #include "itkOffset.h"
> > /*!
> >  * \class SheppLoganFilter
> >  * \brief Applies a shepp logan filter to an image and returns the
> filtered
> > image.
> >  */
> > template < typename TInputImage,  typename TOutputImage >
> > class SheppLoganFilter : public itk::ImageToImageFilter< TInputImage,
> > TOutputImage >
> > {
> > public:
> > /*! Standard class typedefs. */
> > typedef SheppLoganFilter Self;
> > typedef itk::ImageToImageFilter< TInputImage, TOutputImage > Superclass;
> > typedef itk::SmartPointer< Self > Pointer;
> > typedef itk::SmartPointer< const Self > ConstPointer;
> > /*! Method for creation through object factory */
> > itkNewMacro(Self);
> > /*! Run-time type information (and related methods) */
> > itkTypeMacro(SheppLoganFilter, ImageToImageFilter);
> > //Convenience typedefs
> > typedef TInputImage ImageType;
> > typedef TOutputImage OImageType;
> > typedef typename ImageType::RegionType RegionType;
> > typedef itk::ConstNeighborhoodIterator< ImageType >
> > NeighborhoodIteratorType;
> > typedef itk::ImageRegionIterator< OImageType> IteratorType;
> > typedef typename ImageType::ConstPointer ImageConstPointer;
> > typedef typename OImageType::Pointer ImagePointer;
> > /*! Extract dimension from input and output image. */
> > itkStaticConstMacro(ImageDimension, unsigned int,
> > TInputImage::ImageDimension);
> > itkSetMacro(VRadius, int);
> > itkGetConstReferenceMacro(VRadius, int);
> > protected:
> > SheppLoganFilter();
> > virtual ~SheppLoganFilter() {}
> > /*! Standard "PrintSelf" method */
> > void PrintSelf(std::ostream& os, itk::Indent indent) const;
> > /*!
> > * SheppLoganFilter can be implemented as a
> > * multithreaded filter. Therefore, this implementation provides
> > * a ThreadedGenerateData() routine which is called for each
> > * processing thread. The output image data is allocated
> > * automatically by the superclass prior to calling
> > * ThreadedGenerateData().  ThreadedGenerateData can only
> > * write to the portion of the output image specified by the
> > * parameter "outputRegionForThread".
> > *
> > * \sa ImageToImageFilter::ThreadedGenerateData(),
> > *     ImageToImageFilter::GenerateData()
> > */
> > void ThreadedGenerateData(const RegionType& regionForThread,
> >
> >  int threadId );
> > private:
> > SheppLoganFilter(const Self&) {}; //purposely not implemented
> > void operator=(const Self&); //purposely not implemented
> > /*! vertical radius of shepp logan filter  */
> > int m_VRadius;
> > };
> >
> > #ifndef ITK_MANUAL_INSTANTIATION
> > #include "SheppLoganFilter.cpp"
> > #endif
> > #endif
> > And the SheppLoganFilter.cpp:
> > #ifndef _SheppLoganFilter_txx
> > #define _SheppLoganFilter_txx
> > #include "SheppLoganFilter.h"
> > #ifndef PI
> > #define PI 3.141592653
> > #endif
> > template < typename TInputImage, typename TOutputImage >
> > SheppLoganFilter< TInputImage, TOutputImage >::SheppLoganFilter()
> > {
> > m_VRadius = 0;
> > }
> > template < typename TInputImage, typename TOutputImage >
> > void SheppLoganFilter< TInputImage, TOutputImage >
> > ::ThreadedGenerateData(const RegionType&
> >   regionForThread, int threadId )
> > {
> > if(m_VRadius <= 0)
> > itkExceptionMacro(<< "Member variable VRadius not properly
> initialized.");
> > //pointers to output and input image
> > ImageConstPointer inputImage  = this->GetInput();
> > ImagePointer outputImage = this->GetOutput();
> > RegionType inputRegion = inputImage->GetLargestPossibleRegion();
> > RegionType outputRegion = outputImage->GetLargestPossibleRegion();
> > IteratorType out(outputImage, outputRegion);
> > NeighborhoodIteratorType::RadiusType radius;
> > radius.Fill(0);
> > radius[1] = m_VRadius;
> > int vDim = m_VRadius*2+1;
> > NeighborhoodIteratorType it(radius, inputImage, inputRegion);
> > //pointer to Shepp-Logan filter weights
> > float *sl = new float[vDim];
> > //vector with the OffsetTypes for the neighborhood iterator
> > std::vector< NeighborhoodIteratorType::OffsetType > offset;
> > int actIndex;
> > for(int i = -m_VRadius; i <= m_VRadius; ++i)
> > {
> > actIndex = i + m_VRadius;
> > *(sl+actIndex) = -2.0/(PI*PI*(4*i*i-1));
> > NeighborhoodIteratorType::OffsetType tmpO = {{0,i}};
> > offset.push_back(tmpO);
> > }
> > std::vector< int > tmpImg;
> > for (it.GoToBegin(), out.GoToBegin(); !it.IsAtEnd(); ++it, ++out)
> > {
> > float sum = 0;
> > for(int i = 0; i < m_VRadius*2+1; ++i)
> > {
> > sum += *(sl+i) * it.GetPixel(offset[i]);
> > }
> > tmpImg.push_back(sum);
> > }
> > int i = 0;
> > for (it.GoToBegin(), out.GoToBegin(); !it.IsAtEnd(); ++it, ++out)
> > {
> > out.Set(tmpImg[i++]);
> > }
> > }
> >
> > template < typename TInputImage, typename TOutputImage>
> > void SheppLoganFilter< TInputImage, TOutputImage
> >::PrintSelf(std::ostream&
> > os, itk::Indent indent) const
> > {
> > Superclass::PrintSelf(os,indent);
> > os << "VRadius = " << m_VRadius << std::endl;
> > }
> >
> > #endif
> >
> >
> > _____________________________________
> > 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
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20091214/6cef11ae/attachment-0001.htm>


More information about the Insight-users mailing list