18 #ifndef itkBoxUtilities_h
19 #define itkBoxUtilities_h
45 template <
typename TIterator>
50 typename TIterator::OffsetType offset;
51 it->ClearActiveList();
60 it->ActivateOffset(offset);
68 unsigned int centerIndex = it->GetCenterNeighborhoodIndex();
69 for (
unsigned int d = 0; d < centerIndex; d++)
71 offset = it->GetOffset(d);
84 it->ActivateOffset(offset);
88 it->DeactivateOffset(offset);
98 template <
typename TInputImage,
typename TOutputImage>
101 const TOutputImage * outputImage,
104 #
if defined(ITKV4_COMPATIBILITY)
112 using InputImageType = TInputImage;
113 using OffsetType =
typename TInputImage::OffsetType;
114 using OutputImageType = TOutputImage;
115 using OutputPixelType =
typename TOutputImage::PixelType;
120 InputIterator inIt(inputImage, inputRegion);
122 kernelRadius.
Fill(1);
124 NOutputIterator noutIt(kernelRadius, outputImage, outputRegion);
130 noutIt.OverrideBoundaryCondition(&oBC);
140 std::vector<int> weights;
141 typename NOutputIterator::ConstIterator sIt;
142 for (
auto idxIt = noutIt.GetActiveIndexList().begin(); idxIt != noutIt.GetActiveIndexList().end(); idxIt++)
144 OffsetType offset = noutIt.GetOffset(*idxIt);
146 for (
unsigned int k = 0; k < InputImageType::ImageDimension; k++)
154 weights.push_back(w);
157 for (inIt.GoToBegin(), noutIt.GoToBegin(); !noutIt.IsAtEnd(); ++inIt, ++noutIt)
159 OutputPixelType sum = 0;
161 for (k = 0, sIt = noutIt.Begin(); !sIt.IsAtEnd(); ++sIt, ++k)
163 sum += sIt.Get() * weights[k];
165 noutIt.SetCenterPixel(sum + inIt.Get());
166 #if defined(ITKV4_COMPATIBILITY)
173 template <
typename TImage>
174 std::vector<typename TImage::OffsetType>
180 NIterator n1(unitradius, im, im->GetRequestedRegion());
181 unsigned int centerIndex = n1.GetCenterNeighborhoodIndex();
182 typename NIterator::OffsetType offset;
183 std::vector<typename TImage::OffsetType> result;
184 for (
unsigned int d = 0; d < centerIndex * 2 + 1; d++)
186 offset = n1.GetOffset(d);
189 for (
unsigned int k = 0; k < TImage::ImageDimension; k++)
199 result.push_back(offset);
205 template <
typename TInputImage,
typename TOutputImage>
208 TOutputImage * outputImage,
212 #
if defined(ITKV4_COMPATIBILITY)
220 using InputImageType = TInputImage;
224 using OffsetType =
typename TInputImage::OffsetType;
225 using OutputImageType = TOutputImage;
226 using OutputPixelType =
typename TOutputImage::PixelType;
229 using FaceListType =
typename FaceCalculatorType::FaceListType;
230 using FaceListTypeIt =
typename FaceCalculatorType::FaceListType::iterator;
231 FaceCalculatorType faceCalculator;
233 FaceListType faceList;
244 for (
unsigned int i = 0; i < TInputImage::ImageDimension; i++)
246 kernelSize[i] = radius[i] * 2 + 1;
247 internalRadius[i] = radius[i] + 1;
248 regionLimit[i] = inputRegion.GetSize()[i] + regionStart[i] - 1;
253 std::vector<OffsetType> unitCorners = CornerOffsets<TInputImage>(accImage);
254 std::vector<OffsetType> realCorners;
255 std::vector<AccPixType> weights;
257 for (
unsigned int k = 0; k < unitCorners.size(); k++)
260 OffsetType thisCorner;
261 for (
unsigned int i = 0; i < TInputImage::ImageDimension; i++)
263 prod *= unitCorners[k][i];
264 if (unitCorners[k][i] > 0)
266 thisCorner[i] = radius[i];
270 thisCorner[i] = -(static_cast<OffsetValueType>(radius[i]) + 1);
273 weights.push_back((AccPixType)prod);
274 realCorners.push_back(thisCorner);
277 faceList = faceCalculator(accImage, outputRegion, internalRadius);
279 for (fit = faceList.begin(); fit != faceList.end(); ++fit)
281 if (fit == faceList.begin())
286 AccPixType pixelscount = 1;
287 for (
unsigned int i = 0; i < TInputImage::ImageDimension; i++)
289 pixelscount *= (AccPixType)(2 * radius[i] + 1);
295 using CornerItVecType = std::vector<InputIteratorType>;
296 CornerItVecType cornerItVec;
298 for (
unsigned int k = 0; k < realCorners.size(); k++)
301 tReg.
SetIndex(tReg.GetIndex() + realCorners[k]);
302 InputIteratorType tempIt(accImage, tReg);
304 cornerItVec.push_back(tempIt);
307 OutputIteratorType oIt(outputImage, *fit);
309 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
313 for (
unsigned int k = 0; k < cornerItVec.size(); k++)
315 sum += weights[k] * cornerItVec[k].Get();
319 oIt.Set(static_cast<OutputPixelType>(sum / pixelscount));
320 #if defined(ITKV4_COMPATIBILITY)
329 OutputIteratorType oIt(outputImage, *fit);
331 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
337 currentKernelRegion.
SetSize(kernelSize);
341 for (
unsigned int i = 0; i < TInputImage::ImageDimension; i++)
343 kernelRegionIdx[i] -= radius[i];
345 currentKernelRegion.
SetIndex(kernelRegionIdx);
346 currentKernelRegion.Crop(inputRegion);
347 OffsetValueType edgepixelscount = currentKernelRegion.GetNumberOfPixels();
357 for (
unsigned int k = 0; k < realCorners.size(); k++)
359 IndexType thisCorner = centIndex + realCorners[k];
360 bool includeCorner =
true;
361 for (
unsigned int j = 0; j < TInputImage::ImageDimension; j++)
363 if (unitCorners[k][j] > 0)
366 if (thisCorner[j] > static_cast<OffsetValueType>(regionLimit[j]))
368 thisCorner[j] = static_cast<OffsetValueType>(regionLimit[j]);
374 if (thisCorner[j] < regionStart[j])
376 includeCorner =
false;
383 sum += accImage->GetPixel(thisCorner) * weights[k];
387 oIt.Set(static_cast<OutputPixelType>(sum / (AccPixType)edgepixelscount));
388 #if defined(ITKV4_COMPATIBILITY)
396 template <
typename TInputImage,
typename TOutputImage>
399 TOutputImage * outputImage,
403 #
if defined(ITKV4_COMPATIBILITY)
411 using InputImageType = TInputImage;
415 using OffsetType =
typename TInputImage::OffsetType;
416 using OutputImageType = TOutputImage;
417 using OutputPixelType =
typename TOutputImage::PixelType;
418 using InputPixelType =
typename TInputImage::PixelType;
421 using FaceListType =
typename FaceCalculatorType::FaceListType;
422 using FaceListTypeIt =
typename FaceCalculatorType::FaceListType::iterator;
423 FaceCalculatorType faceCalculator;
425 FaceListType faceList;
435 for (
unsigned int i = 0; i < TInputImage::ImageDimension; i++)
437 kernelSize[i] = radius[i] * 2 + 1;
438 internalRadius[i] = radius[i] + 1;
439 regionLimit[i] = inputRegion.GetSize()[i] + regionStart[i] - 1;
444 std::vector<OffsetType> unitCorners = CornerOffsets<TInputImage>(accImage);
445 std::vector<OffsetType> realCorners;
446 std::vector<AccPixType> weights;
448 for (
unsigned int k = 0; k < unitCorners.size(); k++)
451 OffsetType thisCorner;
452 for (
unsigned int i = 0; i < TInputImage::ImageDimension; i++)
454 prod *= unitCorners[k][i];
455 if (unitCorners[k][i] > 0)
457 thisCorner[i] = radius[i];
461 thisCorner[i] = -(static_cast<OffsetValueType>(radius[i]) + 1);
464 weights.push_back((AccPixType)prod);
465 realCorners.push_back(thisCorner);
468 faceList = faceCalculator(accImage, outputRegion, internalRadius);
470 for (fit = faceList.begin(); fit != faceList.end(); ++fit)
472 if (fit == faceList.begin())
477 AccPixType pixelscount = 1;
478 for (
unsigned int i = 0; i < TInputImage::ImageDimension; i++)
480 pixelscount *= (AccPixType)(2 * radius[i] + 1);
486 using CornerItVecType = std::vector<InputIteratorType>;
487 CornerItVecType cornerItVec;
489 for (
unsigned int k = 0; k < realCorners.size(); k++)
492 tReg.
SetIndex(tReg.GetIndex() + realCorners[k]);
493 InputIteratorType tempIt(accImage, tReg);
495 cornerItVec.push_back(tempIt);
498 OutputIteratorType oIt(outputImage, *fit);
500 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
503 AccPixType squareSum = 0;
505 for (
unsigned int k = 0; k < cornerItVec.size(); k++)
507 const InputPixelType & i = cornerItVec[k].Get();
508 sum += weights[k] * i[0];
509 squareSum += weights[k] * i[1];
514 oIt.Set(static_cast<OutputPixelType>(std::sqrt((squareSum - sum * sum / pixelscount) / (pixelscount - 1))));
515 #if defined(ITKV4_COMPATIBILITY)
524 OutputIteratorType oIt(outputImage, *fit);
526 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
532 currentKernelRegion.
SetSize(kernelSize);
536 for (
unsigned int i = 0; i < TInputImage::ImageDimension; i++)
538 kernelRegionIdx[i] -= radius[i];
540 currentKernelRegion.
SetIndex(kernelRegionIdx);
541 currentKernelRegion.Crop(inputRegion);
542 SizeValueType edgepixelscount = currentKernelRegion.GetNumberOfPixels();
544 AccPixType squareSum = 0;
553 for (
unsigned int k = 0; k < realCorners.size(); k++)
555 IndexType thisCorner = centIndex + realCorners[k];
556 bool includeCorner =
true;
557 for (
unsigned int j = 0; j < TInputImage::ImageDimension; j++)
559 if (unitCorners[k][j] > 0)
562 if (thisCorner[j] > static_cast<OffsetValueType>(regionLimit[j]))
564 thisCorner[j] = static_cast<OffsetValueType>(regionLimit[j]);
570 if (thisCorner[j] < regionStart[j])
572 includeCorner =
false;
579 const InputPixelType & i = accImage->GetPixel(thisCorner);
580 sum += weights[k] * i[0];
581 squareSum += weights[k] * i[1];
586 static_cast<OutputPixelType>(std::sqrt((squareSum - sum * sum / edgepixelscount) / (edgepixelscount - 1))));
587 #if defined(ITKV4_COMPATIBILITY)
595 template <
typename TInputImage,
typename TOutputImage>
598 TOutputImage * outputImage,
601 #
if defined(ITKV4_COMPATIBILITY)
609 using InputImageType = TInputImage;
610 using OffsetType =
typename TInputImage::OffsetType;
611 using OutputImageType = TOutputImage;
612 using OutputPixelType =
typename TOutputImage::PixelType;
613 using ValueType =
typename OutputPixelType::ValueType;
614 using InputPixelType =
typename TInputImage::PixelType;
619 InputIterator inIt(inputImage, inputRegion);
621 kernelRadius.
Fill(1);
623 NOutputIterator noutIt(kernelRadius, outputImage, outputRegion);
629 noutIt.OverrideBoundaryCondition(&oBC);
639 std::vector<int> weights;
640 typename NOutputIterator::ConstIterator sIt;
641 for (
auto idxIt = noutIt.GetActiveIndexList().begin(); idxIt != noutIt.GetActiveIndexList().end(); idxIt++)
643 OffsetType offset = noutIt.GetOffset(*idxIt);
645 for (
unsigned int k = 0; k < InputImageType::ImageDimension; k++)
652 weights.push_back(w);
655 for (inIt.GoToBegin(), noutIt.GoToBegin(); !noutIt.IsAtEnd(); ++inIt, ++noutIt)
658 ValueType squareSum = 0;
660 for (k = 0, sIt = noutIt.Begin(); !sIt.IsAtEnd(); ++sIt, ++k)
662 const OutputPixelType & v = sIt.Get();
663 sum += v[0] * weights[k];
664 squareSum += v[1] * weights[k];
667 const InputPixelType & i = inIt.Get();
669 o[1] = squareSum + i * i;
670 noutIt.SetCenterPixel(o);
671 #if defined(ITKV4_COMPATIBILITY)