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,
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);
115 kernelRadius.
Fill(1);
117 NOutputIterator noutIt(kernelRadius, outputImage, outputRegion);
123 noutIt.OverrideBoundaryCondition(&oBC);
133 std::vector<int> weights;
134 typename NOutputIterator::ConstIterator sIt;
135 for (
auto idxIt = noutIt.GetActiveIndexList().begin(); idxIt != noutIt.GetActiveIndexList().end(); ++idxIt)
137 OffsetType offset = noutIt.GetOffset(*idxIt);
139 for (
unsigned int k = 0; k < InputImageType::ImageDimension; ++k)
147 weights.push_back(w);
150 for (inIt.GoToBegin(), noutIt.GoToBegin(); !noutIt.IsAtEnd(); ++inIt, ++noutIt)
152 OutputPixelType sum = 0;
154 for (k = 0, sIt = noutIt.Begin(); !sIt.IsAtEnd(); ++sIt, ++k)
156 sum += sIt.Get() * weights[k];
158 noutIt.SetCenterPixel(sum + inIt.Get());
163 template <
typename TImage>
164 std::vector<typename TImage::OffsetType>
170 NIterator n1(unitradius, im, im->GetRequestedRegion());
171 unsigned int centerIndex = n1.GetCenterNeighborhoodIndex();
172 typename NIterator::OffsetType offset;
173 std::vector<typename TImage::OffsetType> result;
174 for (
unsigned int d = 0; d < centerIndex * 2 + 1; ++d)
176 offset = n1.GetOffset(d);
179 for (
unsigned int k = 0; k < TImage::ImageDimension; ++k)
189 result.push_back(offset);
195 template <
typename TInputImage,
typename TOutputImage>
198 TOutputImage * outputImage,
204 using InputImageType = TInputImage;
208 using OffsetType =
typename TInputImage::OffsetType;
209 using OutputImageType = TOutputImage;
210 using OutputPixelType =
typename TOutputImage::PixelType;
213 using FaceListType =
typename FaceCalculatorType::FaceListType;
214 FaceCalculatorType faceCalculator;
225 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
227 kernelSize[i] = radius[i] * 2 + 1;
228 internalRadius[i] = radius[i] + 1;
229 regionLimit[i] = inputRegion.GetSize()[i] + regionStart[i] - 1;
234 std::vector<OffsetType> unitCorners = CornerOffsets<TInputImage>(accImage);
235 std::vector<OffsetType> realCorners;
236 std::vector<AccPixType> weights;
238 for (
unsigned int k = 0; k < unitCorners.size(); ++k)
241 OffsetType thisCorner;
242 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
244 prod *= unitCorners[k][i];
245 if (unitCorners[k][i] > 0)
247 thisCorner[i] = radius[i];
251 thisCorner[i] = -(static_cast<OffsetValueType>(radius[i]) + 1);
254 weights.push_back((AccPixType)prod);
255 realCorners.push_back(thisCorner);
258 FaceListType faceList = faceCalculator(accImage, outputRegion, internalRadius);
260 for (
const auto & face : faceList)
262 if (&face == &faceList.front())
267 AccPixType pixelscount = 1;
268 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
270 pixelscount *= (AccPixType)(2 * radius[i] + 1);
276 using CornerItVecType = std::vector<InputIteratorType>;
277 CornerItVecType cornerItVec;
279 for (
unsigned int k = 0; k < realCorners.size(); ++k)
282 tReg.
SetIndex(tReg.GetIndex() + realCorners[k]);
283 InputIteratorType tempIt(accImage, tReg);
285 cornerItVec.push_back(tempIt);
288 OutputIteratorType oIt(outputImage, face);
290 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
294 for (
unsigned int k = 0; k < cornerItVec.size(); ++k)
296 sum += weights[k] * cornerItVec[k].Get();
300 oIt.Set(static_cast<OutputPixelType>(sum / pixelscount));
307 OutputIteratorType oIt(outputImage, face);
309 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
315 currentKernelRegion.
SetSize(kernelSize);
319 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
321 kernelRegionIdx[i] -= radius[i];
323 currentKernelRegion.
SetIndex(kernelRegionIdx);
324 currentKernelRegion.Crop(inputRegion);
325 OffsetValueType edgepixelscount = currentKernelRegion.GetNumberOfPixels();
335 for (
unsigned int k = 0; k < realCorners.size(); ++k)
337 IndexType thisCorner = centIndex + realCorners[k];
338 bool includeCorner =
true;
339 for (
unsigned int j = 0; j < TInputImage::ImageDimension; ++j)
341 if (unitCorners[k][j] > 0)
344 thisCorner[j] = std::min(thisCorner[j], static_cast<OffsetValueType>(regionLimit[j]));
349 if (thisCorner[j] < regionStart[j])
351 includeCorner =
false;
358 sum += accImage->GetPixel(thisCorner) * weights[k];
362 oIt.Set(static_cast<OutputPixelType>(sum / (AccPixType)edgepixelscount));
368 template <
typename TInputImage,
typename TOutputImage>
371 TOutputImage * outputImage,
377 using InputImageType = TInputImage;
381 using OffsetType =
typename TInputImage::OffsetType;
382 using OutputImageType = TOutputImage;
383 using OutputPixelType =
typename TOutputImage::PixelType;
384 using InputPixelType =
typename TInputImage::PixelType;
387 using FaceListType =
typename FaceCalculatorType::FaceListType;
388 FaceCalculatorType faceCalculator;
398 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
400 kernelSize[i] = radius[i] * 2 + 1;
401 internalRadius[i] = radius[i] + 1;
402 regionLimit[i] = inputRegion.GetSize()[i] + regionStart[i] - 1;
407 std::vector<OffsetType> unitCorners = CornerOffsets<TInputImage>(accImage);
408 std::vector<OffsetType> realCorners;
409 std::vector<AccPixType> weights;
411 for (
unsigned int k = 0; k < unitCorners.size(); ++k)
414 OffsetType thisCorner;
415 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
417 prod *= unitCorners[k][i];
418 if (unitCorners[k][i] > 0)
420 thisCorner[i] = radius[i];
424 thisCorner[i] = -(static_cast<OffsetValueType>(radius[i]) + 1);
427 weights.push_back((AccPixType)prod);
428 realCorners.push_back(thisCorner);
431 FaceListType faceList = faceCalculator(accImage, outputRegion, internalRadius);
433 for (
const auto & face : faceList)
435 if (&face == &faceList.front())
440 AccPixType pixelscount = 1;
441 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
443 pixelscount *= (AccPixType)(2 * radius[i] + 1);
449 using CornerItVecType = std::vector<InputIteratorType>;
450 CornerItVecType cornerItVec;
452 for (
unsigned int k = 0; k < realCorners.size(); ++k)
455 tReg.
SetIndex(tReg.GetIndex() + realCorners[k]);
456 InputIteratorType tempIt(accImage, tReg);
458 cornerItVec.push_back(tempIt);
461 OutputIteratorType oIt(outputImage, face);
463 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
466 AccPixType squareSum = 0;
468 for (
unsigned int k = 0; k < cornerItVec.size(); ++k)
470 const InputPixelType & i = cornerItVec[k].Get();
471 sum += weights[k] * i[0];
472 squareSum += weights[k] * i[1];
477 oIt.Set(static_cast<OutputPixelType>(std::sqrt((squareSum - sum * sum / pixelscount) / (pixelscount - 1))));
484 OutputIteratorType oIt(outputImage, face);
486 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
492 currentKernelRegion.
SetSize(kernelSize);
496 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
498 kernelRegionIdx[i] -= radius[i];
500 currentKernelRegion.
SetIndex(kernelRegionIdx);
501 currentKernelRegion.Crop(inputRegion);
502 SizeValueType edgepixelscount = currentKernelRegion.GetNumberOfPixels();
504 AccPixType squareSum = 0;
513 for (
unsigned int k = 0; k < realCorners.size(); ++k)
515 IndexType thisCorner = centIndex + realCorners[k];
516 bool includeCorner =
true;
517 for (
unsigned int j = 0; j < TInputImage::ImageDimension; ++j)
519 if (unitCorners[k][j] > 0)
522 thisCorner[j] = std::min(thisCorner[j], static_cast<OffsetValueType>(regionLimit[j]));
527 if (thisCorner[j] < regionStart[j])
529 includeCorner =
false;
536 const InputPixelType & i = accImage->GetPixel(thisCorner);
537 sum += weights[k] * i[0];
538 squareSum += weights[k] * i[1];
543 static_cast<OutputPixelType>(std::sqrt((squareSum - sum * sum / edgepixelscount) / (edgepixelscount - 1))));
549 template <
typename TInputImage,
typename TOutputImage>
552 TOutputImage * outputImage,
557 using InputImageType = TInputImage;
558 using OffsetType =
typename TInputImage::OffsetType;
559 using OutputImageType = TOutputImage;
560 using OutputPixelType =
typename TOutputImage::PixelType;
561 using ValueType =
typename OutputPixelType::ValueType;
562 using InputPixelType =
typename TInputImage::PixelType;
567 InputIterator inIt(inputImage, inputRegion);
569 kernelRadius.
Fill(1);
571 NOutputIterator noutIt(kernelRadius, outputImage, outputRegion);
577 noutIt.OverrideBoundaryCondition(&oBC);
587 std::vector<int> weights;
588 typename NOutputIterator::ConstIterator sIt;
589 for (
auto idxIt = noutIt.GetActiveIndexList().begin(); idxIt != noutIt.GetActiveIndexList().end(); ++idxIt)
591 OffsetType offset = noutIt.GetOffset(*idxIt);
593 for (
unsigned int k = 0; k < InputImageType::ImageDimension; ++k)
600 weights.push_back(w);
603 for (inIt.GoToBegin(), noutIt.GoToBegin(); !noutIt.IsAtEnd(); ++inIt, ++noutIt)
606 ValueType squareSum = 0;
608 for (k = 0, sIt = noutIt.Begin(); !sIt.IsAtEnd(); ++sIt, ++k)
610 const OutputPixelType & v = sIt.Get();
611 sum += v[0] * weights[k];
612 squareSum += v[1] * weights[k];
615 const InputPixelType & i = inIt.Get();
617 o[1] = squareSum + i * i;
618 noutIt.SetCenterPixel(o);