[Insight-users] Histogram modification - troubles with SetFrequency

sacrif markus_m at gmx.net
Thu Dec 31 09:31:43 EST 2009


Thank you, the question does not need to be answerd any more! It seems to
work now.
The following lines must be added before the for loop:

HistogramType::SizeType size;
size.Fill(initialHistogram_->Size());

HistogramType::MeasurementVectorType min;
HistogramType::MeasurementVectorType max;
min.Fill(intensityMin);
max.Fill(intensityMax);

testHist->Initialize(size,min,max);


Regards


sacrif wrote:
> 
> Hello, thank you for your reply!
> 
> In the meanwhile I worked arround with an std::vector. However I now came
> to a point where I need the itk histogram again. So I tried to copy the
> histogram, but unfortunately there seem to be some problems.
> 
> What I did is I created a histogram using a histogram generator and now I
> try to copy this const histogram into a not const histogram. My attemt to
> do so is below:
> 
> typedef itk::Image<PixelType, Dimension> InputImageType;
> typedef itk::Statistics::ScalarImageToHistogramGenerator< 
>                                  InputImageType >  
> HistogramGeneratorType;
> typedef HistogramGeneratorType::HistogramType  HistogramType;
> 
> ...
> 
> const HistogramType * histogram1 = histogramGenerator->GetOutput();
> 
> HistogramType::Pointer testHist = HistogramType::New();
> 
> for(unsigned int i = 0; i < histogram1->Size(); i++)
> {
>     testHist->SetBinMin(0,i,histogram1->GetBinMin(0,i));
>     testHist->SetBinMax(0,i,histogram1->GetBinMax(0,i));
>     testHist->SetFrequency(i,histogram1->GetFrequency(i,0));
> }  
> 
> This does unfortunately (and as I almost expected) not work(When I execute
> the program I get the following message from the MS VC++ Debug Library:
> Debug Assertion Failed ... Expression: vector subscript out of Range!).
> However I can not find Methods for my testHist that allow to set the
> values which I set for the histogramGenerator which created histogram1.
> (Like ->SetNumberOfBins(), SetHistogramMin(), SetHistogramMax())
> The only method that could help I found was testHist->Initialize(), which
> I assume I have to call before the for loop above.
> 
> However I am not quite sure which values the method needs.
> According to the description these are:
> - const Histogram<...>::SizeType &size
> and optionally:
> - Histogram<...>::MeasurementVectorType &lowerBound
> - Histogram<...>::MeasurementVectorType &upperBound
> 
> For now I only entered the first value:
> - histogram1->Size()
> 
> When compiling this results in the following error:
> 
> 1>..\Alpha_Histogramm\AlphaHistogram.cpp(288) : error C2664: 'void
> itk::Statistics::Histogram<TMeasurement,VMeasurementVectorSize,TFrequencyContainer>::Initialize(const
> itk::Size<VDimension> &)' : cannot convert parameter 1 from 'unsigned int'
> to 'const itk::Size<VDimension> &'
> 1>        with
> 1>        [
> 1>            TMeasurement=double,
> 1>            VMeasurementVectorSize=1,
> 1>           
> TFrequencyContainer=itk::Statistics::DenseFrequencyContainer,
> 1>            VDimension=1
> 1>        ]
> 1>        and
> 1>        [
> 1>            VDimension=1
> 1>        ]
> 1>        Reason: cannot convert from 'unsigned int' to 'const
> itk::Size<VDimension>'
> 1>        with
> 1>        [
> 1>            VDimension=1
> 1>        ]
> 1>        No constructor could take the source type, or constructor
> overload resolution was ambiguous
> 
> 
> So my Questions are:
> - What values do I have to enter in the Initialize() method. Is it right
> that the first value (const Histogram<...>::SizeType &size) stands for the
> number of bins? Or does this size stand for something else.
> - Are the other two optional values the intensity minimum and the
> intensity maximum of the histogram? And which methods from the histogram
> which I want to copy do I have to enter for these parameters.
> - Is the generall approach of copying the histogram correct? Or did I miss
> some further steps to make this work?
> 
> 
> Thank you for your help!
> 
> Regards Sacrif
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> Luis Ibanez wrote:
>> 
>> Hi Sacrif,
>> 
>> Thanks for pointing this out.
>> 
>> This is indeed the case,  ITK filters own their output
>> and they are the only ones that should change the
>> output objects.
>> 
>> This is a requirement for good-behavior when the
>> filters are put into a pipeline.
>> 
>> You are not supposed to modify the output of a
>> filter.
>> 
>> In your case, you could create a new Histogram
>> manually, and copy the computed elements
>> from the output of the Histogram that you get from
>> the generator.
>> 
>> Something similar to:
>> 
>> const HistogramType * histogram1 = histogramGenerator->GetOutput();
>> 
>> HistogramType::Pointer histogram2 = HistogramType::New();
>> 
>> // Add here:
>> // Copy lower, upper values of bins
>> // Copy values of numbers of bins
>> // Allocate size for the new historgram2
>> //
>> 
>> //
>> //  Now copy the recomputed values
>> //
>> HistogramType::Iterator itr2 = historgram2->Begin();
>> HistogramType::ConstIterator itr1 = histogram1->Begin();
>> 
>> while( itr1 != histogram1->End() )
>>   {
>>   *itr2 = pow(  *itr1, 2.0 )
>>   ++itr1;
>>   ++itr2;
>>   }
>> 
>> 
>>   Regards,
>> 
>> 
>>         Luis
>> 
>> 
>> --------------------------------------------------------------------------------
>> On Fri, Dec 4, 2009 at 3:43 AM, sacrif <markus_m at gmx.net> wrote:
>>>
>>> Hi, I finally found out what the problem is. The histogram is defined as
>>> const HistogramType * histogram; or HistogramType::ConstPointer
>>> histogram;
>>>
>>> However the SetFrequency method is a not const method. Therefore non of
>>> the
>>> 4 SetFrequency methods is applicable on it.
>>>
>>> The problem is that the GetOutput() method of the
>>> itk::Statistics::ScalarImageToHistogramGenerator class returns a "const
>>> HistogramType *" which I assign to my "const HistogramType* histogram"
>>> pointer. So I can only define the histogram as const. But then the
>>> SetFrequency would not work. (and results in the compilation error:
>>> error
>>> C2663: 'itk::Statistics::Histogram<TMeasurement>::SetFrequency' : 4
>>> overloads have no legal conversion for 'this' pointer...<--as written in
>>> my
>>> previous post)
>>>
>>> Is it possible that a histogram as I defined it can't be changed as soon
>>> as
>>> it is created? Somehow I can't imagine this is the case. But at the
>>> moment I
>>> can only imagine to write the values in an std::vector to proceed
>>> working on
>>> it.
>>> I would appreciate any onther advice.
>>>
>>> Thank you & kind regards
>>>
>>> --
>>> View this message in context:
>>> http://old.nabble.com/Histogram-modification---troubles-with-SetFrequency-tp26615939p26635812.html
>>> Sent from the ITK - Users mailing list archive at Nabble.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
>>>
>> _____________________________________
>> 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
>> 
>> 
> 
> 

-- 
View this message in context: http://old.nabble.com/Histogram-modification---troubles-with-SetFrequency-tp26615939p26978736.html
Sent from the ITK - Users mailing list archive at Nabble.com.



More information about the Insight-users mailing list