Files
scikit-image/skimage/transform/seam_carving.py
T
2015-06-15 20:19:52 +05:30

67 lines
2.3 KiB
Python

from ._seam_carving import _seam_carve_v
from .. import util
from .._shared import utils
import numpy as np
def seam_carve(img, energy_map, mode, num, border=1, force_copy=True):
""" Carve vertical or horizontal seams off an image.
Carves out vertical/horizontal seams from an image while using the given
energy map to decide the importance of each pixel.
Parameters
----------
image : (M, N) or (M, N, 3) ndarray
Input image whose seams are to be removed.
energy_map : (M, N) ndarray
The array to decide the importance of each pixel. The higher
the value corresponding to a pixel, the more the algorithm will try
to keep it in the image.
mode : str {'horizontal', 'vertical'}
Indicates whether seams are to be removed vertically or horizontally.
Removing seams horizontally will decrease the height whereas removing
vertically will decrease the width.
num : int
Number of seams are to be removed.
border : int, optional
The number of pixels in the right, left and bottom end of the image
to be excluded from being considered for a seam. This is important as
certain filters just ignore image boundaries and set them to `0`.
By default border is set to `1`.
force_copy : bool, optional
If set, the `image` and `energy_map` are copied before being used by
the method which modifies it in place. Set this to `False` if the
original image and the energy map are no longer needed after
this opetration.
Returns
-------
out : ndarray
The cropped image with the seams removed.
References
----------
.. [1] Shai Avidan and Ariel Shamir
"Seam Carving for Content-Aware Image Resizing"
http://www.cs.jhu.edu/~misha/ReadingSeminar/Papers/Avidan07.pdf
"""
utils.assert_nD(img, (2, 3))
image = util.img_as_float(img, force_copy)
energy_map = util.img_as_float(energy_map, force_copy)
if image.ndim == 2:
image = image[..., np.newaxis]
if mode == 'horizontal':
image = np.transpose(image, (1, 0, 2))
image = np.ascontiguousarray(image)
out = _seam_carve_v(image, energy_map, num, border)
if mode == 'horizontal':
out = np.transpose(out, (1, 0, 2))
return np.squeeze(out)