$fields = array();
$cats_array = array(1,7,28);
foreach ($cats_array as $category) {
$category_field_query = "SELECT fields FROM categories WHERE status = 1 AND id= $category";
$category_field_query_run = mysqli_query($connect, $category_field_query);
$cat_field = mysqli_fetch_object($category_field_query_run);
$field = explode(",", $cat_field->fields); // Explode ',' from '/'3'/,'
$field = str_replace("/", "", $field);
$fields[] = $field;
}
print_r($fields);
Подобно смещению столбца, вы должны также включить смещение для строк при вычислении 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()
И выходное изображение: