|
import numpy as np |
|
import data.thinplate as tps |
|
import cv2 |
|
import random |
|
import math |
|
|
|
|
|
|
|
def tps_transform(img, dshape=None): |
|
|
|
while True: |
|
point1 = round(random.uniform(0.3, 0.7), 2) |
|
point2 = round(random.uniform(0.3, 0.7), 2) |
|
range_1 = round(random.uniform(-0.25, 0.25), 2) |
|
range_2 = round(random.uniform(-0.25, 0.25), 2) |
|
if math.isclose(point1 + range_1, point2 + range_2): |
|
continue |
|
else: |
|
break |
|
|
|
c_src = np.array([ |
|
[0.0, 0.0], |
|
[1., 0], |
|
[1, 1], |
|
[0, 1], |
|
[point1, point1], |
|
[point2, point2], |
|
]) |
|
|
|
c_dst = np.array([ |
|
[0., 0], |
|
[1., 0], |
|
[1, 1], |
|
[0, 1], |
|
[point1 + range_1, point1 + range_1], |
|
[point2 + range_2, point2 + range_2], |
|
]) |
|
|
|
dshape = dshape or img.shape |
|
theta = tps.tps_theta_from_points(c_src, c_dst, reduced=True) |
|
grid = tps.tps_grid(theta, c_dst, dshape) |
|
mapx, mapy = tps.tps_grid_to_remap(grid, img.shape) |
|
return cv2.remap(img, mapx, mapy, cv2.INTER_CUBIC) |
|
|
|
|