如何针对镜筒变形的图像执行图像变形或从一个坐标系到另一个坐标系的转换?

时间:2019-03-07 16:57:24

标签: r image opencv warp

我已使用此question帮助我提出了图像的无失真协调系统。现在,我不确定如何在图像中实现新的坐标系,以便能够生成未失真的图像。

我在查找不涉及Matlab,OpenCV或C++ 的答案时遇到了麻烦,因为我正在使用R

我从引用的问题中使用的答案为我提供了以下转换后的xy坐标:

1 -19.50255239, -19.50255239
2 -18.26735544, -18.26735544
3 -17.03391152, -17.03391152
4 -15.80221494, -15.80221494
5 -14.57225998, -14.57225998
6 -13.34404095, -13.34404095
...

以此类推,对于512 x 512图像中的512像素。

我正在努力解决将其应用于原始512 x 512图像的问题。我在诸如Open CV页面here和特定pre-defined shiftslatitudinal/longitudinal shifts这样的页面上使用SpatialObjectsDataFrame进行了提及,但没有从一个用户定义的列表中提及xy坐标到另一个。

-获取源图像坐标的示例:

im_coords <- RSAGA::grid.to.xyz(as.matrix(as.raster(im)))

(请注意,我实际上并不希望栅格化图像,而只是我当时found的栅格)

-我用来获取转换后的坐标的代码:

undistort <- function(X, Y, a, b, c, d = 1, imWidth = 512, imHeight = 512) {

    #radial barrel distortion
    normX <- X - (imWidth / 2)
    normY <- Y - (imHeight / 2)

    #rmax
    radius_u <- sqrt(imWidth^2 + imHeight^2)

    #normalize r so that its between 0 and 1
    r <- sqrt(normX^2 + normY^2) /  radius_u

    #Barrel distorition equation: where "r" is the destination radius and "Rsrc" is the source pixel to get the pixel color from
    Rsrc <- r * (a*r^3 + b*r^2 + c*r + d)

    theta <- ifelse(Rsrc == 0, 1, 1 / atan(Rsrc) * Rsrc)

    newX <- (imWidth / 2) + theta * normX
    newY <- (imHeight / 2) + theta * normY

    return(data.frame(X = newX, Y = newY))
}

这是512x512.png桶形失真图像示例:https://imgur.com/a/W9Qz70W

enter image description here

我想知道kriging是否有用?还是gdalwarpproj4string?不知道如何实现这些。

更新: 根据罗希特(Rohit)的建议,我能够从以下内容中扭曲彩虹网格:

enter image description here

对此:

enter image description here

当我尝试使用桶形图像时,会得到这张奇怪的叠加图像:

enter image description here

好吧,我认为这取决于您使用的系数,如下所示:

enter image description here

1 个答案:

答案 0 :(得分:3)

您实际上不需要计算转换后的xy坐标。您只需要具有x和y坐标并返回未失真坐标的函数。给定您的undistort函数,在它周围编写一个仅使用x和y作为输入的包装器:

im2 <- imwarp(im1, function(x,y){ 
  undistort(x,y,a=1,b=2,c=4) # Give apropriate values for arguements, I'm not an expert.
})

如果您要专门从一个列表映射到另一个列表,则也可以这样做:

df <- expand.grid(x=1:512,y=1:512) # Original grid coordinates
df1 <- undistort(X=df$x,Y=df$y) # Undistorted grid coordinates
im2 <- imwarp(im1, function(x,y){
  df1[df$x==x & df$y==y,] # Map appropriately. Should still work.
})

interpolation尝试其他选项,以查看最有效的方法。