[Insight-users] ScalarImageTextureCalculator
Zachary Pincus
zpincus at stanford.edu
Tue Mar 29 13:54:08 EST 2005
So the problem is that you have a low dynamic-range image in a higher
dynamic range pixel type. Now, as you recall from the documentation,
the GLCM generator builds a histogram, so it needs to know the
appropriate range over which to build the histogram bins. It defaults
to using the entire dynamic range of the pixel type, as stated in the
documentation:
http://www.itk.org/Doxygen/html/
classitk_1_1Statistics_1_1ScalarImageToGreyLevelCooccurrenceMatrixGenera
tor.html
> The number of histogram bins on each axis can be set (defaults to
> 256). Also, by default the histogram min and max corresponds to the
> largest and smallest possible pixel value of that pixel type. To
> customize the histogram bounds for a given image, the max and min
> pixel values that will be placed in the histogram can be set manually.
So using a short pixel type, you have 256 bins covering 2^16 values by
default. Now, if you give the generator an image with only 256
intensity values, all the values go into the first bin, giving you the
degenerate results you saw.
You thus have two options:
(1) Use SetPixelMaximumMinimum() to set the range to the dynamic range
of the pixels in *that image*. The MinimumMaximumImageCalculator class
can find these values, or you could do so trivially yourself. This has
the drawback of, basically, normalizing the input image for brightness.
(2) The other option is to use SetPixelMaximumMinimum() to set the
range to the dynamic range of the pixel type that the images were
originally stored in on disk. This information can be discovered as
follows:
fileReader->SetFileName(name);
fileReader->Update();
itk::ImageIOBase::IOComponentType dataType =
fileReader->GetImageIO()->GetComponentType();
IOComponentType is an enum listing the various possible data types for
scalar pixels or vector components. You can then recover the min and
max for these types with a big nasty switch statement. (But perhaps
there's a better way?)
switch(dataType) {
case itk::ImageIOBase::UCHAR:
min = itk::NumericTraits<unsigned char>::min();
max = itk::NumericTraits<unsigned char>::max();
break;
case itk::ImageIOBase::CHAR:
min = itk::NumericTraits<char>::min();
max = itk::NumericTraits<char>::max();
break;
case itk::ImageIOBase::USHORT:
min = itk::NumericTraits<unsigned short>::min();
max = itk::NumericTraits<unsigned short>::max();
break;
case itk::ImageIOBase::SHORT:
min = itk::NumericTraits<short>::min();
max = itk::NumericTraits<short>::max();
break;
case itk::ImageIOBase::UINT:
min = itk::NumericTraits<unsigned int>::min();
max = itk::NumericTraits<unsigned int>::max();
break;
case itk::ImageIOBase::INT:
min = itk::NumericTraits<int>::min();
max = itk::NumericTraits<int>::max();
break;
case itk::ImageIOBase::ULONG:
min = itk::NumericTraits<unsigned long>::min();
max = itk::NumericTraits<unsigned long>::max();
break;
case itk::ImageIOBase::LONG:
min = itk::NumericTraits<long>::min();
max = itk::NumericTraits<long>::max();
break;
case itk::ImageIOBase::FLOAT:
min = itk::NumericTraits<float>::min();
max = itk::NumericTraits<float>::max();
break;
case itk::ImageIOBase::DOUBLE:
min = itk::NumericTraits<double>::min();
max = itk::NumericTraits<double>::max();
break;
}
On Mar 29, 2005, at 1:43 AM, marquis2 at etu.unige.ch wrote:
>
>> It's extremely unlikely that a file format change *alone* would cause
>> the ImageTextureCalculator to fail, since by the time the images are
>> read into ITK, the format ceases to matter and they are just bits in a
>> buffer.
> yes but with jpeg, the pixels range from 0 to 255, with dicom from
> -1000
> (sometimes -3000) to 1000 or more.
>
>
>> So: (1) Are the DICOM images and the JPEG images that you give to the
>> ImageFileReaders *identical* ?
> they are not identical, the jpeg come from the brodatz collection, the
> dicom are lung CT.
>
> If I change the pixel type from short to unsigned char, the values seem
> to be ok for the jpeg. But then I cannot deal with the dicom (all
> pixels
> are trunkated to the 8 lesser bits.)
>
> Question: what should I put in SetPixelMaximumMinimum() ? I mean, if
> I want my soft to deal both type of images?
>
> Samuel
>
>
>
>
>
>
>
> _______________________________________________
> 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