Попытка воссоздать бочкообразное искажение изображения в R - PullRequest
0 голосов
/ 15 марта 2019

Я работаю над воссозданием бочкообразного искажения изображения в R на основе этих примеров: пример 1 и пример 2 .

Я сделал этот пример изображения для работы:

Rainbowgrid.png

Желаемым результатом была бы более красочная версия чего-то вроде этого: enter image description here

Код, с которым я сейчас работаю, следующий:

library("imager")
library("OpenImageR")
library("EBImage")

image <- readImage("rainbowgrid.png")

# parameters for correction
    a = 0.3 #-0.007715 # affects only the outermost pixels of the image
    b = 0.3 #0.026731 # most cases only require b optimization
    c = 0.3 # most uniform correction
    d = 1.0 - a - b - c # describes the linear scaling of the image

         width  <- 512
         height <- 512

         x <- (1:width)
         y <- (1:height)

         D <- min(width, height) / 2    # radius of the circle

        # center of dst image, origin
          centerX <- (width - 1) / 2
          centerY <- (height - 1) / 2

       # cartesian coordinates of the destination point (relative to the centre of the image)
          deltaX <- (x - centerX) / D
          deltaY <- (y - centerY) / D

        # distance or radius of dst image
          dstR <- sqrt(deltaX^2 + deltaY^2)

            # distance or radius of src image (with formula)
            srcR <- (a * dstR^3 + b * dstR^2 + c * dstR + d) * dstR

            # comparing old and new distance to get factor
            factor <- abs(dstR / srcR)

            # coordinates in source image
            srcX <- centerX + (deltaX * factor * d)
            srcY <- centerY + (deltaY * factor * d)

                dstPos <-  y   * width + x
                  q    <- srcY * width + srcX

#I scaled these because they weren't the right scale for the warpfield below
                     scaleq <- q/512
                     scaledp <- dstPos/512

#In the original example, it ended with "image[dstPos] -> image_copy[q]" 
#but the example was for matlab, not R, so I had to find a new way to warp the image.
#The warpfield below is from https://rdrr.io/cran/imager/man/warp.html

#Assemble warpfield components
warp.x <- scaledp
warp.y <- scaleq

#transpose y vector
warp.y <- t(warp.y)

warp.x <- replicate(512,warp.x)
warp.y <- matrix(rep(warp.y,each=512),nrow=512)

warp.x<- raster(warp.x)
warp.y<- raster(warp.y)

warp.x <- as.cimg(warp.x)
warp.y <- as.cimg(warp.y)

warpfield<-list(warp.x,warp.y) %>% imappend("c")
warp(image,warpfield,mode=1) %>% plot

Итак, я получил множество искаженных изображений, варьируя способ применения warp.x и warp.y к полю деформации, но ни одно из них не является подходящим искажением / деформацией бочки, которое я ищу:

enter image description here

enter image description here

Аккуратно, но не то, что я ищу.

Я думаю, что уравнение Rsc - это то, что кажется правильным, учитывая различные источники ( 1 , 2 , 3 ), но я возникли проблемы с правильной реализацией этой информации, особенно в R.

К сожалению, большинство похожих примеров написано написано для Matlab , Python , и т.д. .

...