[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