Wie kann ich CV2.FindtransformeCC eine erste Vermutung geben, um die Warp -Matrix zu beschleunigen?Python

Python-Programme
Anonymous
 Wie kann ich CV2.FindtransformeCC eine erste Vermutung geben, um die Warp -Matrix zu beschleunigen?

Post by Anonymous »

Ich habe ein Bild, das zwei doppelte Bilder enthält. Ich schneide das Bild vertikal in zwei Hälften und benötige, dass die Bilder übereinstimmen, wenn sie Pixel für Pixel überlagert werden. Ich verwende cv2.findtransformECC in Python, um eine Warp-Matrix zu finden, um die obere Hälfte so zu transformieren, dass sie mit der unteren Hälfte übereinstimmt.
Es funktioniert gut mit Bildern, die eine kleinere Transformation erfordern, aber keine größeren. Ich dachte, ich könnte ihm vielleicht sagen, wo es anfangen soll, indem ich eine Transformation mit einer Rate-Warp-Matrix durchführe (so wie ich mit dem Auge sehen kann, dass die erste Hälfte um ein Vielfaches in die Y-Richtung nach unten verschoben werden muss). Und dann den ECC-Algorithmus verwenden Arbeite daran, es zu verfeinern. Das hat großartig funktioniert.
Am Ende nehme ich diese Warp-Matrix und wende sie auf andere Bilder an. Daher hätte ich gerne eine letzte Warp-Matrix, die weitergegeben werden kann. Ich habe in anderen Antworten gelesen, dass ich zum Kombinieren zweier Warp-Transformationen jeweils die dritte Zeile der Identitätsmatrix hinzufügen und dann eine Matrixmultiplikation durchführen muss. Ich habe dies getan (für alle Fälle AB und BA multipliziert), aber es scheint nicht zu funktionieren. Das heißt, die endgültige Matrix liefert nicht das gleiche Ergebnis wie die Anwendung der beiden Warp-Matrizen nacheinander.
Dies ist der Code, den ich verwende:

Code: Select all

import imageio.v2 as imageio
import numpy as np
from matplotlib import pyplot as plt
from scipy import ndimage
import cv2
from PIL import Image

def image_parameters(ecc_iter, ecc_crit):

# generate a sample image
image_path = cv2.samples.findFile("lena.jpg")
image = cv2.imread(image_path)
# mess up the image
in_warp = [[0.6, 0.07, -13.5], [0.04, 0.96, 20]]
Image_distorted = cv2.warpAffine(image, warp_matrix, (image.shape[1], image.shape[0]), flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP)

# bring image closer with a guess warp matrix
guess_warp = [[0.04, 0.01, 10], [0, 0, -20]]
Image1 = cv2.warpAffine(image_distorted, guess_warp, (image.shape[1], image.shape[0]), flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP)

    # Initialize the warp matrix (affine transformation)
    warp_matrix = np.eye(2, 3, dtype=np.float32)
    # Define criteria for the ECC algorithm
    criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, ecc_iter, ecc_crit)
    # Compute the transformation matrix, first argument is template, second is image that will be transformed
    (cc, warp_matrix) = cv2.findTransformECC(image, image1, warp_matrix, cv2.MOTION_AFFINE, criteria)
    # Apply the affine transformation
    aligned_image1 = cv2.warpAffine(image1, warp_matrix, (image.shape[1], image.shape[0]), flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP)

    #compare overlap before and after transform
    pre_diff = Image_distorted + image
    post_diff = aligned_image1 + image

    plt.imshow(pre_diff)
    plt.imshow(post_diff)
    plt.show()

a = [0, 0, 1]
final_warp = np.vstack([warp_matrix, a]) @ np.vstack([guess_matrix, a])

return final_warp

(warp_matrix) = image_parameters(4000, 1e-10)

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post