[Images.jl] Projective Transform based on Matrix

How I can apply an Projective Transform (or an Affine) to a image based on a transform matrix ?

In phyton I can do this using:

tform = transform.ProjectiveTransform(matrix=matrix)

An example in Python (from Documentation):

from skimage import data

from skimage import transform

from skimage import img_as_float

from skimage import transform

img= img_as_float([data.chelsea])

# Define the transformation matrix
matrix = [[1.0060923472904499, 6.8872896368778122e-002, -4.7977514755983762e+001], [-8.4231722023165673e-002, 9.8715396636307107e-001, 6.7039265228088230e+000], [1.7669387251995766e-015, -3.0176300815504264e-015, 9.9999999999999978e-001]];

# Create the projective transform

tform = transform.ProjectiveTransform(matrix=matrix)

tf_img = transform.warp(img, tform.inverse)

fig, ax = plt.subplots()

ax.imshow(tf_img)

ax.set_title('Projective transformation')

plt.show()

It looks like a nice API for this is an outstanding feature requests in ImageTransformations.jl. The core functionality is there as warp, but it takes some doing to make it work currently.

Swirl effect using warp operation · ImageTransformations might be a good example to start with.

Simply put, you need a coordinate map function f that receives SVector{N} and outputs SVector{N], just like the swirl_map function in the above example.


As @mbauman said, wrapping this into a function would be a good feature for ImageTransformations. I’m happy to see and merge a PR, but I don’t have time to do the devs myself.