使用R和magick进行透视变换

wfsdck30  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(119)

我正在尝试使用Rmagick包进行规定转换。
我想对下图中的透视图进行纠偏和校正。

我无法得到想要的结果。我做错了什么?

library(magick)

imgfile <- "test_skew.jpg"
img <- magick::image_read(imgfile)

# input coordinates
inp <- list(x = c(29.5740973594396, -6.62134003951859, 322.64038081552, 
                  307.461649003054), 
            y = c(-5.74456619364109, 515.002694449434, 
                  490.483204598527, -2.24178192922578))

plot(img)
polygon(inp$x, inp$y, border = "red")

text(inp$x[1], inp$y[1], label = "1", col = 'red')
text(inp$x[2], inp$y[2], label = "2", col = 'red')
text(inp$x[3], inp$y[3], label = "3", col = 'red')
text(inp$x[4], inp$y[4], label = "4", col = 'red')

# output coordinates
outp <- list(y = c(0, 520, 520, 0),
             x = c(0, 0, 334, 334))

polygon(outp$x, outp$y, border = "blue")

text(outp$x[1]+10, outp$y[1]+10, label = "1", col = 'blue')
text(outp$x[2]+10, outp$y[2]-10, label = "2", col = 'blue')
text(outp$x[3]-10, outp$y[3]-10, label = "3", col = 'blue')
text(outp$x[4]-10, outp$y[4]+10, label = "4", col = 'blue')

我想通过将输入坐标(红色)扭曲为输出坐标(蓝色),使黑色边框成为一个完美的矩形。

# inx1,iny1 outx1,outy1 .... inx4,iny4 outx4,outy4
distc <- c(inp$x[1], inp$y[1], outp$x[1], outp$y[1],
           inp$x[2], inp$y[2], outp$x[2], outp$y[2],
           inp$x[3], inp$y[3], outp$x[3], outp$y[3],
           inp$x[4], inp$y[4], outp$x[4], outp$y[4])

magick::image_distort(img, 
                      "perspective", distc)

预期结果如下。

cclgggtu

cclgggtu1#

我不能读R,所以你的很多代码对我来说是丢失的,但是,我可以告诉你命令行参数,你需要使用它来让ImageMagick做你想做的事情。所以希望你能修改它来解决你的问题。
-distort perspective的参数是4对点:

[x,y] coords of point 1, [x,y] coords where it must be mapped to
[x,y] coords of point 2, [x,y] coords where it must be mapped to
[x,y] coords of point 3, [x,y] coords where it must be mapped to 
[x,y] coords of point 4, [x,y] coords where it must be mapped to

对于您的特定图像:

magick FgvGK.png -distort perspective "271,520 238,524 241,91 238,78 507,111 524,78 495,518 524,524" true.jpg

其产生:

希望你能看到黑框变成了矩形。

相关问题