⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 itkpybuffer.txx

📁 DTMK软件开发包,此为开源软件,是一款很好的医学图像开发资源.
💻 TXX
字号:
/*=========================================================================

  Program:   Insight Segmentation & Registration Toolkit
  Module:    $RCSfile: itkPyBuffer.txx,v $
  Language:  C++
  Date:      $Date: 2005-03-25 13:17:57 $
  Version:   $Revision: 1.1 $

  Copyright (c) Insight Software Consortium. All rights reserved.
  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even 
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/
#ifndef _itkPyBuffer_txx
#define _itkPyBuffer_txx

#include "itkPyBuffer.h"

namespace itk
{

template<typename TImage>
PyBuffer<TImage>
::PyBuffer()
{
    this->obj = NULL;
    this->m_Importer = ImporterType::New();
    
    import_libnumarray();
}

template<typename TImage>
PyBuffer<TImage>
::~PyBuffer()
{
    if (this->obj)
    {
        Py_DECREF(this->obj);
    }
    this->obj = NULL;
}

    
template<typename TImage>
PyObject * 
PyBuffer<TImage>
::GetArrayFromImage( const ImageType * image )
{
   if( !image )
     {
     itkExceptionMacro("Input image is null");
     }

   PixelType * buffer = const_cast< PixelType *>( image->GetBufferPointer() );

   char * data = (char *)( buffer );
   
   int dimensions[ ImageDimension ];

   SizeType size = image->GetBufferedRegion().GetSize();

   for(unsigned int d=0; d < ImageDimension; d++ )
     {
     dimensions[d] = size[d];
     }

   int item_type = 0;  // TODO find a way of doing this through pixel traits
   
   this->obj = PyArray_FromDimsAndData( ImageDimension, dimensions, item_type, data );

   return this->obj;
}



template<typename TImage>
const typename PyBuffer<TImage>::ImageType * 
PyBuffer<TImage>
::GetImageFromArray( PyObject *obj )
{
    if (obj != this->obj)
    {
        if (this->obj)
        {
            // get rid of our reference
            Py_DECREF(this->obj);
        }

        // store the new object
        this->obj = obj;

        if (this->obj)
        {
            // take out reference (so that the calling code doesn't
            // have to keep a binding to the callable around)
            Py_INCREF(this->obj);
        }
    }
    

    int element_type = PyArray_DOUBLE;  // change this with pixel traits.

    PyArrayObject * parray = 
          (PyArrayObject *) PyArray_ContiguousFromObject( 
                                                    this->obj, 
                                                    element_type,
                                                    ImageDimension,
                                                    ImageDimension  );

    if( parray == NULL )
      {
      itkExceptionMacro("Contiguous array couldn't be created from input python object");
      }

    const unsigned int imageDimension = parray->nd;
    
    SizeType size;

    unsigned int numberOfPixels = 1;

    for( unsigned int d=0; d<imageDimension; d++ )
      {
      size[d]         = parray->dimensions[d];
      numberOfPixels *= parray->dimensions[d];
      }

    IndexType start;
    start.Fill( 0 );

    RegionType region;
    region.SetIndex( start );
    region.SetSize( size );

    PointType origin;
    origin.Fill( 0.0 );

    SpacingType spacing;
    spacing.Fill( 1.0 );

    this->m_Importer->SetRegion( region );
    this->m_Importer->SetOrigin( origin );
    this->m_Importer->SetSpacing( spacing );

    const bool importImageFilterWillOwnTheBuffer = false;
    
    PixelType * data = (PixelType *)parray->data;
    
    this->m_Importer->SetImportPointer( 
                        data,
                        numberOfPixels,
                        importImageFilterWillOwnTheBuffer );

    this->m_Importer->Update();
    
    return this->m_Importer->GetOutput();
}



} // namespace itk

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -