Scikit Image - Projective Transform



A projective transformation, also known as homography, is a type of geometric transformation that preserves straight lines but not necessarily parallelism. It is a mathematical mapping between two sets of points in different planes. Projective transformations are commonly used in computer vision, computer graphics, and image processing applications.

It is particularly useful for dealing with planar objects observed from different viewpoints or camera perspectives, as well as for image stitching and image rectification tasks.

The Pythons Scikit-image library provides the ProjectiveTransform class in the transform module to apply projective transformation(homography) on coordinates.

The skimage.transform.ProjectiveTransform class

The skimage.transform.ProjectiveTransform is a class in the scikit-image library used for applying projective transformations (homographies) on coordinates. This class allows you to apply various projective transformations on coordinates, such as rotation, translation, scaling, shearing, and perspective transformations.

Syntax

Following is the syntax of this class −

class skimage.transform.ProjectiveTransform(matrix=None, *, dimensionality=2) 

Here are the parameters and attributes of the class −

  • matrix:An optional parameter that represents the homogeneous transformation matrix. It should be a (D+1, D+1) array-like object, where D is the dimensionality of the transformation. The matrix defines the specific transformation to be applied.
  • dimensionality: An optional integer parameter that represents the number of dimensions of the transformation. It is ignored if the matrix parameter is not None.
  • params: An attribute that stores the homogeneous transformation matrix. It is a (D+1, D+1) array, where D is the dimensionality of the transformation.

Following are the methods of the class −

  • estimate(src, dst): This method is used to estimate the transformation based on a set of corresponding points (source and destination coordinates).
  • inverse: This method returns a transform object representing the inverse transformation.

The ProjectiveTransform class is inherited from the _GeometricTransform (Abstract base class for geometric transformations).

Example

Lets look into the following example and see how to use the ProjectiveTransform object with the specified projective transformation matrix to apply a projective transformation on an image.

import numpy as np
import matplotlib.pyplot as plt
from skimage import transform, io

# Load an input image
image = io.imread('Images/butterfly.jpg')

# Define the projective transformation matrix
matrix = np.array([[1, -0.5, 100],
                   [0.1, 0.9, 50],
                   [0.0015, 0.0015, 1]])
# Create the ProjectiveTransform object
tform = transform.ProjectiveTransform(matrix=matrix)

# Apply the transformation to the image
tf_img = transform.warp(image, tform.inverse)

# Display the original and transformed images side by side
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
axes[0].imshow(image)
axes[0].set_title('Original Image')
axes[0].axis('off')
axes[1].imshow(tf_img)
axes[1].set_title('Projective Transformed Image')
axes[1].axis('off')
plt.show()

Output

On executing the above program, you will get the following output −

Example

Lets take another example and observe how the projective transformation simulates a change in perspective, making the image appear tilted.

import numpy as np
import matplotlib.pyplot as plt
from skimage import transform, io

# Load an input image
image = io.imread('Images/logo.jpg')

# Define the projective transformation matrix
matrix = np.array([[0.8, 0.2, 30],
                   [-0.1, 0.9, 20],
                   [0.0005, -0.0005, 1]])
# Create the ProjectiveTransform object
tform = transform.ProjectiveTransform(matrix=matrix)

# Apply the transformation to the image
tf_img = transform.warp(image, tform.inverse)

# Plot the original and transformed images side by side
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
axes[0].imshow(image)
axes[0].set_title('Original Image')
axes[0].axis('off')
axes[1].imshow(tf_img)
axes[1].set_title('Projective Transformed Image')
axes[1].axis('off')
plt.show()

Output

On executing the above program, you will get the following output −

Advertisements