[Insight-users] Import a boolean image from an array
frankmiller at jhmi.edu
frankmiller at jhmi.edu
Thu Nov 13 13:50:38 EST 2008
Dan,
A variable of type bool probably has a size of 8-bits on your system.
You can do a
std::cout << sizeof( bool ) << std::endl;
std::cout << sizeof( unsigned char ) << std::endl;
to see. The sizeof operator returns the size in bytes.
The reason that a bool is not 1-bit is because you can only get the
address of a variable at byte resolution.
Thus an array of 16 bools is larger than an array of 2 chars. You are
experiencing a buffer overrun when USE_BOOL_ARRAY is defined as 0. You
have to be very careful when you do low-level stuff like this. sizeof()
is you friend.
Hope this helps.
Frank
On Thu, Nov 13, 2008 at 06:15:00PM +0100, Dan Mueller wrote:
> Hi Insight Users,
>
> I am struggling to understand how to import a data array into an
> itk:Image< bool, 2 >.
>
> I get unexpected results when I use an array of something other than
> bool[], for example unsigned char[]. As far as I understand unsigned
> char is 8-bits (although doing some googling says that is a /minimum/
> of 8-bits, whatever that means). If unsigned char = 8-bits, I would
> expect that creating an unsigned char[], setting some values, casting
> to bool* and importing should operate the same as using a bool[]. But
> the code below does not produce the same result (see attached).
>
> Why not? Is this because of my compiler (Visual Studio 2005)? My
> machine (Windows XP 64-bit)? Or some logical error I can't spot?
>
> Thanks for any advice.
>
> Regards, Dan
>
> === CMakeLists.txt ===
> PROJECT(BoolImageTest)
> CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
>
> FIND_PACKAGE(ITK REQUIRED)
> INCLUDE(${ITK_USE_FILE})
>
> ADD_EXECUTABLE(BoolImageTest main.cxx)
> TARGET_LINK_LIBRARIES(BoolImageTest ITKCommon ITKIO)
>
> === main.cxx ===
>
> #define USE_BOOL_ARRAY 0
>
> #include "itkImage.h"
> #include "itkImportImageFilter.h"
> #include "itkCastImageFilter.h"
> #include "itkImageFileWriter.h"
>
> int main( int argc, char* argv[] )
> {
> typedef bool BoolPixelType;
> typedef unsigned char UnsignedCharPixelType;
> const unsigned int Dimension = 2;
>
> typedef itk::Image< BoolPixelType, Dimension > BoolImageType;
> typedef itk::Image< UnsignedCharPixelType, Dimension > OutputImageType;
> typedef itk::ImportImageFilter< BoolPixelType, Dimension > ImportType;
>
> BoolImageType::SizeType size;
> size[0] = 16;
> size[1] = 1;
> BoolImageType::RegionType region( size );
> BoolImageType::SpacingType spacing;
> spacing.Fill( 1.0 );
> BoolImageType::PointType origin;
> origin.Fill( 1.0 );
>
> #if USE_BOOL_ARRAY
> bool data[16];
> for (unsigned int i=0; i<8; i++)
> data[i] = true;
> for (unsigned int i=8; i<16; i++)
> data[i] = false;
> void* ptr = (void*)&data;
> #else
> unsigned char data[2];
> data[0] = 0xF;
> data[1] = 0x0;
> void* ptr = (void*)&data;
> #endif
>
> ImportType::Pointer import = ImportType::New();
> import->SetRegion( region );
> import->SetSpacing( spacing );
> import->SetOrigin( origin );
> import->SetImportPointer( (bool*)ptr, size[0]*size[1], false );
> import->Update();
>
> typedef itk::CastImageFilter< BoolImageType, OutputImageType > CastType;
> CastType::Pointer cast = CastType::New();
> cast->SetInput( import->GetOutput() );
> cast->Update();
>
> typedef itk::ImageFileWriter< OutputImageType > WriterType;
> WriterType::Pointer writer = WriterType::New( );
> writer->SetInput( cast->GetOutput() );
> writer->SetFileName( "D:/Temp/BoolTestOutput.mhd" );
> writer->Update();
>
> return EXIT_SUCCESS;
> }
>
> === Machine ===
> ITK 3.10
> CMake 2.6.0
> Visual Studio 8.0.50727.762
> Windows XP SP2 X64
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
More information about the Insight-users
mailing list