18 #ifndef itkBoxUtilities_h
19 #define itkBoxUtilities_h
44 template <
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);
97 template <
typename TInputImage,
typename TOutputImage>
100 const TOutputImage * outputImage,
103 #
if defined(ITKV4_COMPATIBILITY)
111 using InputImageType = TInputImage;
112 using OffsetType =
typename TInputImage::OffsetType;
113 using OutputImageType = TOutputImage;
114 using OutputPixelType =
typename TOutputImage::PixelType;
119 InputIterator inIt(inputImage, inputRegion);
121 kernelRadius.
Fill(1);
123 NOutputIterator noutIt(kernelRadius, outputImage, outputRegion);
129 noutIt.OverrideBoundaryCondition(&oBC);
139 std::vector<int> weights;
140 typename NOutputIterator::ConstIterator sIt;
141 for (
auto idxIt = noutIt.GetActiveIndexList().begin(); idxIt != noutIt.GetActiveIndexList().end(); ++idxIt)
143 OffsetType offset = noutIt.GetOffset(*idxIt);
145 for (
unsigned int k = 0; k < InputImageType::ImageDimension; ++k)
153 weights.push_back(w);
156 for (inIt.GoToBegin(), noutIt.GoToBegin(); !noutIt.IsAtEnd(); ++inIt, ++noutIt)
158 OutputPixelType sum = 0;
160 for (k = 0, sIt = noutIt.Begin(); !sIt.IsAtEnd(); ++sIt, ++k)
162 sum += sIt.Get() * weights[k];
164 noutIt.SetCenterPixel(sum + inIt.Get());
165 #if defined(ITKV4_COMPATIBILITY)
172 template <
typename TImage>
173 std::vector<typename TImage::OffsetType>
179 NIterator n1(unitradius, im, im->GetRequestedRegion());
180 unsigned int centerIndex = n1.GetCenterNeighborhoodIndex();
181 typename NIterator::OffsetType offset;
182 std::vector<typename TImage::OffsetType> result;
183 for (
unsigned int d = 0; d < centerIndex * 2 + 1; ++d)
185 offset = n1.GetOffset(d);
188 for (
unsigned int k = 0; k < TImage::ImageDimension; ++k)
198 result.push_back(offset);
204 template <
typename TInputImage,
typename TOutputImage>
207 TOutputImage * outputImage,
211 #
if defined(ITKV4_COMPATIBILITY)
219 using InputImageType = TInputImage;
223 using OffsetType =
typename TInputImage::OffsetType;
224 using OutputImageType = TOutputImage;
225 using OutputPixelType =
typename TOutputImage::PixelType;
228 using FaceListType =
typename FaceCalculatorType::FaceListType;
229 FaceCalculatorType faceCalculator;
240 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
242 kernelSize[i] = radius[i] * 2 + 1;
243 internalRadius[i] = radius[i] + 1;
244 regionLimit[i] = inputRegion.GetSize()[i] + regionStart[i] - 1;
249 std::vector<OffsetType> unitCorners = CornerOffsets<TInputImage>(accImage);
250 std::vector<OffsetType> realCorners;
251 std::vector<AccPixType> weights;
253 for (
unsigned int k = 0; k < unitCorners.size(); ++k)
256 OffsetType thisCorner;
257 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
259 prod *= unitCorners[k][i];
260 if (unitCorners[k][i] > 0)
262 thisCorner[i] = radius[i];
266 thisCorner[i] = -(static_cast<OffsetValueType>(radius[i]) + 1);
269 weights.push_back((AccPixType)prod);
270 realCorners.push_back(thisCorner);
273 FaceListType faceList = faceCalculator(accImage, outputRegion, internalRadius);
275 for (
const auto & face : faceList)
277 if (&face == &faceList.front())
282 AccPixType pixelscount = 1;
283 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
285 pixelscount *= (AccPixType)(2 * radius[i] + 1);
291 using CornerItVecType = std::vector<InputIteratorType>;
292 CornerItVecType cornerItVec;
294 for (
unsigned int k = 0; k < realCorners.size(); ++k)
297 tReg.
SetIndex(tReg.GetIndex() + realCorners[k]);
298 InputIteratorType tempIt(accImage, tReg);
300 cornerItVec.push_back(tempIt);
303 OutputIteratorType oIt(outputImage, face);
305 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
309 for (
unsigned int k = 0; k < cornerItVec.size(); ++k)
311 sum += weights[k] * cornerItVec[k].Get();
315 oIt.Set(static_cast<OutputPixelType>(sum / pixelscount));
316 #if defined(ITKV4_COMPATIBILITY)
325 OutputIteratorType oIt(outputImage, face);
327 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
333 currentKernelRegion.
SetSize(kernelSize);
337 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
339 kernelRegionIdx[i] -= radius[i];
341 currentKernelRegion.
SetIndex(kernelRegionIdx);
342 currentKernelRegion.Crop(inputRegion);
343 OffsetValueType edgepixelscount = currentKernelRegion.GetNumberOfPixels();
353 for (
unsigned int k = 0; k < realCorners.size(); ++k)
355 IndexType thisCorner = centIndex + realCorners[k];
356 bool includeCorner =
true;
357 for (
unsigned int j = 0; j < TInputImage::ImageDimension; ++j)
359 if (unitCorners[k][j] > 0)
362 thisCorner[j] = std::min(thisCorner[j], static_cast<OffsetValueType>(regionLimit[j]));
367 if (thisCorner[j] < regionStart[j])
369 includeCorner =
false;
376 sum += accImage->GetPixel(thisCorner) * weights[k];
380 oIt.Set(static_cast<OutputPixelType>(sum / (AccPixType)edgepixelscount));
381 #if defined(ITKV4_COMPATIBILITY)
389 template <
typename TInputImage,
typename TOutputImage>
392 TOutputImage * outputImage,
396 #
if defined(ITKV4_COMPATIBILITY)
404 using InputImageType = TInputImage;
408 using OffsetType =
typename TInputImage::OffsetType;
409 using OutputImageType = TOutputImage;
410 using OutputPixelType =
typename TOutputImage::PixelType;
411 using InputPixelType =
typename TInputImage::PixelType;
414 using FaceListType =
typename FaceCalculatorType::FaceListType;
415 FaceCalculatorType faceCalculator;
425 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
427 kernelSize[i] = radius[i] * 2 + 1;
428 internalRadius[i] = radius[i] + 1;
429 regionLimit[i] = inputRegion.GetSize()[i] + regionStart[i] - 1;
434 std::vector<OffsetType> unitCorners = CornerOffsets<TInputImage>(accImage);
435 std::vector<OffsetType> realCorners;
436 std::vector<AccPixType> weights;
438 for (
unsigned int k = 0; k < unitCorners.size(); ++k)
441 OffsetType thisCorner;
442 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
444 prod *= unitCorners[k][i];
445 if (unitCorners[k][i] > 0)
447 thisCorner[i] = radius[i];
451 thisCorner[i] = -(static_cast<OffsetValueType>(radius[i]) + 1);
454 weights.push_back((AccPixType)prod);
455 realCorners.push_back(thisCorner);
458 FaceListType faceList = faceCalculator(accImage, outputRegion, internalRadius);
460 for (
const auto & face : faceList)
462 if (&face == &faceList.front())
467 AccPixType pixelscount = 1;
468 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
470 pixelscount *= (AccPixType)(2 * radius[i] + 1);
476 using CornerItVecType = std::vector<InputIteratorType>;
477 CornerItVecType cornerItVec;
479 for (
unsigned int k = 0; k < realCorners.size(); ++k)
482 tReg.
SetIndex(tReg.GetIndex() + realCorners[k]);
483 InputIteratorType tempIt(accImage, tReg);
485 cornerItVec.push_back(tempIt);
488 OutputIteratorType oIt(outputImage, face);
490 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
493 AccPixType squareSum = 0;
495 for (
unsigned int k = 0; k < cornerItVec.size(); ++k)
497 const InputPixelType & i = cornerItVec[k].Get();
498 sum += weights[k] * i[0];
499 squareSum += weights[k] * i[1];
504 oIt.Set(static_cast<OutputPixelType>(std::sqrt((squareSum - sum * sum / pixelscount) / (pixelscount - 1))));
505 #if defined(ITKV4_COMPATIBILITY)
514 OutputIteratorType oIt(outputImage, face);
516 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
522 currentKernelRegion.
SetSize(kernelSize);
526 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
528 kernelRegionIdx[i] -= radius[i];
530 currentKernelRegion.
SetIndex(kernelRegionIdx);
531 currentKernelRegion.Crop(inputRegion);
532 SizeValueType edgepixelscount = currentKernelRegion.GetNumberOfPixels();
534 AccPixType squareSum = 0;
543 for (
unsigned int k = 0; k < realCorners.size(); ++k)
545 IndexType thisCorner = centIndex + realCorners[k];
546 bool includeCorner =
true;
547 for (
unsigned int j = 0; j < TInputImage::ImageDimension; ++j)
549 if (unitCorners[k][j] > 0)
552 thisCorner[j] = std::min(thisCorner[j], static_cast<OffsetValueType>(regionLimit[j]));
557 if (thisCorner[j] < regionStart[j])
559 includeCorner =
false;
566 const InputPixelType & i = accImage->GetPixel(thisCorner);
567 sum += weights[k] * i[0];
568 squareSum += weights[k] * i[1];
573 static_cast<OutputPixelType>(std::sqrt((squareSum - sum * sum / edgepixelscount) / (edgepixelscount - 1))));
574 #if defined(ITKV4_COMPATIBILITY)
582 template <
typename TInputImage,
typename TOutputImage>
585 TOutputImage * outputImage,
588 #
if defined(ITKV4_COMPATIBILITY)
596 using InputImageType = TInputImage;
597 using OffsetType =
typename TInputImage::OffsetType;
598 using OutputImageType = TOutputImage;
599 using OutputPixelType =
typename TOutputImage::PixelType;
600 using ValueType =
typename OutputPixelType::ValueType;
601 using InputPixelType =
typename TInputImage::PixelType;
606 InputIterator inIt(inputImage, inputRegion);
608 kernelRadius.
Fill(1);
610 NOutputIterator noutIt(kernelRadius, outputImage, outputRegion);
616 noutIt.OverrideBoundaryCondition(&oBC);
626 std::vector<int> weights;
627 typename NOutputIterator::ConstIterator sIt;
628 for (
auto idxIt = noutIt.GetActiveIndexList().begin(); idxIt != noutIt.GetActiveIndexList().end(); ++idxIt)
630 OffsetType offset = noutIt.GetOffset(*idxIt);
632 for (
unsigned int k = 0; k < InputImageType::ImageDimension; ++k)
639 weights.push_back(w);
642 for (inIt.GoToBegin(), noutIt.GoToBegin(); !noutIt.IsAtEnd(); ++inIt, ++noutIt)
645 ValueType squareSum = 0;
647 for (k = 0, sIt = noutIt.Begin(); !sIt.IsAtEnd(); ++sIt, ++k)
649 const OutputPixelType & v = sIt.Get();
650 sum += v[0] * weights[k];
651 squareSum += v[1] * weights[k];
654 const InputPixelType & i = inIt.Get();
656 o[1] = squareSum + i * i;
657 noutIt.SetCenterPixel(o);
658 #if defined(ITKV4_COMPATIBILITY)