基于移动最小二乘(MLS)的图像扭曲刚性变形python实现
简单介绍一下基于mls的图像变形
先假设我们的图片像素为h乘w,这个算法的一个流程是:先选择图像上面的一些控制点,比如我选中人脸五官的点,那我们现在就有了这几个控制点的坐标和一个包含h乘w个图片像素点坐标的矩阵,使用这些数据就可以预先计算出一系列的中间变量,之后就可以输入图像变形后控制点的坐标位置(换种说法就是通过改变控制点控制图像变形)计算得到另一个包含h乘以w个坐标的矩阵,这个矩阵每个元素对应原来的矩阵每个元素。最后把原图像坐标的信息一一对应地插值到现在这个矩阵的坐标位置完成图像变形。
直接上代码
import numpy as np
import cv2
class trans():
def __init__(self, img, pi):
width, height = img.shape[:2]
pcth = np.repeat(np.arange(height).reshape(height, 1), [width], axis=1)
pctw = np.repeat(np.arange(width).reshape(width, 1), [height], axis=1).T
self.img_coordinate = np.swapaxes(np.array([pcth, pctw]), 1, 2).T
self.cita = compute_G(self.img_coordinate, pi, height, width)
self.pi = pi
self.W, self.A, self.Z = pre_compute_waz(self.pi, height, width, self.img_coordinate)
self.height = height
self.width = width
def deformation(self, img, qi):
qi = self.pi * 2 - qi
mapxy = np.swapaxes(np.float32(compute_fv(qi, self.W, self.A, self.Z, self.height, self.width, self.cita, self.img_coordinate)), 0, 1)
img = cv2.remap(img, mapxy[:, :, 0], mapxy[:, :, 1], borderMode=cv2.BORDER_WRAP, interpolation=cv2.INTER_LINEAR)
return img
def pre_compute_waz(pi, height, width, img_coordinate):
<