首页 > 解决方案 > 如何在python中扭曲图像?

问题描述

如何使用下图所示的拉动变形来转换图像以产生变形效果?

左图是输入,右图是输出(变形版)

我阅读了这篇文章Image warping并找到了一些提示。现在我的问题是我如何计算偏移量?

在此处输入图像描述

标签: pythonimage-processing

解决方案


它看起来像是scipy.ndimage.geometric_transform的任务。考虑以下示例,使用

1 2
3 4

作为输入二维数组

t = np.array([[1,2],[3,4]],dtype='uint8') #our input array
def func(x):
    return (x[1],x[0])
out = scipy.ndimage.geometric_transform(t,func)
print(out)

输出:

[[1 3]
 [2 4]]

那么发生了什么?对于输入中的每个单元格,func计算该单元格位置(元组)作为参数,并将其输出用作单元格的新位置,记住索引从 0 开始并且它们是 y,x 方式:

  • 1个位置是0,0
  • 2位置是0,1
  • 3 位置是 1,0
  • 4位置是1,1

我的示例函数只是用 x 切换 y 所以

  • 1 个新位置是 0,0
  • 2个新位置是1,0
  • 3个新位置是0,1
  • 4个新位置是1,1

您确实可以在输出中看到。

使用cv2.imread函数,您可以轻松地将图像读入 numpy 数组,如果您只想转换灰度图像,这会使事情变得更简单,因为您将处理 2D 数组而不是 3D 数组。记住 在加载灰度图像时使用cv2.imread('someimage.bmp',0)(作为第二个参数)。0

主要挑战是创建函数:假设灰度其输入是 2 元组 - “供体”像素的位置,输出是 2 元组 - “接收者”的位置,请注意,此函数不必覆盖整个输出区域 - 以防万一输出像素缺少“供体”,它被插值。


推荐阅读