Generic per-pixel transformation is implemented by the cv2.remap function. It accepts a source image and two maps (which can be passed as one map with two channels), and returns a transformed image. The function also accepts parameters specifying how pixel value interpolation and extrapolation must be performed. In our case, we specify bilinear interpolation, and out-of-range values are replaced with the closest (spatially) in-range pixel values. The function is very generic and often used as a building block of many computer vision applications.
The following is the expected outcome: