warpPolar
- это правильная функция, так как она позволяет указать dsize
, в отличие от linearPolar
.
Вот код, который выдает в основном тот же результат, что и команда Imagemagick:
import cv2 as cv
import numpy as np
def undistort(img):
height, width, *_ = img.shape
assert height == width, "we want a square image"
radius = int(height / 2)
image_center = radius, radius
dest_width = int(np.ceil(np.pi * radius))
dest_height = int(np.ceil(radius))
dest_size = (dest_height, dest_width)
undistorted_img = cv.warpPolar(src=img, dsize=dest_size, center=image_center, maxRadius=radius, flags=0)
return cv.rotate(undistorted_img, cv.ROTATE_90_CLOCKWISE)