Skip navigation

Merev 2D illesztés

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)

Eredmények

Animációt készíthetünk az egyes iterációs lépések végrehajtásáról. MR-MR és CT-CT esetén megtalálja az illesztést.

 

MR-CT probléma esetén az SSIM hasonlósági mérték nem jó helyen adja az optimumot. Más mérték kell!

Feladatok

  • Forgatás az objektumpontok középpontja (súlypontja) körül történjen a kép középpont helyett. (A forgás eltoló hatásának csökkentésére.)
  • A súlypontok kerüljenek egymásba tolásra kezdőlépésként.
  • Implementáljunk további hasonlósági mértékeket: C, CC, MI, NMI, PIU.
  • Animációk, iterációszám, kiértékelések száma és időigény alapján hasonlítsuk össze a különféle megoldások hatékonyságát.
  • Teszteljük a módszereket többféle képpár között, multimodális problémákra is!