[Insight-users] Create the histogram of an image

Miller, James V (Research) millerjv at crd . ge . com
Fri, 20 Jun 2003 09:37:23 -0400


Jisung,

Should be an adaptor such that step #1 doesn't need to copy the image?

Should we have an encapsulation of these steps to make it easier on
the user?  Something like a ImageToHistogramGenerator that would perform
the steps you outlined.

Jim



> -----Original Message-----
> From: Jisung Kim [mailto:bahrahm at yahoo . com]
> Sent: Thursday, June 19, 2003 9:44 PM
> To: SERIOT_Rimi________DEC/SPUA/LTEC; Insight-Users
> Subject: Re: [Insight-users] Create the histogram of an image
> 
> 
> Hi.
> 
> You might want to look at the ImageToListAdaptor.cxx
> and ListSampleToHistogramGenerator.cxx in the "insight
> src dir"/Examples/Statistics.
> 
> In ImageToListAdaptor.cxx, you can find how to create
> a ListSample from an image. In
> ListSampleToHistogramGenerator.cxx, you will find a
> way to create a equi-size bin histogram from a
> ListSample.
> 
> The procedure would be:
> 1) cast the original image(scalar pixel type) to an
> image with array pixel type. (use the
> itk::ScalarToArrayCastImageFilter)
> 2) plug in the output image from the step 1) to the
> itk::Statistics::ImageToListAdaptor.
> 3) create an equi-interval bin histogram using the
> itk::Statistics::ListSampleToHistogramGenerator. (The
> input for the generator is the ImageToListAdaptor
> object from the step 2).
> 
> I hope this help.
> 
> Thanks,  
> --- SERIOT_Remi________DEC/SPUA/LTEC
> <SERIOT at DRNCAD . CEA . FR> wrote:
> > Hi Luis,
> > 
> > Thanks for your help, but do you have a simple way
> > for create the histogram
> > of an image ?
> > 
> > I found this code...may be you've got something more
> > simple...
> > 
> > 
> >
> itk::MinimumMaximumImageCalculator<ImageType>::Pointer
> > rangeCalculator = 
> > 	
> >
> itk::MinimumMaximumImageCalculator<ImageType>::New();
> > 	rangeCalculator->SetImage( m_image );
> > 	rangeCalculator->Compute();
> > 
> > 	MinValue = rangeCalculator->GetMinimum();
> > 	MaxValue = rangeCalculator->GetMaximum();
> > 
> > 	typedef itk::Statistics::Histogram<PixelType, 1>
> > HistogramType;
> > 	histogram = HistogramType::New();
> > 
> > 	HistogramType::SizeType size;
> > 	size[0] = MaxValue;
> > 	histogram->Initialize( size );
> > 
> > 	for ( int ibin = 0; ibin < MaxValue - 1; ibin++ ) {
> > 		histogram->SetBinMin( 0, ibin, ibin );
> > 		histogram->SetBinMax( 0, ibin, ( ibin + 1 ) );
> >     }
> > 	// put each image pixel into the histogram
> > 	typedef itk::ImageRegionConstIterator<ImageType>
> > ConstIterator;
> > 	ConstIterator iter( m_image,
> > m_image->GetBufferedRegion() );
> > 
> > 	while ( !iter.IsAtEnd() ) {
> > 		
> > 		PixelType value = iter.Get();
> > 		
> > 		if ( static_cast<double>(value) >= MinValue && 
> > 			 static_cast<double>(value) <= MaxValue ) {
> >       
> > 			// add sample to histogram
> > 
> > 			HistogramType::IndexType index;
> > 			HistogramType::InstanceIdentifier id;
> > 			HistogramType::MeasurementVectorType 
> measurement;
> >   
> > 			measurement[0] = value;
> > 			index = histogram->GetIndex( measurement );
> > 			id = histogram->GetInstanceIdentifier( index );
> > 			histogram->IncreaseFrequency( id, 1 );
> > 		}
> > 		++iter;
> > 	}
> > 
> > Thanks
> > 
> > Remi
> > 
> > > -----Message d'origine-----
> > > De : Luis Ibanez [mailto:luis . ibanez at kitware . com]
> > > Envoye : mercredi 18 juin 2003 16:02
> > > A : SERIOT Remi DEC/SPUA/LTEC
> > > Cc : 'Joshua Cates';
> > 'insight-users at public . kitware . com'; Jisung Kim
> > > Objet : Re: [Insight-users] Sorting watershed
> > basins based on size
> > > 
> > > 
> > > 
> > > Hi Remi,
> > > 
> > > It sounds like you could simply compute the
> > Histogram
> > > of the labeled image.
> > > 
> > > The histogram will give you the number of pixels
> > assigned
> > > to each one of the labels, and since the labels
> > are unique,
> > > you will get the number of pixels on each watersed
> > basin.
> > > 
> > > You will find details on the use of the ITK
> > histogram
> > > in the Statistics chapter of the SoftwareGuide.
> > > 
> > >    'insight-users at public . kitware . com'
> > > 
> > > Section 9.1.3, pdf-page 320
> > > 
> > > The associated example is available in
> > > 
> > >     Insight/Examples/Statistics/Histogram.cxx
> > > 
> > > In the same chapter you will find options for
> > sorting.
> > > 
> > > 
> > > 
> > > Regards,
> > > 
> > > 
> > >     Luis
> > > 
> > > 
> > > -------------------------------
> > > SERIOT Remi DEC/SPUA/LTEC wrote:
> > > > Hi,
> > > > 
> > > > I would like to sort watershed basins based on
> > size, so I 
> > > need to calculate
> > > > the size of each basin from the labeled image. I
> > need to do 
> > > that and I don't
> > > > wont to re-invent something already done.
> > > > I think that I could use a simple ImageIterator
> > and an 
> > > accumulator for
> > > > compute the number of pixels in each basin from
> > the labeled 
> > > image and then
> > > > sort this list for keep only the most
> > significant basins.
> > > > 
> > > > Could I speed it up this process with
> > > > itk::watershed::Segmenter::flat_region_t
> > information ?
> > > > 
> > > > Or there is another way to do the same thing ?
> > > > 
> > > > After that could I have to change the
> > EquivalencyTable ?
> > > > 
> > > > Thanks for your help
> > > >  
> > > > Remi
> > > > 
> > > > 
> > > >>-----Message d'origine-----
> > > >>De : Joshua Cates [mailto:cates at sci . utah . edu]
> > > >>Envoye : vendredi 13 juin 2003 18:05
> > > >>A : SERIOT Remi DEC/SPUA/LTEC
> > > >>Cc : 'insight-users at public . kitware . com'
> > > >>Objet : RE: [Insight-users] How to create my own
> > 
> > > >>NeighborhoodOperator ?
> > > >>
> > > >>
> > > >>Hi Remi,
> > > >>
> > > >>Glad to hear the NeighborhoodOperator is working
> > out.
> > > >>
> > > >>In order to sort and merge watershed basins
> > based on size you 
> > > >>will have to
> > > >>modify the itkWatershedSegmenter algorithm to
> > keep track of 
> > > >>basin sizes.  
> > > >>The initial size would need to be computed in
> > the gradient 
> > > >>descent step of
> > > >>itkWatershedSegmenter and then updated and
> > maintained during 
> > > >>basin merge
> > > >>operations.
> > > >>
> > > >>An alternate approach of a one-time suppression
> > of small 
> > > basins in the
> > > >>initial output might be interesting (but will
> > result in a different
> > > >>algorithm and I can't guarantee you won't get
> > some 
> > > >>undesirable grouping of
> > > >>basins).  You could calculate the basin sizes
> > from the the initial
> > > >>segmentation (zero merge level output) of the 
> > > >>WatershedSegmenter and then
> > > >>use some of the existing code for basin merges
> > (in
> > > >>itkWatershedSegmentTreeGenerator, for example)
> > to pre-merge 
> > > >>the smaller
> > > >>basins in the segment tree.
> > > >>
> > > >>Josh.
> > > >>______________________________
> > > >> Josh Cates			
> > > >> School of Computer Science	
> > > >> University of Utah
> > > >> Email: cates at sci . utah . edu
> > > >> Phone: (801) 587-7697
> > > >> URL:   http://www . sci . utah . edu/~cates
> > > >>
> > 
> === message truncated ===
> 
> 
> =====
> Jisung Kim
> bahrahm at yahoo . com
> 106 Mason Farm Rd.
> 129 Radiology Research Lab., CB# 7515
> Univ. of North Carolina at Chapel Hill
> Chapel Hill, NC 27599-7515
> 
> __________________________________
> Do you Yahoo!?
> SBC Yahoo! DSL - Now only $29.95 per month!
> http://sbc . yahoo . com
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk . org
> http://www . itk . org/mailman/listinfo/insight-users
>