33 using ValueType =
typename TDb::ImgPixelType;
34 using ImgType =
typename TDb::ImgType;
56 SSD(
const TDb &db,
size_t idx,
57 size_t ctrFixedX,
size_t ctrFixedY,
size_t ctrMovingX,
size_t ctrMovingY,
73 inline operator ValueType()
const;
123 void CalculateValue();
131 bool PatchInsideImage(
const size_t x,
const size_t y);
135 const ImgType *fixedImageIt;
138 const ImgType *movingImageIt;
144 size_t fixedTopLeftX;
147 size_t fixedTopLeftY;
150 size_t movingTopLeftX;
153 size_t movingTopLeftY;
164 size_t ctrFixedX,
size_t ctrFixedY,
165 size_t ctrMovingX,
size_t ctrMovingY,
167 : fixedImageIt(&db.GetImage(0))
168 , movingImageIt(&db.GetImage(idx))
169 , patchSide(2 * radius + 1)
170 , fixedTopLeftX(ctrFixedX - radius)
171 , fixedTopLeftY(ctrFixedY - radius)
172 , movingTopLeftX(ctrMovingX - radius)
173 , movingTopLeftY(ctrMovingY - radius)
176 assert(idx > 0 &&
"SSD between patches of 0-th image in database!");
177 assert(fixedImageIt && movingImageIt &&
"One of image pointers is null!");
200 return value < other.value;
207 for (
size_t dy = 0; dy < patchSide; ++dy) {
210 (*fixedImageIt)(fixedTopLeftY + dy, fixedTopLeftX + patchSide) -
211 (*movingImageIt)(movingTopLeftY + dy, movingTopLeftX + patchSide);
215 (*fixedImageIt)(fixedTopLeftY + dy, fixedTopLeftX) -
216 (*movingImageIt)(movingTopLeftY + dy, movingTopLeftX);
218 value += (diff1 * diff1 - diff2 * diff2);
230 for (
size_t dy = 0; dy < patchSide; ++dy) {
233 (*fixedImageIt)(fixedTopLeftY + dy, fixedTopLeftX - 1) -
234 (*movingImageIt)(movingTopLeftY + dy, movingTopLeftX - 1);
238 (*fixedImageIt)(fixedTopLeftY + dy, fixedTopLeftX + patchSide - 1) -
239 (*movingImageIt)(movingTopLeftY + dy, movingTopLeftX + patchSide - 1);
241 value += (diff1 * diff1 - diff2 * diff2);
253 for (
size_t dx = 0; dx < patchSide; ++dx) {
256 (*fixedImageIt)(fixedTopLeftY - 1, fixedTopLeftX + dx) -
257 (*movingImageIt)(movingTopLeftY - 1, movingTopLeftX + dx);
261 (*fixedImageIt)(fixedTopLeftY + patchSide - 1, fixedTopLeftX + dx) -
262 (*movingImageIt)(movingTopLeftY + patchSide - 1, movingTopLeftX + dx);
264 value += (diff1 * diff1 - diff2 * diff2);
276 for (
size_t dx = 0; dx < patchSide; ++dx) {
279 (*fixedImageIt)(fixedTopLeftY + patchSide, fixedTopLeftX + dx) -
280 (*movingImageIt)(movingTopLeftY + patchSide, movingTopLeftX + dx);
284 (*fixedImageIt)(fixedTopLeftY, fixedTopLeftX + dx) -
285 (*movingImageIt)(movingTopLeftY, movingTopLeftX + dx);
287 value += (diff1 * diff1 - diff2 * diff2);
299 assert(img &&
"New image pointer is null!");
312 for (
size_t dy = 0; dy < patchSide; ++dy)
313 for (
size_t dx = 0; dx < patchSide; ++dx) {
314 ValueType diff = (*fixedImageIt)(fixedTopLeftY + dy, fixedTopLeftX + dx) -
315 (*movingImageIt)(movingTopLeftY + dy, movingTopLeftX + dx);
316 value += diff * diff;
ValueType ShiftLeft()
Same moving image, (x-1,y) on both fixed and moving images.
Definition: SSD.h:228
bool operator<(const SSD &other) const
Definition: SSD.h:198
ValueType ShiftRight()
Same moving image, (x+1,y) on both fixed and moving images.
Definition: SSD.h:205
ValueType ShiftUp()
Same moving image, (x,y-1) on both fixed and moving images.
Definition: SSD.h:251
ValueType ShiftImage(const ImgType *img)
Same (x,y) coordinates on image img.
Definition: SSD.h:297
ValueType GetValue() const
Definition: SSD.h:184
Class responsible for SSD calculation between patches of images.
Definition: SSD.h:31
ValueType ShiftDown()
Same moving image, (x,y+1) on both fixed and moving images.
Definition: SSD.h:274