【发布时间】:2015-09-16 21:36:15
【问题描述】:
我有一个图像被裁剪并调整为图像输入大小。 据我了解,这与仿射变换相同。
我正在尝试简化下面的代码,所以它通过使用函数来做同样的事情:(类似于下面的示例)。
scipy.ndimage.affine_transform()
问题是我并不真正了解该函数的参数,因此我无法使用 affine_transform() 函数实现优雅的单线。 提供并解释代码的解决方案可能有助于我更好地理解这个 affine_transform() 函数。
import numpy as npy
import PIL.Image
import scipy.misc as smc
import scipy.ndimage as snd
#crop factor
s = 1.045
#input image
img2crop = npy.float32(PIL.Image.open("input_image.jpg)")
h, w = img2crop.shape[:2] #get the dimensions of the input image
#Box-crop values: calculate new crop Dimensions based on 's'
wcrop = float(w) / (s)
hcrop = float(wcrop) / (float(w) / float(h))
hcrop = int(round(hcrop))
wcrop = int(round(wcrop))
#crop applied from top-left to right and bottom
b_left = 0
b_top = 0
b_width = wcrop
b_height = hcrop
b_box = (b_left, b_top, b_width, b_height)
#cropped region
region = img2crop.crop(b_box)
#resize cropped region back to input size
resized_region = smc.imresize(region, (h, w), interp='nearest', mode=None)
#save cropped and resized region as new file in output folder
PIL.Image.fromarray(np.uint8(resized_newregion)).save("output_image.jpg")
问题: 上面做裁剪和调整大小的代码如何表示为仿射变换?
此示例在所有 4 个面上均匀裁剪,中心方向
s = 0.0065
cropped_and_resized_image = snd.affine_transform(input_image.jpg, [1-s,1-s,1], [h*s/2,w*s/2,0], order=1)
PIL.Image.fromarray(npy.uint8(cropped_and_resized_image)).save("output_image_at.jpg")
提前感谢您的反馈。
【问题讨论】:
-
在数学上,裁剪不是仿射变换,但如果您考虑将仿射变换“放到画布上”给定大小,那么任何裁剪都可以被认为是目标画布大小和可能的翻译。调整大小只是缩放,这是一种仿射变换。
-
你是对的;裁剪不是仿射变换。我要改写这个问题吗?不过,上面的代码是否可以转码为 affine_transform 函数。我希望(并相信)它可以。但是怎么做呢?
-
在我看来这是不可能的。对图像应用裁剪和调整大小就可以了。
标签: python image python-imaging-library affinetransform