From f6906a8f72886faa96f3ecc9f5d0d16ec905ed9d Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Wed, 26 Jun 2024 15:40:02 -0400 Subject: [PATCH] Use the max value for a uint16. This in reality should work for most normal images. In theory a user could have a data set that uses 64 bit float (or even 32 bit float) where they might need to bump up the upper boundary value if they data necessitates that kind of value. Signed-off-by: Michael Jackson --- .../ITKThresholdMaximumConnectedComponentsImageFilter.md | 9 ++++----- ...ITKThresholdMaximumConnectedComponentsImageFilter.cpp | 9 +++------ 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/Plugins/ITKImageProcessing/docs/ITKThresholdMaximumConnectedComponentsImageFilter.md b/src/Plugins/ITKImageProcessing/docs/ITKThresholdMaximumConnectedComponentsImageFilter.md index 2b48d2e578..fe257ea8ca 100644 --- a/src/Plugins/ITKImageProcessing/docs/ITKThresholdMaximumConnectedComponentsImageFilter.md +++ b/src/Plugins/ITKImageProcessing/docs/ITKThresholdMaximumConnectedComponentsImageFilter.md @@ -8,21 +8,20 @@ ITKConnectedComponents (ConnectedComponents) ## Description -\par This method is based on Topological Stable State Thresholding to calculate the threshold set point. This method is particularly effective when there are a large number of objects in a microscopy image. Compiling in Debug mode and enable the debug flag for this filter to print debug information to see how the filter focuses in on a threshold value. Please see the Insight Journal's MICCAI 2005 workshop for a complete description. References are below. +### Parameters -\par Parameters The MinimumObjectSizeInPixels parameter is controlled through the class Get/SetMinimumObjectSizeInPixels() method. Similar to the standard itk::BinaryThresholdImageFilter the Get/SetInside and Get/SetOutside values of the threshold can be set. The GetNumberOfObjects() and GetThresholdValue() methods return the number of objects above the minimum pixel size and the calculated threshold value. +### Automatic Thresholding in ITK -\par Automatic Thresholding in ITK There are multiple methods to automatically calculate the threshold intensity value of an image. As of version 4.0, ITK has a Thresholding ( ITKThresholding ) module which contains numerous automatic thresholding methods.implements two of these. Topological Stable State Thresholding works well on images with a large number of objects to be counted. ## References -1) Urish KL, August J, Huard J. "Unsupervised segmentation for myofiber -counting in immunofluorescent microscopy images". Insight Journal. ISC/NA-MIC/MICCAI Workshop on Open-Source Software (2005) https://insight-journal.org/browse/publication/40 2) Pikaz A, Averbuch, A. "Digital image thresholding based on topological +1) Urish KL, August J, Huard J. "Unsupervised segmentation for myofiber counting in immunofluorescent microscopy images". Insight Journal. ISC/NA-MIC/MICCAI Workshop on Open-Source Software (2005) https://insight-journal.org/browse/publication/40 +2) Pikaz A, Averbuch, A. "Digital image thresholding based on topological stable-state". Pattern Recognition, 29(5): 829-843, 1996. ## Questions diff --git a/src/Plugins/ITKImageProcessing/src/ITKImageProcessing/Filters/ITKThresholdMaximumConnectedComponentsImageFilter.cpp b/src/Plugins/ITKImageProcessing/src/ITKImageProcessing/Filters/ITKThresholdMaximumConnectedComponentsImageFilter.cpp index 0c3abdf11d..d636bc389b 100644 --- a/src/Plugins/ITKImageProcessing/src/ITKImageProcessing/Filters/ITKThresholdMaximumConnectedComponentsImageFilter.cpp +++ b/src/Plugins/ITKImageProcessing/src/ITKImageProcessing/Filters/ITKThresholdMaximumConnectedComponentsImageFilter.cpp @@ -21,7 +21,7 @@ using FilterOutputType = uint8; struct ITKThresholdMaximumConnectedComponentsImageFilterFunctor { uint32 minimumObjectSizeInPixels = 0u; - float64 upperBoundary = std::numeric_limits::max(); + float64 upperBoundary = 65536.0; uint8 insideValue = 1u; uint8 outsideValue = 0u; @@ -31,10 +31,7 @@ struct ITKThresholdMaximumConnectedComponentsImageFilterFunctor using FilterType = itk::ThresholdMaximumConnectedComponentsImageFilter; auto filter = FilterType::New(); filter->SetMinimumObjectSizeInPixels(minimumObjectSizeInPixels); - - typename InputImageT::PixelType upperBoundaryPixelValue = static_cast(upperBoundary); - - filter->SetUpperBoundary(static_cast(std::min(upperBoundaryPixelValue, itk::NumericTraits::max()))); + filter->SetUpperBoundary(static_cast(std::min(upperBoundary, itk::NumericTraits::max()))); filter->SetInsideValue(insideValue); filter->SetOutsideValue(outsideValue); return filter; @@ -89,7 +86,7 @@ Parameters ITKThresholdMaximumConnectedComponentsImageFilter::parameters() const "The following Set/Get methods are for the binary threshold function. This class automatically calculates the lower threshold boundary. The upper threshold boundary, inside value, and outside " "value can be defined by the user, however the standard values are used as default if not set by the user. The default value of the: Inside value is the maximum pixel type intensity. Outside " "value is the minimum pixel type intensity. Upper threshold boundary is the maximum pixel type intensity.", - std::numeric_limits::max())); + 65536.0)); params.insert(std::make_unique( k_InsideValue_Key, "Inside Value", "The following Set/Get methods are for the binary threshold function. This class automatically calculates the lower threshold boundary. The upper threshold boundary, inside value, and outside "