import scipy.signal
import sys
-# a BLOCKS x BLOCKS section is correlated with a (BLOCKS + 1) x (BLOCKS + 1)
-# the maximum allowable shift is BLOCK_SIZE with BLOCKS of surrounding context
-BLOCKS = 4
-BLOCK_SIZE = 64
+# size of block that will be matched
+# (correlate a block this size against a block with added slippage all around)
+XM = 128
+YM = 128
+
+# pitch between the block centres
+XP = 64
+YP = 64
+
+# allowable +/- slippage between pairs
+XS = 64
+YS = 64
CORNER_CANDIDATES = 8
assert image1.shape == shape
ys, xs, cs = shape
-xb = (xs // BLOCK_SIZE - BLOCKS) // 2
-yb = (ys // BLOCK_SIZE - BLOCKS) // 2
+xb = (xs // 2 - XM - 2 * XS) // XP
+yb = (ys // 2 - YM - 2 * YS) // YP
print('xb', xb, 'yb', yb)
def bandpass(image):
)
def correlate(image0_bp, image1_bp, xc, yc):
- x0 = xc - BLOCKS * BLOCK_SIZE // 2
- y0 = yc - BLOCKS * BLOCK_SIZE // 2
- x1 = xc - (BLOCKS + 1) * BLOCK_SIZE // 2
- y1 = yc - (BLOCKS + 1) * BLOCK_SIZE // 2
+ x0 = xc - XM // 2
+ y0 = yc - YM // 2
+ x1 = xc - XM // 2 - XS
+ y1 = yc - YM // 2 - YS
block0 = image0_bp[
- y0:y0 + BLOCK_SIZE * BLOCKS,
- x0:x0 + BLOCK_SIZE * BLOCKS,
+ y0:y0 + YM,
+ x0:x0 + XM,
:
]
block1 = image1_bp[
- y1:y1 + (BLOCKS + 1) * BLOCK_SIZE,
- x1:x1 + (BLOCKS + 1) * BLOCK_SIZE,
+ y1:y1 + YM + YS * 2,
+ x1:x1 + XM + XS * 2,
:
]
y, x = numpy.unravel_index(numpy.argmax(corr), corr.shape)
return (
- (x - BLOCK_SIZE // 2, y - BLOCK_SIZE // 2)
+ (x - XS, y - YS)
if (
x >= CUTOFF1 and
- x <= BLOCK_SIZE - CUTOFF1 and
+ x <= XS * 2 - CUTOFF1 and
y >= CUTOFF1 and
- y <= BLOCK_SIZE - CUTOFF1
+ y <= YS * 2 - CUTOFF1
) else
None
)
gamma.write_image('image1_bp.jpg', image1_bp + .5)
print('find corner candidates')
-buckets = [[[], []], [[], []]]
-for i in range(yb - BLOCKS):
- for j in range(xb - BLOCKS):
- xc = j * BLOCK_SIZE + (BLOCKS + 1) * BLOCK_SIZE // 2
-
p_all = []
q_all = []
corner_candidates = []
offsets = []
blocks = []
for k in range(yb):
- yc = k * BLOCK_SIZE + (BLOCKS + 1) * BLOCK_SIZE // 2
+ yc = YS + YM // 2 + k * YP
if i:
yc = ys - yc
for l in range(xb):
- xc = l * BLOCK_SIZE + (BLOCKS + 1) * BLOCK_SIZE // 2
+ xc = XS + XM // 2 + l * XP
if j:
xc = xs - xc
offset = correlate(image0_bp, image1_bp, xc, yc)