100 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(pixelscount > 1
477 ?
static_cast<OutputPixelType
>(std::sqrt((squareSum - sum * sum / pixelscount) / (pixelscount - 1)))
478 : OutputPixelType{});
485 OutputIteratorType oIt(outputImage, face);
487 for (oIt.GoToBegin(); !oIt.IsAtEnd(); ++oIt)
492 RegionType currentKernelRegion;
493 currentKernelRegion.
SetSize(kernelSize);
495 IndexType kernelRegionIdx = oIt.
GetIndex();
496 const IndexType centIndex = kernelRegionIdx;
497 for (
unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
499 kernelRegionIdx[i] -= radius[i];
501 currentKernelRegion.
SetIndex(kernelRegionIdx);
502 currentKernelRegion.Crop(inputRegion);
503 const SizeValueType edgepixelscount = currentKernelRegion.GetNumberOfPixels();
505 AccPixType squareSum = 0;
514 for (
unsigned int k = 0; k < realCorners.size(); ++k)
516 IndexType thisCorner = centIndex + realCorners[k];
517 bool includeCorner =
true;
518 for (
unsigned int j = 0; j < TInputImage::ImageDimension; ++j)
520 if (unitCorners[k][j] > 0)
523 thisCorner[j] = std::min(thisCorner[j],
static_cast<OffsetValueType>(regionLimit[j]));
528 if (thisCorner[j] < regionStart[j])
530 includeCorner =
false;
537 const InputPixelType & i = accImage->GetPixel(thisCorner);
538 sum += weights[k] * i[0];
539 squareSum += weights[k] * i[1];
543 oIt.Set(edgepixelscount > 1 ?
static_cast<OutputPixelType
>(
544 std::sqrt((squareSum - sum * sum / edgepixelscount) / (edgepixelscount - 1)))
545 : OutputPixelType{});
554 TOutputImage * outputImage,
555 typename TInputImage::RegionType inputRegion,
556 typename TOutputImage::RegionType outputRegion)
559 using InputImageType = TInputImage;
560 using OffsetType =
typename TInputImage::OffsetType;
561 using OutputImageType = TOutputImage;
562 using OutputPixelType =
typename TOutputImage::PixelType;
563 using ValueType =
typename OutputPixelType::ValueType;
564 using InputPixelType =
typename TInputImage::PixelType;
569 InputIterator inIt(inputImage, inputRegion);
570 auto kernelRadius = TInputImage::SizeType::Filled(1);
572 NOutputIterator noutIt(kernelRadius, outputImage, outputRegion);
578 noutIt.OverrideBoundaryCondition(&oBC);
588 std::vector<int> weights;
589 typename NOutputIterator::ConstIterator sIt;
590 for (
auto idxIt = noutIt.GetActiveIndexList().begin(); idxIt != noutIt.GetActiveIndexList().end(); ++idxIt)
592 OffsetType offset = noutIt.GetOffset(*idxIt);
594 for (
unsigned int k = 0; k < InputImageType::ImageDimension; ++k)
601 weights.push_back(w);
604 for (inIt.GoToBegin(), noutIt.GoToBegin(); !noutIt.IsAtEnd(); ++inIt, ++noutIt)
607 ValueType squareSum = 0;
609 for (k = 0, sIt = noutIt.Begin(); !sIt.IsAtEnd(); ++sIt, ++k)
611 const OutputPixelType & v = sIt.Get();
612 sum += v[0] * weights[k];
613 squareSum += v[1] * weights[k];
616 const InputPixelType & i = inIt.Get();
618 o[1] = squareSum + i * i;
619 noutIt.SetCenterPixel(o);