Python 中的变形
Anamorphosis in Python
我试着按照这个link
对图像进行变形
https://github.com/aydal/Cylinderical-Anamorphosis/blob/master/anamorph.py
它给出了一个变形图像,但它在半圆中给出了该图像。但我想要一个完整的圆圈大小的输出。
我试过
warp[c-j, i-1] = img[p-1, q-1]
warp[c+j, i-1] = img[p-1, q-1]
而不是warp[c-j, i-1] = img[p-1, q-1]
但它并没有在整个圆圈中给出一个图像,而是创建了两次相同的输出!
谁能帮帮我。
完整代码:
import math
from cv2 import *
import numpy as np
img = imread("test.jpg")
(rows, cols) = (img.shape[0], img.shape[1])
r = 0 #offset-gives space to keep cylinder and height of the image from bottom: original: math.trunc(.25*rows)
c = rows #this will be the decisive factor in size of output image-maximum radius of warped image: original: c = r+rows
warp = np.zeros([c,2*c,3], dtype=np.uint8)
def convert(R, b):
return math.trunc(b*rows/(2*math.asin(1))), math.trunc(c-R)
for i in range(0, 2*c):
for j in range(1, c):
b = math.atan2(j, i-c)
R = math.sqrt(j*j+math.pow(i-c, 2))
if R>=r and R<=c:
(q, p) = convert(R, b)
warp[c-j, i-1] = img[p-1, q-1]
#warp[c+j, i-1] = img[p-1, q-1]
imshow("Output", warp)
waitKey()
原图
我的输出图像(半圈)
想要的输出图像
与列偏移类似,在计算 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()
并输出图像:
我试着按照这个link
对图像进行变形https://github.com/aydal/Cylinderical-Anamorphosis/blob/master/anamorph.py
它给出了一个变形图像,但它在半圆中给出了该图像。但我想要一个完整的圆圈大小的输出。 我试过
warp[c-j, i-1] = img[p-1, q-1]
warp[c+j, i-1] = img[p-1, q-1]
而不是warp[c-j, i-1] = img[p-1, q-1]
但它并没有在整个圆圈中给出一个图像,而是创建了两次相同的输出!
谁能帮帮我。
完整代码:
import math
from cv2 import *
import numpy as np
img = imread("test.jpg")
(rows, cols) = (img.shape[0], img.shape[1])
r = 0 #offset-gives space to keep cylinder and height of the image from bottom: original: math.trunc(.25*rows)
c = rows #this will be the decisive factor in size of output image-maximum radius of warped image: original: c = r+rows
warp = np.zeros([c,2*c,3], dtype=np.uint8)
def convert(R, b):
return math.trunc(b*rows/(2*math.asin(1))), math.trunc(c-R)
for i in range(0, 2*c):
for j in range(1, c):
b = math.atan2(j, i-c)
R = math.sqrt(j*j+math.pow(i-c, 2))
if R>=r and R<=c:
(q, p) = convert(R, b)
warp[c-j, i-1] = img[p-1, q-1]
#warp[c+j, i-1] = img[p-1, q-1]
imshow("Output", warp)
waitKey()
原图
我的输出图像(半圈)
想要的输出图像
与列偏移类似,在计算 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()
并输出图像: