[Insight-users] change every voxel value of a 3d image
Luis Ibanez
luis.ibanez at kitware.com
Tue May 25 10:47:27 EDT 2010
Hi Marco,
It seems that, what you want to do is to add a
constant value to all the pixels in the image.
If so, you probably want to use the filter:
itkAddConstantToImageFilter.h
that you will find in
Insight/Code/Review
In order to use this filter you simply need to enable the CMake
variable "ITK_USE_REVIEW" when you configure ITK.
The code should simply look like:
const unsigned int ImageDimension = 3;
typedef unsigned char PixelType;
typedef itk::Image<PixelType, ImageDimension> ImageType;
typedef itk::AddConstantToImageFilter<
ImageType, PixelType, ImageType > FilterType;
typedef itk::ImageFileReader< ImageType > ReaderType;
typedef itk::ImageFileWriter< ImageType > WriterType;
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
FilterType::Pointer filter = FilterType::New();
reader->SetFileName( argv[1] );
writer->SetFileName( argv[2] );
filter->SetInput( reader->GetOutput() );
writer->SetInput( filter->GetOutput() );
filter->SetConstant( 100 );
writer->Update();
Regards,
Luis
---------------------------------------------------------------------------------------
On Mon, May 17, 2010 at 11:49 AM, Sergio Vera <sergio.vera at alma3d.com> wrote:
> Hello Marco,
>
> As i don't know what type of output image your code is generating right now
> (you may want to upload an simple 2d-example on a public site so other users
> can see it and try to figure what's happening) I will guess that maybe the
> problem is that you are working with unsigned char images (0-255 possible
> values) but you are adding 100 to some pixels...
>
> Maybe some values are causing overflow of the maximum unsigned char value
> (say for instance, your input image has intensity = 158 and you are adding
> 100 for a total of 258, a value that cannot be stored in a unsigned char...
> I don't know how the compiler or ITK will handle this, but I suppose it may
> be a source of problems.
>
> You can try to use unsigned short or unsigned int as PixelType and see what
> happens
>
> Regards
>
> On Mon, May 17, 2010 at 4:29 PM, Marco Gheza
> <marcogheza4mailinglists at gmail.com> wrote:
>>
>> Hi Sergio,
>> i tried your solution but the result is the same. it is more fast but i
>> obtain the same result.
>> // Verify the number of parameters on the command line.
>> if ( argc < 7 )
>> {
>> std::cerr << "Missing parameters. " << std::endl;
>> std::cerr << "Usage: " << std::endl;
>> std::cerr << argv[0]
>> << " inputImageFile outputImageFile startX startY startZ
>> sizeX sizeY sizeZ"
>> << std::endl;
>> return -1;
>> }
>> const unsigned int Dimension = 3;
>>
>> typedef unsigned char PixelType;
>> typedef itk::Image< PixelType, Dimension > ImageType;
>>
>> typedef itk::ImageRegionConstIterator< ImageType > ConstIteratorType;
>> typedef itk::ImageRegionIterator< ImageType> IteratorType;
>>
>> typedef itk::ImageFileReader< ImageType > ReaderType;
>> typedef itk::ImageFileWriter< ImageType > WriterType;
>> ImageType::RegionType inputRegion;
>> ImageType::RegionType::IndexType inputStart;
>> ImageType::RegionType::SizeType size;
>> inputStart[0] = ::atoi( argv[3] );
>> inputStart[1] = ::atoi( argv[4] );
>> inputStart[2] = ::atoi( argv[5] );
>> size[0] = ::atoi( argv[6] );
>> size[1] = ::atoi( argv[7] );
>> size[2] = ::atoi( argv[8] );
>> inputRegion.SetSize( size );
>> inputRegion.SetIndex( inputStart );
>>
>> ImageType::RegionType outputRegion;
>> ImageType::RegionType::IndexType outputStart;
>> outputStart[0] = 0;
>> outputStart[1] = 0;
>> outputStart[2] = 0;
>> outputRegion.SetSize( size );
>> outputRegion.SetIndex( outputStart );
>>
>> ReaderType::Pointer reader = ReaderType::New();
>> reader->SetFileName( argv[1] );
>> try
>> {
>> reader->Update();
>> }
>> catch ( itk::ExceptionObject &err)
>> {
>> std::cerr << "ExceptionObject caught !" << std::endl;
>> std::cerr << err << std::endl;
>> return -1;
>> }
>> // Check that the region is contained within the input image.
>> if ( ! reader->GetOutput()->GetRequestedRegion().IsInside( inputRegion )
>> )
>> {
>> std::cerr << "Error" << std::endl;
>> std::cerr << "The region " << inputRegion << "is not contained within
>> the input image region "
>> << reader->GetOutput()->GetRequestedRegion() << std::endl;
>> return -1;
>> }
>> ImageType::Pointer outputImage = ImageType::New();
>> outputImage->SetRegions( outputRegion );
>> const ImageType::SpacingType& spacing =
>> reader->GetOutput()->GetSpacing();
>> const ImageType::PointType& inputOrigin =
>> reader->GetOutput()->GetOrigin();
>> double outputOrigin[ Dimension ];
>> for(unsigned int i=0; i< Dimension; i++)
>> {
>> outputOrigin[i] = inputOrigin[i] + spacing[i] * inputStart[i];
>> }
>> outputImage->SetSpacing( spacing );
>> outputImage->SetOrigin( outputOrigin );
>> outputImage->Allocate();
>>
>> ConstIteratorType inputIt( reader->GetOutput(), inputRegion );
>> IteratorType outputIt( outputImage, outputRegion );
>> inputIt.GoToBegin();
>> outputIt.GoToBegin();
>> while( !inputIt.IsAtEnd() )
>> {
>> if(inputIt.Get()!=0)
>> {
>> outputIt.Set( inputIt.Get() + 100);
>> }
>> else
>> outputIt.Set( inputIt.Get() );
>> ++inputIt;
>> ++outputIt;
>> }
>>
>> WriterType::Pointer writer = WriterType::New();
>> writer->SetFileName( argv[2] );
>> writer->SetInput( outputImage );
>> try
>> {
>> writer->Update();
>> }
>> catch ( itk::ExceptionObject &err)
>> {
>> std::cerr << "ExceptionObject caught !" << std::endl;
>> std::cerr << err << std::endl;
>> return -1;
>> }
>> return 0;
>> I don't really know which is the problem.
>> Thanks, bye
>>
>>
>>
>> 2010/5/17 Sergio Vera <sergio.vera at alma3d.com>
>>>
>>> Hi Marco,
>>> The correct way of traversing elements of a image in ITK is through
>>> iterators:
>>>
>>> typedef itk::ImageRegionIterator<TITKImgType> IteratorType;
>>> IteratorType it(image,image->GetRequestedRegion());
>>>
>>> for (it.GoToBegin(); !it.IsAtEnd(); ++it) {
>>> it.SetPixel(it.GetPixel()+100);
>>> }
>>>
>>> This is an example and I don't know if it will compile or not, but you
>>> get the idea on how to use an iterator to traverse all image pixels. Not
>>> only the code is much simpler but also faster.
>>>
>>> For more info you can look at the itkSoftwareGuide, that has a part
>>> dealing with iterators
>>>
>>> Regards
>>>
>>> On Mon, May 17, 2010 at 4:00 PM, Marco Gheza
>>> <marcogheza4mailinglists at gmail.com> wrote:
>>>>
>>>> Hi,
>>>> i'm trying to access every single voxel of a 3d image and change some
>>>> values. In particular, i want to change that values that are not black;
>>>> every value has to be increased by a value of 100 for example. If a voxel
>>>> has value of 10, i want to give it value of 110.
>>>> Here is my code:
>>>> imageCT->DisconnectPipeline();
>>>> for(i=0;i<512;i++)
>>>> {
>>>> for(j=0;j<512;j++)
>>>> {
>>>> for(k=0;k<311;k++)
>>>> {
>>>> pixelIndex[0] = i; // x position
>>>> pixelIndex[1] = j; // y position
>>>> pixelIndex[2] = k; // z position
>>>> ImageType::PixelType pixelValuePT = imagePT->GetPixel( pixelIndex );
>>>> ImageType::PixelType newValue = pixelValueCT+100;
>>>> if(pixelValueCT!=0)
>>>> {
>>>> imageCT->SetPixel( pixelIndex, newValue );
>>>> }
>>>> }
>>>> }
>>>> }
>>>> This code doesn't do the work well. Do you know how to change it?
>>>> Thank you,
>>>> bye,
>>>> Marco
>>>> _____________________________________
>>>> 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
>>>>
>>>
>>>
>>>
>>> --
>>> Sergio Vera
>>>
>>> Alma IT Systems
>>> C/ Vilana, 4B, 4º 1ª
>>> 08022 Barcelona
>>> T. (+34) 932 380 592
>>> www.alma3d.com
>>
>
>
>
> --
> Sergio Vera
>
> Alma IT Systems
> C/ Vilana, 4B, 4º 1ª
> 08022 Barcelona
> T. (+34) 932 380 592
> www.alma3d.com
>
> _____________________________________
> 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
>
>
More information about the Insight-users
mailing list