image registration for 16 bit gray images

asked 2017-04-07 05:57:35 -0500

androgenus gravatar image

Hi you all,

I'm trying to stabilise a video sequence from an infrared camera. Each frame is a PNG 16 bit gray image and I'm trying to reproduce an image registration procedure found @www.learnopencv.com/image-alignment-ecc-in-opencv-c-python. My code is the following:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img0 = cv2.imread('test_55.png',-1)
img1 = cv2.imread('test_400.png',-1)

def get_gradient(im) :
    # Calculate the x and y gradients using Sobel operator
    grad_x = cv2.Sobel(im,cv2.CV_64F,1,0,ksize=3)
    grad_y = cv2.Sobel(im,cv2.CV_64F,0,1,ksize=3)

    # Combine the two gradients
    grad = cv2.addWeighted(np.absolute(grad_x), 0.5, np.absolute(grad_y), 0.5, 0)
    return grad

warp_mode = cv2.MOTION_AFFINE

    # Set the warp matrix to identity.
if warp_mode == cv2.MOTION_HOMOGRAPHY :
    warp_matrix = np.eye(3, 3, dtype=np.float32)
else :
    warp_matrix = np.eye(2, 3, dtype=np.float32)

# Set the stopping criteria for the algorithm.
criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 5000,  1e-10)

(cc, warp_matrix) = cv2.findTransformECC (get_gradient(img0), get_gradient(img1),warp_matrix, warp_mode, criteria)

if warp_mode == cv2.MOTION_HOMOGRAPHY :
    im_aligned = cv2.warpPerspective (img1, warp_matrix, (width,height), flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP)
else :
    # Use Affine warp when the transformation is not a Homography
    im_aligned = cv2.warpAffine(img1, warp_matrix, (width, height), flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP);

plt.imshow(im_aligned,cmap = 'gray')
plt.show()

I'm getting the following error:(-210) Images must have 8uC1 or 32fC1 type in function findTransformECC. I could transform the image from 16bit to 8 bits but I want a 16bit image aligned to the reference frame. I think that the only important motion in the video would be a translation because of fine tremor of fingers and hand. Please let me know if there are other options for stabilisation/image registration that could deal with 16 bit grey images. Here are the links to 2 frames from the video:

@h_t_t_p_s://drive.google.com/file/d/0BzQd3MR0r7Y6Zm56WmQzVUR2V2s/view?usp=sharing @h_t_t_p_s://drive.google.com/file/d/0BzQd3MR0r7Y6bFozd1p5bzhMSk0/view?usp=sharing

Thank you for your help

edit retag flag offensive close merge delete

Comments

you could convert to 8 bit to find the transform, but later warp your 16 bit image

berak gravatar imageberak ( 2017-04-08 03:18:45 -0500 )edit