18#ifndef itkBoxUtilities_h
19#define itkBoxUtilities_h
44template <
typename TIterator>
49 typename TIterator::OffsetType offset;
50 it->ClearActiveList();
59 it->ActivateOffset(offset);
67 unsigned int centerIndex = it->GetCenterNeighborhoodIndex();
68 for (
unsigned int d = 0; d < centerIndex; ++d)
70 offset = it->GetOffset(d);
83 it->ActivateOffset(offset);
87 it->DeactivateOffset(offset);
97template <
typename TInputImage,
typename TOutputImage>
100 const TOutputImage * outputImage,
105 using InputImageType = TInputImage;
106 using OffsetType =
typename TInputImage::OffsetType;
107 using OutputImageType = TOutputImage;
108 using OutputPixelType =
typename TOutputImage::PixelType;
113 InputIterator inIt(inputImage, inputRegion);
114 auto kernelRadius = TInputImage::SizeType::Filled(1);
116 NOutputIterator noutIt(kernelRadius, outputImage, outputRegion);
122 noutIt.OverrideBoundaryCondition(&oBC);
132 std::vector<int> weights;
133 typename NOutputIterator::ConstIterator sIt;
134 for (
auto idxIt = noutIt.GetActiveIndexList().begin(); idxIt != noutIt.GetActiveIndexList().end(); ++idxIt)
136 OffsetType offset = noutIt.GetOffset(*idxIt);
138 for (
unsigned int k = 0; k < InputImageType::ImageDimension; ++k)
146 weights.push_back(w);
149 for (inIt.GoToBegin(), noutIt.GoToBegin(); !noutIt.IsAtEnd(); ++inIt, ++noutIt)
151 OutputPixelType sum = 0;
153 for (k = 0, sIt = noutIt.Begin(); !sIt.IsAtEnd(); ++sIt, ++k)
155 sum += sIt.Get() * weights[k];
157 noutIt.SetCenterPixel(sum + inIt.Get());
162template <
typename TImage>
163std::vector<typename TImage::OffsetType>
167 auto unitradius = TImage::SizeType::Filled(1);
168 NIterator n1(unitradius, im, im->GetRequestedRegion());
169 unsigned int centerIndex = n1.GetCenterNeighborhoodIndex();
170 typename NIterator::OffsetType offset;
171 std::vector<typename TImage::OffsetType> result;
172 for (
unsigned int d = 0; d < centerIndex * 2 + 1; ++d)
174 offset = n1.GetOffset(d);
177 for (
unsigned int k = 0; k < TImage::ImageDimension; ++k)
187 result.push_back(offset);
193template <
typename TInputImage,
typename TOutputImage>
196 TOutputImage * outputImage,
202 using InputImageType = TInputImage;
206 using OffsetType =
typename TInputImage::OffsetType;
207 using OutputImageType = TOutputImage;
208 using OutputPixelType =
typename TOutputImage::PixelType;
211 using FaceListType =
typename FaceCalculatorType::FaceListType;
212 FaceCalculatorType faceCalculator;
223 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
225 kernelSize[i] = radius[i] * 2 + 1;
226 internalRadius[i] = radius[i] + 1;
227 regionLimit[i] = inputRegion.GetSize()[i] + regionStart[i] - 1;
232 std::vector<OffsetType> unitCorners = CornerOffsets<TInputImage>(accImage);
233 std::vector<OffsetType> realCorners;
234 std::vector<AccPixType> weights;
236 for (
unsigned int k = 0; k < unitCorners.size(); ++k)
239 OffsetType thisCorner;
240 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
242 prod *= unitCorners[k][i];
243 if (unitCorners[k][i] > 0)
245 thisCorner[i] = radius[i];
252 weights.push_back((AccPixType)prod);
253 realCorners.push_back(thisCorner);
256 FaceListType faceList = faceCalculator(accImage, outputRegion, internalRadius);
258 for (
const auto & face : faceList)
260 if (&face == &faceList.front())
265 AccPixType pixelscount = 1;
266 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
268 pixelscount *= (AccPixType)(2 * radius[i] + 1);
274 using CornerItVecType = std::vector<InputIteratorType>;
275 CornerItVecType cornerItVec;
277 for (
unsigned int k = 0; k < realCorners.size(); ++k)
280 tReg.
SetIndex(tReg.GetIndex() + realCorners[k]);
281 InputIteratorType tempIt(accImage, tReg);
283 cornerItVec.push_back(tempIt);
286 OutputIteratorType oIt(outputImage, face);
288 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
292 for (
unsigned int k = 0; k < cornerItVec.size(); ++k)
294 sum += weights[k] * cornerItVec[k].Get();
298 oIt.Set(
static_cast<OutputPixelType
>(sum / pixelscount));
305 OutputIteratorType oIt(outputImage, face);
307 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
313 currentKernelRegion.
SetSize(kernelSize);
317 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
319 kernelRegionIdx[i] -= radius[i];
321 currentKernelRegion.
SetIndex(kernelRegionIdx);
322 currentKernelRegion.Crop(inputRegion);
323 OffsetValueType edgepixelscount = currentKernelRegion.GetNumberOfPixels();
333 for (
unsigned int k = 0; k < realCorners.size(); ++k)
335 IndexType thisCorner = centIndex + realCorners[k];
336 bool includeCorner =
true;
337 for (
unsigned int j = 0; j < TInputImage::ImageDimension; ++j)
339 if (unitCorners[k][j] > 0)
342 thisCorner[j] = std::min(thisCorner[j],
static_cast<OffsetValueType>(regionLimit[j]));
347 if (thisCorner[j] < regionStart[j])
349 includeCorner =
false;
356 sum += accImage->GetPixel(thisCorner) * weights[k];
360 oIt.Set(
static_cast<OutputPixelType
>(sum / (AccPixType)edgepixelscount));
366template <
typename TInputImage,
typename TOutputImage>
369 TOutputImage * outputImage,
375 using InputImageType = TInputImage;
379 using OffsetType =
typename TInputImage::OffsetType;
380 using OutputImageType = TOutputImage;
381 using OutputPixelType =
typename TOutputImage::PixelType;
382 using InputPixelType =
typename TInputImage::PixelType;
385 using FaceListType =
typename FaceCalculatorType::FaceListType;
386 FaceCalculatorType faceCalculator;
396 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
398 kernelSize[i] = radius[i] * 2 + 1;
399 internalRadius[i] = radius[i] + 1;
400 regionLimit[i] = inputRegion.GetSize()[i] + regionStart[i] - 1;
405 std::vector<OffsetType> unitCorners = CornerOffsets<TInputImage>(accImage);
406 std::vector<OffsetType> realCorners;
407 std::vector<AccPixType> weights;
409 for (
unsigned int k = 0; k < unitCorners.size(); ++k)
412 OffsetType thisCorner;
413 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
415 prod *= unitCorners[k][i];
416 if (unitCorners[k][i] > 0)
418 thisCorner[i] = radius[i];
425 weights.push_back((AccPixType)prod);
426 realCorners.push_back(thisCorner);
429 FaceListType faceList = faceCalculator(accImage, outputRegion, internalRadius);
431 for (
const auto & face : faceList)
433 if (&face == &faceList.front())
438 AccPixType pixelscount = 1;
439 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
441 pixelscount *= (AccPixType)(2 * radius[i] + 1);
447 using CornerItVecType = std::vector<InputIteratorType>;
448 CornerItVecType cornerItVec;
450 for (
unsigned int k = 0; k < realCorners.size(); ++k)
453 tReg.
SetIndex(tReg.GetIndex() + realCorners[k]);
454 InputIteratorType tempIt(accImage, tReg);
456 cornerItVec.push_back(tempIt);
459 OutputIteratorType oIt(outputImage, face);
461 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
464 AccPixType squareSum = 0;
466 for (
unsigned int k = 0; k < cornerItVec.size(); ++k)
468 const InputPixelType & i = cornerItVec[k].Get();
469 sum += weights[k] * i[0];
470 squareSum += weights[k] * i[1];
475 oIt.Set(
static_cast<OutputPixelType
>(std::sqrt((squareSum - sum * sum / pixelscount) / (pixelscount - 1))));
482 OutputIteratorType oIt(outputImage, face);
484 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
490 currentKernelRegion.
SetSize(kernelSize);
494 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
496 kernelRegionIdx[i] -= radius[i];
498 currentKernelRegion.
SetIndex(kernelRegionIdx);
499 currentKernelRegion.Crop(inputRegion);
500 SizeValueType edgepixelscount = currentKernelRegion.GetNumberOfPixels();
502 AccPixType squareSum = 0;
511 for (
unsigned int k = 0; k < realCorners.size(); ++k)
513 IndexType thisCorner = centIndex + realCorners[k];
514 bool includeCorner =
true;
515 for (
unsigned int j = 0; j < TInputImage::ImageDimension; ++j)
517 if (unitCorners[k][j] > 0)
520 thisCorner[j] = std::min(thisCorner[j],
static_cast<OffsetValueType>(regionLimit[j]));
525 if (thisCorner[j] < regionStart[j])
527 includeCorner =
false;
534 const InputPixelType & i = accImage->GetPixel(thisCorner);
535 sum += weights[k] * i[0];
536 squareSum += weights[k] * i[1];
541 static_cast<OutputPixelType
>(std::sqrt((squareSum - sum * sum / edgepixelscount) / (edgepixelscount - 1))));
547template <
typename TInputImage,
typename TOutputImage>
550 TOutputImage * outputImage,
555 using InputImageType = TInputImage;
556 using OffsetType =
typename TInputImage::OffsetType;
557 using OutputImageType = TOutputImage;
558 using OutputPixelType =
typename TOutputImage::PixelType;
559 using ValueType =
typename OutputPixelType::ValueType;
560 using InputPixelType =
typename TInputImage::PixelType;
565 InputIterator inIt(inputImage, inputRegion);
566 auto kernelRadius = TInputImage::SizeType::Filled(1);
568 NOutputIterator noutIt(kernelRadius, outputImage, outputRegion);
574 noutIt.OverrideBoundaryCondition(&oBC);
584 std::vector<int> weights;
585 typename NOutputIterator::ConstIterator sIt;
586 for (
auto idxIt = noutIt.GetActiveIndexList().begin(); idxIt != noutIt.GetActiveIndexList().end(); ++idxIt)
588 OffsetType offset = noutIt.GetOffset(*idxIt);
590 for (
unsigned int k = 0; k < InputImageType::ImageDimension; ++k)
597 weights.push_back(w);
600 for (inIt.GoToBegin(), noutIt.GoToBegin(); !noutIt.IsAtEnd(); ++inIt, ++noutIt)
603 ValueType squareSum = 0;
605 for (k = 0, sIt = noutIt.Begin(); !sIt.IsAtEnd(); ++sIt, ++k)
607 const OutputPixelType & v = sIt.Get();
608 sum += v[0] * weights[k];
609 squareSum += v[1] * weights[k];
612 const InputPixelType & i = inIt.Get();
614 o[1] = squareSum + i * i;
615 noutIt.SetCenterPixel(o);
This boundary condition returns a constant value for out-of-bounds image pixels.
void SetConstant(const OutputPixelType &c)
A multi-dimensional iterator templated over image type that walks a region of pixels.
A multi-dimensional iterator templated over image type that walks pixels within a region and is speci...
A multi-dimensional iterator templated over image type that walks a region of pixels.
void SetSize(const SizeType &size)
void SetIndex(const IndexType &index)
Define additional traits for native types such as int or float.
A neighborhood iterator which can take on an arbitrary shape.
A function object that determines a neighborhood of values at an image boundary according to a Neuman...
ImageBaseType::RegionType RegionType
ImageBaseType::IndexType IndexType
constexpr unsigned int Dimension
ImageBaseType::SizeType SizeType
TIterator * setConnectivityEarlyBox(TIterator *it, bool fullyConnected=false)
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
std::vector< typename TImage::OffsetType > CornerOffsets(const TImage *im)
void BoxSigmaCalculatorFunction(const TInputImage *accImage, TOutputImage *outputImage, typename TInputImage::RegionType inputRegion, typename TOutputImage::RegionType outputRegion, typename TInputImage::SizeType radius)
void BoxMeanCalculatorFunction(const TInputImage *accImage, TOutputImage *outputImage, typename TInputImage::RegionType inputRegion, typename TOutputImage::RegionType outputRegion, typename TInputImage::SizeType radius)
unsigned long SizeValueType
void BoxAccumulateFunction(const TInputImage *inputImage, const TOutputImage *outputImage, typename TInputImage::RegionType inputRegion, typename TOutputImage::RegionType outputRegion)
void BoxSquareAccumulateFunction(const TInputImage *inputImage, TOutputImage *outputImage, typename TInputImage::RegionType inputRegion, typename TOutputImage::RegionType outputRegion)
const IndexValueType * GetIndex() const
void SetIndex(const IndexValueType val[VDimension])
Splits an image into a main region and several "face" regions which are used to handle computations o...