图像处理:将普通图片转换为具有内在矩阵的鱼眼图像

问题描述 投票:0回答:1

我需要在普通图片的基础上合成很多具有不同内参矩阵的FishEye图像。我正在遵循这篇paper中提到的方法。

理想情况下,如果算法正确的话,理想的鱼眼效果应该是这样的:

ideal fish eye effect

但是当我用我的算法来转换图片时

originial image

看起来像这样

effect

下面是我的代码流程: 1.首先,我用cv2读取原始图像

def read_img(image):

    img = ndimage.imread(image) #this would return a 4-d array: [R,G,B,255]
    img_shape = img.shape
    print(img_shape)

    #get the pixel coordinate
    w = img_shape[1] #the width
    # print(w)
    h= img_shape[0] #the height
    # print(h)
    uv_coord = []
    for u in range(w):
    for v in range(h):
        uv_coord.append([float(u),float(v)])  #this records the coord in the fashion of [x1,y1],[x1, y2], [x1, y3]....
    return np.array(uv_coord)

然后,根据论文:

r(θ) = k1θ + k2θ^3 + k3θ^5 + k4θ^7, (1) 其中 Ks 是失真系数

给定针孔投影图像中的像素坐标(x,y),鱼眼中相应的图像坐标(x',y')可以计算为:

x'=r(θ) cos(Φ), y' = r(θ) sin(Φ), (2)

其中 phi = arctan((y − y0)/(x − x0)),(x0, y0) 是针孔投影图像中主点的坐标。

然后将图像坐标(x',y')转换为像素坐标(xf,yf):(xf,yf): *xf = mu * x' + u0, yf = mv * y' + v0,* (3)

其中(u0,v0)是鱼眼中主点的坐标,mu,mv表示水平和垂直方向上单位距离的像素数。所以我猜测 内在矩阵 [fx, fy] 和 u0 v0 是 [cx, cy]。

def add_distortion(sourceUV, dmatrix,Kmatrix):
    '''This function is programmed to remove the pixel of the given original image coords
    input arguments:
    dmatrix          -- the intrinsic matrix [k1,k2,k3,k4] for tweaking purposes
    Kmatrix          -- [fx, fy, cx, cy, s]'''
    u = sourceUV[:,0] #width in x
    v = sourceUV[:,1] #height in y

    rho = np.sqrt(u**2 + v**2) 

    #get theta
    theta = np.arctan(rho,np.full_like(u,1))

    # rho_mat = np.array([rho, rho**3, rho**5, rho**7])
    rho_mat = np.array([theta,theta**3, theta**5, theta**7])

    #get the: rho(theta) = k1*theta + k2*theta**3 + k3*theta**5 + k4*theta**7
    rho_d = dmatrix@rho_mat

    #get phi
    phi = np.arctan2((v - Kmatrix[3]), (u - Kmatrix[2]))
    xd = rho_d * np.cos(phi)
    yd = rho_d * np.sin(phi)

    #converting the coords from image plane back to pixel coords
    ud = Kmatrix[0] * (xd + Kmatrix[4] * yd) + Kmatrix[2]
    vd = Kmatrix[1] * yd + Kmatrix[3]
    return np.column_stack((ud,vd))

然后在获得扭曲的坐标后,我以这种方式执行移动像素,我认为问题可能是:

def main():
    image_name = "original.png"
    img = cv2.imread(image_name)
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) #the cv2 read the image as BGR

    w = img.shape[1]
    h = img.shape[0]
    uv_coord = read_img(image_name)

    #for adding distortion
    dmatrix = [-0.391942708316175,0.012746418822063 ,-0.001374061848026 ,0.005349692659231]

    #the Intrinsic matrix of the original picture's 
    Kmatrix = np.array([9.842439e+02,9.808141e+02 , 1392/2, 2.331966e+02, 0.000000e+00])

    # Kmatrix = np.array([2234.23470710156  ,2223.78349134123,  947.511596277837,   647.103139639432,-3.20443253476976]) #the distorted intrinsics
    uv = add_distortion(uv_coord,dmatrix,Kmatrix)

    i = 0
    dstimg = np.zeros_like(img)

    for x in range(w):   #tthe coo
        for y in range(h):
           if i > (512 * 1392 -1):
               break

            xu = uv[i][0] #x, y1, y2, y3
            yu = uv[i][1]
            i +=1

            # if new pixel is in bounds copy from source pixel to destination pixel
            if 0 <= xu and xu < img.shape[1] and 0 <= yu and yu < img.shape[0]:
                dstimg[int(yu)][int(xu)] = img[int(y)][int(x)]

    img = Image.fromarray(dstimg, 'RGB')
    img.save('my.png')
    img.show()

但是,这段代码并没有按照我想要的方式执行。你们能帮我调试一下吗?我花了三天时间,但仍然没有发现任何问题。谢谢!!

python opencv image-processing computer-vision fisheye
1个回答
0
投票

我还想将透视图像转换为鱼眼图像。你解决问题了吗? 如果您解决了,可以分享解决方案或正确的代码吗?

最好的。

© www.soinside.com 2019 - 2024. All rights reserved.