mirror of
https://github.com/wassname/scikit-image.git
synced 2026-06-29 17:37:20 +08:00
67 lines
2.3 KiB
Python
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)
|