[ITK-users] Histogram for a double precision array
Dženan Zukić
dzenanz at gmail.com
Thu Jan 26 12:08:36 EST 2017
Hi Dobashi,
adding this line makes the behavior independent from pixel type:
imageToHistogramFilter->SetAutoMinimumMaximum(false);
And this is because ImageToHistogramFilter's constructor has this:
if( typeid(ValueType) == typeid(signed char) || typeid(ValueType) ==
typeid(unsigned char) )
{
autoMinMax->Set(false);
}
else
{
autoMinMax->Set(true);
}
Regards,
Dženan
On Thu, Jan 26, 2017 at 10:51 AM, SDobashi <dobashisuguru at gmail.com> wrote:
> Hello, everyone,
>
> I want to calculate a histogram for a double precision C-array (or
> std::vector<double>).
>
> As a simple example, I tried to calculate a histogram for the data
>
> double data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
>
> for the range from 5 to 10 in 10 bins, and I wrote the code listed in the
> last part of this post.
>
> This code worked well for "unsined char" but not for "double".
>
> Could anyone suggest me why this could happen?
> Please tell me a proper way to calculate a histogram of the double
> precision
> array.
>
> Thanks a lot in advance,.
>
> Kind regards,
>
> # Results for "unsigned char" data and this is what I expected:
>
> Frequency = [ 1,
> 0,
> 1,
> 0,
> 1,
> 0,
> 1,
> 0,
> 1,
> 0 ]
> Frequency of 0 : (5 to 5.5) = 1
> Frequency of 1 : (5.5 to 6) = 0
> Frequency of 2 : (6 to 6.5) = 1
> Frequency of 3 : (6.5 to 7) = 0
> Frequency of 4 : (7 to 7.5) = 1
> Frequency of 5 : (7.5 to 8) = 0
> Frequency of 6 : (8 to 8.5) = 1
> Frequency of 7 : (8.5 to 9) = 0
> Frequency of 8 : (9 to 9.5) = 1
> Frequency of 9 : (9.5 to 10) = 0
> Total count 5
>
> # Results for "double" precision data:
>
> Frequency = [ 1,
> 1,
> 1,
> 1,
> 1,
> 1,
> 1,
> 1,
> 1,
> 1 ]
> Frequency of 0 : (0 to 0.9009) = 1
> Frequency of 1 : (0.9009 to 1.8018) = 1
> Frequency of 2 : (1.8018 to 2.7027) = 1
> Frequency of 3 : (2.7027 to 3.6036) = 1
> Frequency of 4 : (3.6036 to 4.5045) = 1
> Frequency of 5 : (4.5045 to 5.4054) = 1
> Frequency of 6 : (5.4054 to 6.3063) = 1
> Frequency of 7 : (6.3063 to 7.2072) = 1
> Frequency of 8 : (7.2072 to 8.1081) = 1
> Frequency of 9 : (8.1081 to 9.009) = 1
> Total count 10
>
>
> # Code I wrote:
>
> #include "itkImage.h"
> #include "itkImportImageFilter.h"
> #include "itkImageToHistogramFilter.h"
>
> using namespace std;
>
> int main(int argc, char* argv[])
> {
> //typedef unsigned char PixelType;
> typedef double PixelType;
> const int Dimension = 1;
>
> const int numElems = 10;
> PixelType data[numElems] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
>
> typedef itk::Image<PixelType, Dimension> ImageType;
> typedef itk::ImportImageFilter<PixelType, Dimension> ImportFilterType;
>
> ImportFilterType::Pointer importFilter = ImportFilterType::New();
>
> ImportFilterType::SizeType size;
> size[0] = numElems;
>
> ImportFilterType::IndexType start;
> start[0] = 0;
>
> ImportFilterType::RegionType region;
> region.SetIndex(start);
> region.SetSize(size);
>
> importFilter->SetRegion(region);
>
> importFilter->SetImportPointer(data, numElems, false);
>
> importFilter->Update();
>
> ImageType::Pointer img = importFilter->GetOutput();
>
> const unsigned int binsPerDimension = numElems;
>
> const unsigned int MeasurementVectorSize = 1;
>
> typedef itk::Statistics::ImageToHistogramFilter<ImageType>
> ImageToHistogramFilterType;
>
> ImageToHistogramFilterType::HistogramType::MeasurementVectorType
> lowerBound(binsPerDimension);
> lowerBound.Fill(5);
>
> ImageToHistogramFilterType::HistogramType::MeasurementVectorType
> upperBound(binsPerDimension);
> upperBound.Fill(10);
>
> ImageToHistogramFilterType::HistogramType::SizeType
> histSize(MeasurementVectorSize);
> histSize.Fill(binsPerDimension);
>
> ImageToHistogramFilterType::Pointer imageToHistogramFilter =
> ImageToHistogramFilterType::New();
> imageToHistogramFilter->SetInput(img);
> imageToHistogramFilter->SetHistogramBinMinimum(lowerBound);
> imageToHistogramFilter->SetHistogramBinMaximum(upperBound);
> imageToHistogramFilter->SetHistogramSize(histSize);
>
> try {
> imageToHistogramFilter->Update();
> }
> catch (itk::ExceptionObject& error) {
> std::cerr << "Error: " << error << std::endl;
> return EXIT_FAILURE;
> }
>
> ImageToHistogramFilterType::HistogramType* histogram =
> imageToHistogramFilter->GetOutput();
>
> std::cout << "Frequency = [ ";
> for (unsigned int i = 0; i < histogram->GetSize()[0]; ++i) {
> std::cout << histogram->GetFrequency(i);
>
> if (i != histogram->GetSize()[0] - 1) {
> std::cout << "," << std::endl;
> }
> }
> std::cout << " ]" << std::endl;
>
> for (unsigned int i = 0; i < histogram->GetSize()[0]; i++) {
> std::cout << "Frequency of " << i << " : ("
> << histogram->GetBinMin(0, i) << " to " << histogram->GetBinMax(0,
> i)
> << ") = " << histogram->GetFrequency(i) << std::endl;
> }
>
> std::cout << "Total count " << histogram->GetTotalFrequency() <<
> std::endl;
> }
>
>
>
>
> --
> View this message in context: http://itk-insight-users.22837
> 40.n2.nabble.com/Histogram-for-a-double-precision-array-tp7589566.html
> Sent from the ITK Insight 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.php
>
> 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://public.kitware.com/mailman/listinfo/insight-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/insight-users/attachments/20170126/d88fe4bf/attachment.html>
More information about the Insight-users
mailing list