[Insight-users] Reading bmp image with ITK

Julien Jomier jjomier at cs.unc.edu
Mon Nov 8 22:09:39 EST 2004


Hi Jimmy,

I just put a fix in the cvs repository. Now BMPImageIO is supporting
grayscale images.
Let us know if you have any other problems,

Thanks for the report,

Julien

----- Original Message ----- 
From: "Luis Ibanez" <luis.ibanez at kitware.com>
To: "Jimmy Wong" <good_piggy at msn.com>
Cc: <Insight-users at itk.org>; "Julien Jomier" <jjomier at cs.unc.edu>
Sent: Monday, November 08, 2004 8:20 PM
Subject: Re: [Insight-users] Reading bmp image with ITK


>
> Hi Jimmy,
>
>
> Please point us to the BMP version of Lena that you are trying to read.
>
> The reason why this class is predispossed to RGB pixels is that this
> is the generic form of BMP files.
>
> You may want to log into the bug tracking database and add
> this as a Feature Request.  Somehting like "Extending BMP reader/writer
> for supporting grayscale (non-RGB) images"
>
> You can create your account in the bug tracker by simply using your
> email address in the following link
>
>
>                  http://www.itk.org/Bug/
>
>
> Please let us know if you find any problem with the bug database,
>
>
>    Thanks
>
>
>       Luis
>
>
>
> ---------------------
> Jimmy Wong wrote:
>
> > Hi, Luis,
> >
> > Thank you for your code and revision. But still canno't read Lena.bmp,
> > the most popular image. I don't know why. However, I try it on jpeg
> > image, it works.
> >
> > Can you tell me why we need RGB pixels?
> >
> > Regards,
> >
> > Zhimin
> >
> >> From: Luis Ibanez <luis.ibanez at kitware.com>
> >> To: Jimmy Wong <good_piggy at msn.com>
> >> CC: Insight-users at itk.org
> >> Subject: Re: [Insight-users] Reading bmp image with ITK
> >> Date: Tue, 02 Nov 2004 13:28:17 -0500
> >>
> >> Hi Jimmy,
> >>
> >> When you read/write BMP images you should use
> >> images defined over RGBPixels. Like in
> >>
> >>
> >> typedef unsigned char ComponentType;
> >> typedef itk::RGBPixel<ComponentType> PixelType;
> >> const unsigned int Dimension = 2;
> >> typedef itk::Image< PixelType, Dimension >    ImageType;
> >>
> >> typedef itk::ImageFileReader< ImageType >    ReaderType;
> >> typedef itk::ImageFileWriter< ImageType >    WriterType;
> >>
> >> ReaderType::Pointer reader = ReaderType::New();
> >> WriterType::Pointer writer = WriterType::New();
> >>
> >> reader->SetFileName("Input.bmp");
> >> reader->Update();
> >>
> >>
> >> Please find attached the modified version of
> >> your program. It is now using RGBPixels and
> >> it is working fine for reading and writing BMP.
> >>
> >>
> >>   Regards,
> >>
> >>
> >>      Luis
> >>
> >>
> >>
> >> -----------------------------
> >> Jimmy Wong wrote:
> >>
> >>> Thank you for these information.
> >>>
> >>> Actually, I am using the data provided by Brainweb Database.
> >>>
> >>> But if I want to use some synthetic images to test my algorithm, I
> >>> have no choice but use bmp. For this part, any suggestion.
> >>>
> >>> For the program, I think it should be ok. But whenever I run it, it
> >>> poped a dialog with " The instruction at "0x77f58df" referenced
> >>> memory at "0x2a262430". The memory could not be "written"". I don't
> >>> know why.
> >>>
> >>> My synthetic image is 256 by 256 bmp image.
> >>>
> >>> Zhimin
> >>>
> >>>
> >>>> From: Luis Ibanez <luis.ibanez at kitware.com>
> >>>> To: Jimmy Wong <good_piggy at msn.com>
> >>>> CC: Insight-users at itk.org
> >>>> Subject: Re: [Insight-users] Reading bmp image with ITK
> >>>> Date: Mon, 01 Nov 2004 10:33:20 -0500
> >>>>
> >>>>
> >>>> Hi Jimmy,
> >>>>
> >>>> If you want to rank these three file formats by
> >>>> they suitability for storing Medical Images,
> >>>> here is a tentative list:
> >>>>
> >>>>       BMP  is poor
> >>>>       JPEG is poorer
> >>>>       RAW  is the poorest
> >>>>
> >>>> All of them lack fields for patient information,
> >>>> spacing (BMP has a bit of spacing in the form of
> >>>> #pixels per centimeter), origin, orientation.
> >>>>
> >>>> JPEG is poorer because it uses lossy compression.
> >>>> The JPEG compression algorithm was not designed
> >>>> for medical images but for picture scenes, for
> >>>> example the photos of a Birthday party or the
> >>>> picture of a dog sitting in the backyard.  :-)
> >>>>
> >>>> JPEG is not what you want to use if your image
> >>>> actually contain a tumor. It is particularly bad
> >>>> for segmentation because the compression is done
> >>>> in blocks of 8x8 pixels, therefore the consistency
> >>>> of intensities across those blocks is compromised.
> >>>>
> >>>> RAW is plain *dangerous* it doesn't contain any
> >>>> information about the pixel type being used, the
> >>>> image dimensions, the endianess, the pixel spacing,
> >>>> the origin.  In practice, RAW is useless if you don't
> >>>> have an accompanying header that tells you the
> >>>> characteristics of the image.
> >>>>
> >>>>
> >>>> If you are storing real patient data you may want
> >>>> to use Analyze, GIPL or MetaImage, or to stick to
> >>>> the original DICOM files that are produced from
> >>>> CT and MRI scanners.
> >>>>
> >>>>
> >>>> -------------------
> >>>>
> >>>> About your code:
> >>>>
> >>>> It seems to be fine for reading a BMP image
> >>>> and writing it down.
> >>>>
> >>>> Did you find any problem while running this code ?
> >>>>
> >>>>
> >>>>
> >>>>    Regards,
> >>>>
> >>>>
> >>>>       Luis
> >>>>
> >>>>
> >>>>
> >>>> PS: Note that a bug was recently fixed in the BMP
> >>>> reader/writer. This bug manifested in problems when
> >>>> reading or writing images whose row size was not a
> >>>> multiple of 4.  If you are using BMP images you may
> >>>> want to use a recent CVS checkout of the toolkit.
> >>>>
> >>>>
> >>>> --------------------
> >>>> Jimmy Wong wrote:
> >>>>
> >>>>> Thank you for your reply.
> >>>>>
> >>>>> If bmp is poor, which one is better? raw or jpg?
> >>>>>
> >>>>> I've read the manual, but very confuse of it.
> >>>>>
> >>>>> Here is my main function
> >>>>>
> >>>>> **********************************************
> >>>>> void main()
> >>>>> {
> >>>>>     // Definition of stuctures
> >>>>>     typedef unsigned char    PixelType;
> >>>>>     const    unsigned int    Dimension = 2;
> >>>>>     typedef itk::Image< PixelType, Dimension >    ImageType;
> >>>>>
> >>>>>     typedef itk::ImageFileReader< ImageType >    ReaderType;
> >>>>>     typedef itk::ImageFileWriter< ImageType >    WriterType;
> >>>>>
> >>>>>     // Create a object of reader and read the image
> >>>>>     ReaderType::Pointer reader = ReaderType::New();
> >>>>>     WriterType::Pointer writer = WriterType::New();
> >>>>>
> >>>>>     const char pInputfileName[] = "Input.bmp";
> >>>>>     const char pOutputfileName[] = "Output.bmp";
> >>>>>
> >>>>>     reader->SetFileName( pInputfileName );
> >>>>>     reader->Update();
> >>>>>
> >>>>>     ImageType::Pointer image = reader->GetOutput();
> >>>>>
> >>>>>
> >>>>>     writer->SetFileName( pOutputfileName );
> >>>>>
> >>>>>     writer->SetInput( reader->GetOutput() );
> >>>>>
> >>>>>     try
> >>>>>    {
> >>>>>         writer->Update();
> >>>>>    }
> >>>>>
> >>>>>     catch( itk::ExceptionObject & err )
> >>>>>    {
> >>>>>         std::cout << "ExceptionObject caught !" << std::endl;
> >>>>>         std::cout << err << std::endl;
> >>>>>         exit(-1);
> >>>>>    }
> >>>>> }
> >>>>> ******************************************************
> >>>>>
> >>>>> Is it correct for reading image?
> >>>>>
> >>>>> Thank you again.
> >>>>>
> >>>>> Zhimin
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>
> >>>>
> >>>>
> >>>>
> >>>
> >>> # This project is designed to be built outside the Insight source
tree.
> >>> PROJECT(ReadWriteImage)
> >>>
> >>> # Find ITK.
> >>> FIND_PACKAGE(ITK)
> >>> IF(ITK_FOUND)
> >>>  INCLUDE(${ITK_USE_FILE})
> >>> ENDIF(ITK_FOUND)
> >>>
> >>> # Find VTK.
> >>> FIND_PACKAGE ( VTK)
> >>> IF ( VTK_FOUND)
> >>>  INCLUDE( ${USE_VTK_FILE} )
> >>> ENDIF( VTK_FOUND)
> >>>
> >>> INCLUDE_DIRECTORIES(${myProject_SOURCE_DIR})
> >>>
> >>> ADD_EXECUTABLE(ReadWriteImage ReadWriteImage.cxx )
> >>>
> >>> TARGET_LINK_LIBRARIES(ReadWriteImage
> >>> ITKBasicFilters ITKCommon ITKIO
> >>> vtkRendering vtkGraphics vtkHybrid
> >>> vtkImaging vtkIO vtkFiltering vtkCommon)
> >>>
> >>> #include "itkImageFileReader.h"
> >>> #include "itkImageFileWriter.h"
> >>> #include "itkImage.h"
> >>>
> >>> void main()
> >>> {
> >>>     // Definition of stuctures
> >>>     typedef unsigned char    PixelType;
> >>>     const    unsigned int    Dimension = 2;
> >>>     typedef itk::Image< PixelType, Dimension >    ImageType;
> >>>
> >>>     typedef itk::ImageFileReader< ImageType >    ReaderType;
> >>>     typedef itk::ImageFileWriter< ImageType >    WriterType;
> >>>
> >>>     // Create a object of reader and read the image
> >>>     ReaderType::Pointer reader = ReaderType::New();
> >>>     WriterType::Pointer writer = WriterType::New();
> >>>
> >>>     const char pInputfileName[] = "Input.bmp";
> >>>     const char pOutputfileName[] = "Output.bmp";
> >>>
> >>>     reader->SetFileName( pInputfileName );
> >>>     reader->Update();
> >>>
> >>>     ImageType::Pointer image = reader->GetOutput();
> >>>
> >>>
> >>>     writer->SetFileName( pOutputfileName );
> >>>
> >>>     writer->SetInput( reader->GetOutput() );
> >>>
> >>>     try
> >>>    {
> >>>         writer->Update();
> >>>    }
> >>>
> >>>     catch( itk::ExceptionObject & err )
> >>>    {
> >>>         std::cout << "ExceptionObject caught !" << std::endl;
> >>>         std::cout << err << std::endl;
> >>>         exit(-1);
> >>>    }
> >>> }
> >>>
> >>>
> >>
> >> ================================================================
> >>
> >>
> >>
> >>
> >>
> >> #include "itkImageFileWriter.h"
> >> #include "itkImageFileReader.h"
> >> #include "itkImage.h"
> >> #include "itkRGBPixel.h"
> >>
> >> int main()
> >> {
> >>     // Definition of stuctures
> >>     typedef unsigned char ComponentType;
> >>     typedef itk::RGBPixel<ComponentType> PixelType;
> >>     const    unsigned int    Dimension = 2;
> >>     typedef itk::Image< PixelType, Dimension >    ImageType;
> >>
> >>     typedef itk::ImageFileReader< ImageType >    ReaderType;
> >>     typedef itk::ImageFileWriter< ImageType >    WriterType;
> >>
> >>     // Create a object of reader and read the image
> >>     ReaderType::Pointer reader = ReaderType::New();
> >>     WriterType::Pointer writer = WriterType::New();
> >>
> >>     const char * pInputfileName = "Input.bmp";
> >>     const char * pOutputfileName = "Output.bmp";
> >>
> >>     reader->SetFileName( pInputfileName );
> >>     reader->Update();
> >>
> >>     ImageType::Pointer image = reader->GetOutput();
> >>
> >>
> >>     writer->SetFileName( pOutputfileName );
> >>
> >>     writer->SetInput( reader->GetOutput() );
> >>
> >>     try
> >>     {
> >>         writer->Update();
> >>     }
> >>
> >>     catch( itk::ExceptionObject & err )
> >>     {
> >>         std::cout << "ExceptionObject caught !" << std::endl;
> >>         std::cout << err << std::endl;
> >>         exit(-1);
> >>     }
> >>   return 0;
> >> }
> >>
> >>
> >
> >
> >
> >
>
>
>
>
> _______________________________________________
> 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