skimage:定义垂直剪切

3
Python的skimage包有一个函数transform.AffineTransform(),其中一个选项是shear,可以进行水平剪切。显然,我可以通过来回切换轴来进行垂直剪切。这是我的做法:
from skimage import data, transform
import matplotlib.pyplot as plt
import numpy as np

img = data.astronaut()/255

v = 0.3

tf = transform.AffineTransform(shear=-v)
img2 = transform.warp(img, tf, order=1, preserve_range=True, mode='constant')

img3 = np.swapaxes(img, 0, 1)
img3 = transform.warp(img3, tf, order=1, preserve_range=True, mode='constant')
img3 = np.swapaxes(img3, 0, 1)

plt.imshow(np.hstack([img, img2, img3]))
plt.show()

shear

无论如何,我很惊讶没有更直接的方法来定义垂直剪切选项... 我错了吗?

1个回答

3

你的问题(以及链接的页面)已经提供了答案...因为AffineTransform允许您指定变换矩阵,而您链接的维基页面显示了这个内容,很容易通过直接指定变换矩阵来减少操作次数,例如:

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

img = data.astronaut()/255

v = 0.3

tf = transform.AffineTransform(shear=-v)
img2 = transform.warp(img, tf, order=1, preserve_range=True, mode='constant')

img3 = np.swapaxes(img, 0, 1)
img3 = transform.warp(img3, tf, order=1, preserve_range=True, mode='constant')
img3 = np.swapaxes(img3, 0, 1)

plt.imshow(np.hstack([img, img2, img3]))

# Using the transformation matrix directly...

tf_h = transform.AffineTransform(
    np.array([[1, 0.3, 0], [0, 1, 0], [0, 0, 1]]))
img4 = transform.warp(img, tf, order=1, preserve_range=True, mode='constant')
tf_v = transform.AffineTransform(
    np.array([[1, 0, 0], [0.3, 1, 0], [0, 0, 1]]))
img4 = transform.warp(img, tf_h, order=1, preserve_range=True, mode='constant')
img5 = transform.warp(img, tf_v, order=1, preserve_range=True, mode='constant')

plt.figure()
plt.imshow(np.hstack([img, img4, img5]))

plt.show()

你应该看到两个具有相同图像集的图像。


谢谢。在使用PIL时,我也会指定矩阵。令人惊讶的是,scikit-image中没有垂直剪切参数,而它通常更加用户友好。我会等待看看是否有更直接的方法来做到这一点,否则我将给出正确的答案,这很棒! - Ricardo Magalhães Cruz
@RicardoCruz - 如果您查看源代码(特别是此处:https://github.com/scikit-image/scikit-image/blob/master/skimage/transform/_geometric.py#L777),您将会发现至少就仿射变换而言,它仅支持水平剪切。 - jmetz
@RicardoCruz:还要注意目前关于shear参数存在一些争议:https://github.com/scikit-image/scikit-image/issues/3239 - 无论如何,您可能希望暂时坚持定义变换矩阵! - jmetz
谢谢你提醒我! - Ricardo Magalhães Cruz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接