使用 scikit-image warp 函数执行图像变换

762 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

前言

2D 线性几何变换是点转换,它们会被应用于图像中的每个像素,以得到变换后的输出图像。本节中,我们将介绍如何使用 scikit-image 库中的 warp() 函数来执行图像变换。

scikit-image warp 函数原理

对于变换后的输出图像中的像素值 f(x,y)f(x',y') 可以使用以下方程式在输入图像对应位置 (u,v)(u, v) 处获取,将得到的像素值赋值给输出图像即可得到结果:

f(x,y)=g(u,v)f(x',y')=g(u,v)

其中,xx'yy' 分别表示沿 xxyy 轴的变换 x(u,v)=xx(u,v)= x'y(uv)=yy(u,v)=y’,我们也可以使用反扭曲来实现图像变换。使用 warp() 函数是更通用的图像变换方式,可用于实现线性(例如,使用矩阵乘法来实现的变换)和非线性图像变换。使用 warp() 函数执行图像变换,我们需要提供(反向)变换函数,而非变换矩阵。

使用 scikit-image warp 函数执行图像变换

根据 scikit-image 文档,我们得知 warp() 函数可以通过使用如下输入参数调用,利用该函数我们可以以更通用的方式实现图像变换(函数的输入参数如下):

skimage.transform.warp(image, inverse_map, map_args={}, output_shape= None, order=1, mode='constant', cval=0.0, clip=True, preserve_range=False)

warp() 函数根据给定的坐标变换函数 inverse_map 扭曲图像 image。接下来,我们实际应用 warp() 函数实现图像变换。

(1) 首先,导入所有所需的库,从 scikit-image 库的 transform 模块中导入 warp 函数:

from skimage.io import imread
from skimage.transform import warp
import matplotlib.pylab as plt

(2) 接下来,定义 translate() 函数,该函数用于在 warp() 函数中作为 inverse_map 参数实现像素坐标变换:

def translate(xy, t_x, t_y):
    xy[:, 0] -= t_y
    xy[:, 1] -= t_x
    return xy

(3) 读取输入图像,并将输入图像与变换函数一起传入 warp() 函数作为参数:

im = imread('1.png')
im = warp(im, translate, map_args={'t_x':-250, 't_y':200}) # 创建字典用于变换参数
plt.imshow(im)
plt.title('Translated image', size=20)
plt.show()

下图显示了程序执行后的输出,即将变换函数应用于输入图像后得到的输出图像:

Figure_4.png