Подобно смещению столбца, вы должны также включить смещение для строк при вычислении b
и R
.Поскольку деформированное изображение имеет c
рядов, смещение составляет c//2
:
b = math.atan2(j - c//2, i-c)
R = math.sqrt((j - c//2)**2 + math.pow(i-c, 2))
Обратите внимание, что деформированное изображение не является идеальным кругом, так как вы указали, что оно в два раза больше ширины и высоты.Если вы хотите полный круг, вам также следует настроить проверку верхней границы на R
, чтобы она была c//2
, так как это макс.радиус вдоль строк:
if r <= R <= c//2:
...
И аналогично вам нужно настроить вычисление в convert
:
return ..., math.trunc(c//2 - R)
Но тогда, в любом случае, вы можете просто использовать квадратное изображениес самого начала, то есть укажите warp.shape == (c, c)
.
Редактировать
Обновленный код, использует исходные размеры для искаженного изображения:
import math
import cv2
import numpy as np
img = cv2.imread("/tmp/img.jpg")
(rows, cols) = (img.shape[0], img.shape[1])
r = 0
c = rows // 2
warp = np.zeros([rows, cols, 3], dtype=np.uint8)
def convert(R, b):
return math.trunc(c * (1 - b/math.pi)), 2*math.trunc(c - R) - 1
for i in range(0, cols):
for j in range(0, rows):
b = math.atan2(j - c, i - c)
R = math.sqrt((j - c)**2 + (i - c)**2)
if r <= R <= c:
q, p = convert(R, b)
warp[j, i] = img[p, q]
cv2.imshow("Output", warp)
cv2.waitKey()
И вывод изображения: