File size: 974 Bytes
9400a11
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5a64740
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np
import cv2
from scipy.interpolate import Rbf

def apply_tps_warp(image, mask, warp_strength=5.0):
    height, width = image.shape[:2]

    y, x = np.where(mask > 0)
    num_points = min(100, len(x))
    indices = np.random.choice(len(x), num_points, replace=False)
    src_points = np.array([x[indices], y[indices]]).T
    dst_points = src_points + np.random.randint(-warp_strength, warp_strength, src_points.shape)

    # Apply Thin Plate Spline warping
    rbf_x = Rbf(src_points[:, 0], src_points[:, 1], dst_points[:, 0], function='thin_plate')
    rbf_y = Rbf(src_points[:, 0], src_points[:, 1], dst_points[:, 1], function='thin_plate')

    grid_x, grid_y = np.meshgrid(np.arange(width), np.arange(height))
    map_x = rbf_x(grid_x, grid_y).astype(np.float32)
    map_y = rbf_y(grid_x, grid_y).astype(np.float32)

    warped_image = cv2.remap(image, map_x, map_y, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_REFLECT)
    return warped_image