<commit_before>"""
===============================
Using geometric transformations
===============================

In this example, we will see how to use geometric transformations in the context
of image processing.
"""

import math
import numpy as np
import matplotlib.pyplot as plt

from skimage import data
from skimage import transform as tf

margins = dict(hspace=0.01, wspace=0.01, top=1, bottom=0, left=0, right=1)

"""
Basics
======

Several different geometric transformation types are supported: similarity,
affine, projective and polynomial.

Geometric transformations can either be created using the explicit parameters
(e.g. scale, shear, rotation and translation) or the transformation matrix:
"""

#: create using explicit parameters
tform = tf.SimilarityTransform()
scale = 1
rotation = math.pi/2
translation = (0, 1)
tform.compose_implicit(scale, rotation, translation)
print tform._matrix

#: create using transformation matrix
matrix = tform._matrix.copy()
matrix[1, 2] = 2
tform2 = tf.SimilarityTransform(matrix)

"""
These transformation objects can be used to forward and reverse transform
coordinates between the source and destination coordinate systems:
"""

coord = [1, 0]
print tform2(coord)
print tform2.inverse(tform(coord))

"""
Image warping
=============

Geometric transformations can also be used to warp images:
"""

text = data.text()
tform.compose_implicit(1, math.pi/4, (text.shape[0] / 2, -100))

# uses tform.inverse, alternatively use tf.warp(text, tform.inverse)
rotated = tf.warp(text, tform)
back_rotated = tf.warp(rotated, tform)

plt.figure(figsize=(8, 3))
plt.subplot(131)
plt.imshow(text)
plt.axis('off')
plt.gray()
plt.subplot(132)
plt.imshow(rotated)
plt.axis('off')
plt.gray()
plt.subplot(133)
plt.imshow(back_rotated)
plt.axis('off')
plt.gray()
plt.subplots_adjust(**margins)

"""
.. image:: PLOT2RST.current_figure

Parameter estimation
====================

In addition to the basic functionality mentioned above you can also estimate the
parameters of a geometric transformation using the least-squares method.

This can amongst other things be used for image registration or rectification,
where you have a set of control points or homologous points in two images.

Let's assume we want to recognize letters on a photograph which was not taken
from the front but at a certain angle. In the simplest case of a plane paper
surface the letters are projectively distorted. Simple matching algorithms would
not be able to match such symbols. One solution to this problem would be to warp
the image so that the distortion is removed and then apply a matching algorithm:
"""

text = data.text()

src = np.array((
    (155, 15),
    (65, 40),
    (260, 130),
    (360, 95)
))
dst = np.array((
    (0, 0),
    (0, 50),
    (300, 50),
    (300, 0)
))

tform3 = tf.ProjectiveTransform()
tform3.estimate(src, dst)
warped = tf.warp(text, tform3, output_shape=(50, 300))

plt.figure(figsize=(8, 3))
plt.subplot(211)
plt.imshow(text)
plt.plot(src[:, 0], src[:, 1], '.r')
plt.axis('off')
plt.gray()
plt.subplot(212)
plt.imshow(warped)
plt.axis('off')
plt.gray()
plt.subplots_adjust(**margins)

"""
.. image:: PLOT2RST.current_figure
"""

plt.show()
<commit_msg>adapt geometric example script to new API and improve some expressions<commit_after>"""
===============================
Using geometric transformations
===============================

In this example, we will see how to use geometric transformations in the context
of image processing.
"""

import math
import numpy as np
import matplotlib.pyplot as plt

from skimage import data
from skimage import transform as tf

margins = dict(hspace=0.01, wspace=0.01, top=1, bottom=0, left=0, right=1)

"""
Basics
======

Several different geometric transformation types are supported: similarity,
affine, projective and polynomial.

Geometric transformations can either be created using the explicit parameters
(e.g. scale, shear, rotation and translation) or the transformation matrix:

First we create a transformation using explicit parameters:
"""

tform = tf.SimilarityTransform(scale=1, rotation=math.pi / 2,
                               translation=(0, 1))
print tform._matrix

"""
Alternatively you can define a transformation by the transformation matrix
itself:
"""

matrix = tform._matrix.copy()
matrix[1, 2] = 2
tform2 = tf.SimilarityTransform(matrix)

"""
These transformation objects can then be used to apply forward and inverse
coordinate transformations between the source and destination coordinate
systems:
"""

coord = [1, 0]
print tform2(coord)
print tform2.inverse(tform(coord))

"""
Image warping
=============

Geometric transformations can also be used to warp images:
"""

text = data.text()

tform = tf.SimilarityTransform(scale=1, rotation=math.pi / 4,
                               translation=(text.shape[0] / 2, -100))

rotated = tf.warp(text, tform)
back_rotated = tf.warp(rotated, tform.inverse)

fig, (ax1, ax2, ax3) = plt.subplots(ncols=3, figsize=(8, 3))
fig.subplots_adjust(**margins)
plt.gray()
ax1.imshow(text)
ax1.axis('off')
ax2.imshow(rotated)
ax2.axis('off')
ax3.imshow(back_rotated)
ax3.axis('off')

"""
.. image:: PLOT2RST.current_figure

Parameter estimation
====================

In addition to the basic functionality mentioned above you can also estimate the
parameters of a geometric transformation using the least-squares method.

This can amongst other things be used for image registration or rectification,
where you have a set of control points or homologous/corresponding points in two
images.

Let's assume we want to recognize letters on a photograph which was not taken
from the front but at a certain angle. In the simplest case of a plane paper
surface the letters are projectively distorted. Simple matching algorithms would
not be able to match such symbols. One solution to this problem would be to warp
the image so that the distortion is removed and then apply a matching algorithm:
"""

text = data.text()

src = np.array((
    (0, 0),
    (0, 50),
    (300, 50),
    (300, 0)
))
dst = np.array((
    (155, 15),
    (65, 40),
    (260, 130),
    (360, 95)
))

tform3 = tf.ProjectiveTransform()
tform3.estimate(src, dst)
warped = tf.warp(text, tform3, output_shape=(50, 300))

fig, (ax1, ax2) = plt.subplots(nrows=2, figsize=(8, 3))
fig.subplots_adjust(**margins)
plt.gray()
ax1.imshow(text)
ax1.plot(dst[:, 0], dst[:, 1], '.r')
ax1.axis('off')
ax2.imshow(warped)
ax2.axis('off')

"""
.. image:: PLOT2RST.current_figure
"""

plt.show()

{'fraction_non_alphanumeric': 0.13723076923076924, 'fraction_numerical': 0.029384615384615384, 'mean_word_length': 4.788958147818343, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2639648', 'n_tokens_mistral': 2165, 'n_tokens_neox': 1975, 'n_words': 720}