100 const TOutputImage * outputImage,
101 typename TInputImage::RegionType inputRegion,
102 typename TOutputImage::RegionType outputRegion)
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 for (
auto idxIt = noutIt.GetActiveIndexList().begin(); idxIt != noutIt.GetActiveIndexList().end(); ++idxIt)
135 OffsetType offset = noutIt.GetOffset(*idxIt);
137 for (
unsigned int k = 0; k < InputImageType::ImageDimension; ++k)
145 weights.push_back(w);
148 for (inIt.GoToBegin(), noutIt.GoToBegin(); !noutIt.IsAtEnd(); ++inIt, ++noutIt)
150 OutputPixelType sum = 0;
152 typename NOutputIterator::ConstIterator sIt = noutIt.Begin();
153 for (
int k = 0; !sIt.IsAtEnd(); ++sIt, ++k)
155 sum += sIt.Get() * weights[k];
158 noutIt.SetCenterPixel(sum + inIt.Get());
168 auto unitradius = TImage::SizeType::Filled(1);
169 const NIterator n1(unitradius, im, im->GetRequestedRegion());
170 const unsigned int centerIndex = n1.GetCenterNeighborhoodIndex();
171 typename NIterator::OffsetType offset;
172 std::vector<typename TImage::OffsetType> result;
173 for (
unsigned int d = 0; d < centerIndex * 2 + 1; ++d)
175 offset = n1.GetOffset(d);
178 for (
unsigned int k = 0; k < TImage::ImageDimension; ++k)
188 result.push_back(offset);
197 TOutputImage * outputImage,
198 typename TInputImage::RegionType inputRegion,
199 typename TOutputImage::RegionType outputRegion,
200 typename TInputImage::SizeType radius)
203 using InputImageType = TInputImage;
204 using RegionType =
typename TInputImage::RegionType;
205 using SizeType =
typename TInputImage::SizeType;
206 using IndexType =
typename TInputImage::IndexType;
207 using OffsetType =
typename TInputImage::OffsetType;
208 using OutputImageType = TOutputImage;
209 using OutputPixelType =
typename TOutputImage::PixelType;
212 using FaceListType =
typename FaceCalculatorType::FaceListType;
213 FaceCalculatorType faceCalculator;
220 SizeType internalRadius;
221 SizeType regionLimit;
223 IndexType regionStart = inputRegion.
GetIndex();
224 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
226 kernelSize[i] = radius[i] * 2 + 1;
227 internalRadius[i] = radius[i] + 1;
228 regionLimit[i] = inputRegion.GetSize()[i] + regionStart[i] - 1;
234 std::vector<OffsetType> realCorners;
235 std::vector<AccPixType> weights;
237 for (
unsigned int k = 0; k < unitCorners.size(); ++k)
240 OffsetType thisCorner;
241 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
243 prod *= unitCorners[k][i];
244 if (unitCorners[k][i] > 0)
246 thisCorner[i] = radius[i];
253 weights.push_back((AccPixType)prod);
254 realCorners.push_back(thisCorner);
257 FaceListType faceList = faceCalculator(accImage, outputRegion, internalRadius);
259 for (
const auto & face : faceList)
261 if (&face == &faceList.front())
266 AccPixType pixelscount = 1;
267 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
269 pixelscount *= (AccPixType)(2 * radius[i] + 1);
275 using CornerItVecType = std::vector<InputIteratorType>;
276 CornerItVecType cornerItVec;
278 for (
unsigned int k = 0; k < realCorners.size(); ++k)
280 typename InputImageType::RegionType tReg = face;
281 tReg.SetIndex(tReg.GetIndex() + realCorners[k]);
282 InputIteratorType tempIt(accImage, tReg);
284 cornerItVec.push_back(tempIt);
287 OutputIteratorType oIt(outputImage, face);
289 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
293 for (
unsigned int k = 0; k < cornerItVec.size(); ++k)
295 sum += weights[k] * cornerItVec[k].Get();
299 oIt.Set(
static_cast<OutputPixelType
>(sum / pixelscount));
306 OutputIteratorType oIt(outputImage, face);
308 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
313 RegionType currentKernelRegion;
314 currentKernelRegion.
SetSize(kernelSize);
316 IndexType kernelRegionIdx = oIt.
GetIndex();
317 const IndexType centIndex = kernelRegionIdx;
318 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
320 kernelRegionIdx[i] -= radius[i];
322 currentKernelRegion.
SetIndex(kernelRegionIdx);
323 currentKernelRegion.Crop(inputRegion);
324 const OffsetValueType edgepixelscount = currentKernelRegion.GetNumberOfPixels();
334 for (
unsigned int k = 0; k < realCorners.size(); ++k)
336 IndexType thisCorner = centIndex + realCorners[k];
337 bool includeCorner =
true;
338 for (
unsigned int j = 0; j < TInputImage::ImageDimension; ++j)
340 if (unitCorners[k][j] > 0)
343 thisCorner[j] = std::min(thisCorner[j],
static_cast<OffsetValueType>(regionLimit[j]));
348 if (thisCorner[j] < regionStart[j])
350 includeCorner =
false;
357 sum += accImage->GetPixel(thisCorner) * weights[k];
361 oIt.Set(
static_cast<OutputPixelType
>(sum / (AccPixType)edgepixelscount));
370 TOutputImage * outputImage,
371 typename TInputImage::RegionType inputRegion,
372 typename TOutputImage::RegionType outputRegion,
373 typename TInputImage::SizeType radius)
376 using InputImageType = TInputImage;
377 using RegionType =
typename TInputImage::RegionType;
378 using SizeType =
typename TInputImage::SizeType;
379 using IndexType =
typename TInputImage::IndexType;
380 using OffsetType =
typename TInputImage::OffsetType;
381 using OutputImageType = TOutputImage;
382 using OutputPixelType =
typename TOutputImage::PixelType;
383 using InputPixelType =
typename TInputImage::PixelType;
386 using FaceListType =
typename FaceCalculatorType::FaceListType;
387 FaceCalculatorType faceCalculator;
394 SizeType internalRadius;
395 SizeType regionLimit;
396 IndexType regionStart = inputRegion.
GetIndex();
397 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
399 kernelSize[i] = radius[i] * 2 + 1;
400 internalRadius[i] = radius[i] + 1;
401 regionLimit[i] = inputRegion.GetSize()[i] + regionStart[i] - 1;
407 std::vector<OffsetType> realCorners;
408 std::vector<AccPixType> weights;
410 for (
unsigned int k = 0; k < unitCorners.size(); ++k)
413 OffsetType thisCorner;
414 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
416 prod *= unitCorners[k][i];
417 if (unitCorners[k][i] > 0)
419 thisCorner[i] = radius[i];
426 weights.push_back((AccPixType)prod);
427 realCorners.push_back(thisCorner);
430 FaceListType faceList = faceCalculator(accImage, outputRegion, internalRadius);
432 for (
const auto & face : faceList)
434 if (&face == &faceList.front())
439 AccPixType pixelscount = 1;
440 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
442 pixelscount *= (AccPixType)(2 * radius[i] + 1);
448 using CornerItVecType = std::vector<InputIteratorType>;
449 CornerItVecType cornerItVec;
451 for (
unsigned int k = 0; k < realCorners.size(); ++k)
453 typename InputImageType::RegionType tReg = face;
454 tReg.SetIndex(tReg.GetIndex() + realCorners[k]);
455 InputIteratorType tempIt(accImage, tReg);
457 cornerItVec.push_back(tempIt);
460 OutputIteratorType oIt(outputImage, face);
462 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
465 AccPixType squareSum = 0;
467 for (
unsigned int k = 0; k < cornerItVec.size(); ++k)
469 const InputPixelType & i = cornerItVec[k].Get();
470 sum += weights[k] * i[0];
471 squareSum += weights[k] * i[1];
476 oIt.Set(
static_cast<OutputPixelType
>(std::sqrt((squareSum - sum * sum / pixelscount) / (pixelscount - 1))));
483 OutputIteratorType oIt(outputImage, face);
485 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
490 RegionType currentKernelRegion;
491 currentKernelRegion.
SetSize(kernelSize);
493 IndexType kernelRegionIdx = oIt.
GetIndex();
494 const IndexType centIndex = kernelRegionIdx;
495 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
497 kernelRegionIdx[i] -= radius[i];
499 currentKernelRegion.
SetIndex(kernelRegionIdx);
500 currentKernelRegion.Crop(inputRegion);
501 const SizeValueType edgepixelscount = currentKernelRegion.GetNumberOfPixels();
503 AccPixType squareSum = 0;
512 for (
unsigned int k = 0; k < realCorners.size(); ++k)
514 IndexType thisCorner = centIndex + realCorners[k];
515 bool includeCorner =
true;
516 for (
unsigned int j = 0; j < TInputImage::ImageDimension; ++j)
518 if (unitCorners[k][j] > 0)
521 thisCorner[j] = std::min(thisCorner[j],
static_cast<OffsetValueType>(regionLimit[j]));
526 if (thisCorner[j] < regionStart[j])
528 includeCorner =
false;
535 const InputPixelType & i = accImage->GetPixel(thisCorner);
536 sum += weights[k] * i[0];
537 squareSum += weights[k] * i[1];
542 static_cast<OutputPixelType
>(std::sqrt((squareSum - sum * sum / edgepixelscount) / (edgepixelscount - 1))));
551 TOutputImage * outputImage,
552 typename TInputImage::RegionType inputRegion,
553 typename TOutputImage::RegionType outputRegion)
556 using InputImageType = TInputImage;
557 using OffsetType =
typename TInputImage::OffsetType;
558 using OutputImageType = TOutputImage;
559 using OutputPixelType =
typename TOutputImage::PixelType;
560 using ValueType =
typename OutputPixelType::ValueType;
561 using InputPixelType =
typename TInputImage::PixelType;
566 InputIterator inIt(inputImage, inputRegion);
567 auto kernelRadius = TInputImage::SizeType::Filled(1);
569 NOutputIterator noutIt(kernelRadius, outputImage, outputRegion);
575 noutIt.OverrideBoundaryCondition(&oBC);
585 std::vector<int> weights;
586 typename NOutputIterator::ConstIterator sIt;
587 for (
auto idxIt = noutIt.GetActiveIndexList().begin(); idxIt != noutIt.GetActiveIndexList().end(); ++idxIt)
589 OffsetType offset = noutIt.GetOffset(*idxIt);
591 for (
unsigned int k = 0; k < InputImageType::ImageDimension; ++k)
598 weights.push_back(w);
601 for (inIt.GoToBegin(), noutIt.GoToBegin(); !noutIt.IsAtEnd(); ++inIt, ++noutIt)
604 ValueType squareSum = 0;
606 for (k = 0, sIt = noutIt.Begin(); !sIt.IsAtEnd(); ++sIt, ++k)
608 const OutputPixelType & v = sIt.Get();
609 sum += v[0] * weights[k];
610 squareSum += v[1] * weights[k];
613 const InputPixelType & i = inIt.Get();
615 o[1] = squareSum + i * i;
616 noutIt.SetCenterPixel(o);