ocv_image_similarity_reg.py
Az előző példaprogramot kiegészítjük egy optimalizáló kerettel, amely 2D merev-test transzformációt keres. A lényegesebb újdonságok az alábbiak.
Merev-test transzformáció alkalmazása a bemeneti képre. Az eredmény a moving globális változóban tárolódik.
def do_rigid_transform(img, deg, dx, dy):
global moving
rows, cols = img.shape
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), deg, 1)
M[0,2] = M[0,2] + dx
M[1,2] = M[1,2] + dy
moving = cv2.warpAffine(img, M, (cols, rows))
Az optimalizáló által meghívásra kerülő függvény. A params a tesztelendő geometriai transzformáció paramétereit jelenti. Eredményül a hasonlósági mérték értéket kell visszadni.
# Function to optimize
def reg_func(params):
global original, transformed, moving, w, h
# print('params: ', params)
rot = params[0]
dx = params[1]
dy = params[2]
do_rigid_transform(transformed, rot, dx, dy)
image_reg_blend = cv2.merge((np.zeros((h, w), np.uint8), original, moving))
cv2.imshow('Registered (blended)', image_reg_blend)
cv2.waitKey(100)
Megállapítjuk a mozgó képen a képpontszámot. Nem engedjük, hogy ennek nagyrésze a képen kívülre kerüljön, összehasonlítva a kiindulásival.
num_pts_moving = np.count_nonzero(moving)
# do not let moving image move out of original
if num_pts_moving < 0.9 * num_pts_transformed:
sim = 1.0
else:
# sim = mse(original, moving)
sim = -1.0 * ssim(original, moving)
print('Params:', params, 'Similarity:', sim)
return sim
Kiindulási képpontszám megállapítása a regisztrálandó képen.
num_pts_transformed = np.count_nonzero(transformed)
A moving képmátrix előállítása.
# Create the moving image
moving = transformed
h, w = original.shape[:2]
Powell optimalizálás inicializálása és indítása.
# Initial parameters (identical transformation)
x0 = np.array([0, 0, 0])
# Start Powell optimization (from SciPy)
result = optimize.fmin_powell(reg_func, x0)