图像转换python

图像转换python,python,image,image-processing,Python,Image,Image Processing,我正在尝试使用Python创建类似下图所示的效果: 我的想法是创建一个空白图像,并将输入图像中的一个像素映射到输出图像中每个位置的适当像素(即反向映射) 我在考虑使用极坐标形式中像素的位置,并调整每个像素的角度。我尝试创建一个“offset”变量来模拟阿基米德螺线,该螺线的值随着每次迭代而增加,但这并没有给出所需的输出 有人能帮助我在当前代码的基础上构建,并提出一个函数/方法来实现输出图像的预期效果吗 def cart2pol(x, y): rho = np.sqrt(x**2 + y

我正在尝试使用Python创建类似下图所示的效果:

我的想法是创建一个空白图像,并将输入图像中的一个像素映射到输出图像中每个位置的适当像素(即反向映射)

我在考虑使用极坐标形式中像素的位置,并调整每个像素的角度。我尝试创建一个“offset”变量来模拟阿基米德螺线,该螺线的值随着每次迭代而增加,但这并没有给出所需的输出

有人能帮助我在当前代码的基础上构建,并提出一个函数/方法来实现输出图像的预期效果吗

def cart2pol(x, y):
    rho = np.sqrt(x**2 + y**2)
    phi = np.arctan2(y, x)
    return(rho, phi)

def pol2cart(rho, phi):
    x = rho * np.cos(phi)
    y = rho * np.sin(phi)
    return(x, y)

def raster2cart(y, x, center):
    x = x - center[1]
    y = center[0] - y
    return x, y

def cart2raster(y, x, center):
    x+= center[1]
    y = center[0] - y
    return x, y

def effect(img, center, r):
    img_output = np.zeros(img.shape, dtype=img.dtype)
    for row in range(len(img_output[0])):
        for col in range(len(img_output[1])):
            x, y = raster2cart(col, row , center)
            if x**2 + y**2 <= r**2:
                rho, phi = cart2pol(x,y)
                ### DO SOMETHING
                x, y = pol2cart(rho, phi)
                x, y = cart2raster(y, x, center)
                img_output[row, col] = img[int(x), int(y)]
            # else:
            #   img_output[row, col] = img[int(row), int(col)]
            
    return img_output

cv2.imshow('Input', img)
cv2.imshow('Out', effet(img))
cv2.waitKey(0)
def cart2pol(x,y):
rho=np.sqrt(x**2+y**2)
φ=np.arctan2(y,x)
返回(ρ,φ)
def pol2cart(rho,phi):
x=rho*np.cos(φ)
y=rho*np.sin(φ)
返回(x,y)
def光栅2部件(y、x、中心):
x=x-中心[1]
y=中心[0]-y
返回x,y
def Cart2Master(y、x、中心):
x+=中心[1]
y=中心[0]-y
返回x,y
def效果(进气歧管,中央,右):
img_输出=np.zero(img.shape,dtype=img.dtype)
对于范围内的行(len(img_输出[0]):
对于范围内的列(len(img_输出[1]):
x、 y=光栅2部分(列、行、中心)

如果x**2+y**2因为您使用的是opencv,请使用它来执行此操作,因为它可以为您处理插值

至于转换,看起来像是一个螺旋,所以,我尝试在下面的代码中生成一个。希望我没弄错,但是如果有错误请改正

可以调整参数a、b和c来控制变换

im = cv.imread("flower.jpg")

# parameters controlling the transform
# (cx, cy) is the center, here I'm using the mid point, but you can use other values
cx = im.shape[1]/2
cy = im.shape[0]/2
# a, b and c are General Archimedean spiral parameters
a = -1
b = 2
c = 1
# select the region around (cx, cy) to apply the transform
r = 1

x = np.linspace(0, im.shape[1], im.shape[1], dtype=np.float32)
y = np.linspace(0, im.shape[0], im.shape[0], dtype=np.float32)
xv, yv = np.meshgrid(x - cx, y - cy)

mag, ang = cv.cartToPolar(xv, yv)
nmag = cv.normalize(mag, None, norm_type=cv.NORM_MINMAX)

sxv, syv = cv.polarToCart(mag, (ang + (a + b*np.pi*nmag**(1.0/c))*(nmag < r)))
spiral = cv.remap(im, 
         sxv + cx, 
         syv + cy, 
         cv.INTER_LINEAR)
im=cv.imread(“flower.jpg”)
#控制变换的参数
#(cx,cy)是中心,这里我使用的是中点,但可以使用其他值
cx=im.形状[1]/2
cy=im.形状[0]/2
#a、b和c是一般阿基米德螺线参数
a=-1
b=2
c=1
#选择(cx,cy)周围的区域以应用变换
r=1
x=np.linspace(0,im.shape[1],im.shape[1],dtype=np.float32)
y=np.linspace(0,im.shape[0],im.shape[0],dtype=np.float32)
xv,yv=np.meshgrid(x-cx,y-cy)
mag,ang=cv.cartToPolar(xv,yv)
nmag=cv.normalize(mag,None,norm\u type=cv.norm\u MINMAX)
sxv,syv=cv.polarToCart(mag,(ang+(a+b*np.pi*nmag**(1.0/c))*(nmag
:

产出:

中心是图像中心:

中心是(300300):