Abid Rahman K - 1 year ago 144
Python Question

# Image transformation in OpenCV

This question is related to this question:

I was trying to implement
`nikie's answer`
in
`Mathematica to OpenCV-Python`
. But i am stuck at the final step of procedure.

ie I got the all intersection points in square like below:

Now, i want to transform this into a perfect square of size (450,450) as given below:

(Never mind the brightness difference of two images).

Question:
How can i do this in OpenCV-Python? I am using
`cv2`
version.

Apart from etarion's suggestion, you could also use the remap function. I wrote a quick script to show how you can do this. As you see coding this is really easy in Python. This is the test image:

and this is the result after warping:

And here is the code:

``````import cv2
from scipy.interpolate import griddata
import numpy as np

grid_x, grid_y = np.mgrid[0:149:150j, 0:149:150j]
destination = np.array([[0,0], [0,49], [0,99], [0,149],
[49,0],[49,49],[49,99],[49,149],
[99,0],[99,49],[99,99],[99,149],
[149,0],[149,49],[149,99],[149,149]])
source = np.array([[22,22], [24,68], [26,116], [25,162],
[64,19],[65,64],[65,114],[64,159],
[107,16],[108,62],[108,111],[107,157],
[151,11],[151,58],[151,107],[151,156]])
grid_z = griddata(destination, source, (grid_x, grid_y), method='cubic')
map_x = np.append([], [ar[:,1] for ar in grid_z]).reshape(150,150)
map_y = np.append([], [ar[:,0] for ar in grid_z]).reshape(150,150)
map_x_32 = map_x.astype('float32')
map_y_32 = map_y.astype('float32')