Правка: в идеале я хотел бы использовать алгоритм, идентичный функции ImageMagick -distort
, но реализованный в R, чтобы преобразовывать необработанные координаты x,y, а не изображения. Использование ImageMagick также позволило бы мне получить визуальное доказательство эффективности устранения искажений.
Вопрос
У меня есть серия x, y, созданная на основе анализа видео с помощью программного обеспечения для отслеживания. Исходные изображения в видео имеют некоторое искажение бочкообразной линзы, которое я хотел бы исправить, чтобы повысить точность координат отслеживания.
Я могу выполнить то, что выглядит как подходящая коррекция, используя оператор искажения в ImageMagick, например:
convert input.jpg -distort barrel '0 -0.022 0' output.jpg
Теперь я знаю, что могу применить эту коррекцию к каждому кадру в видео (перед отслеживанием), но это не кажется лучшим вариантом, поскольку у меня есть десятки видео, каждое из которых состоит из> 7e4 кадров. Кажется, было бы намного проще применить коррекцию к самим координатам x, y после отслеживания.
Из документации ImageMagick уравнение бочкообразного искажения выглядит следующим образом:
Rsrc = r * ( Ar^3 + Br^2 + C*r + D )
Где «r» — радиус назначения, а «Rsrc» — исходный пиксель, из которого нужно получить цвет пикселя. радиусы нормализуются так, что радиус = '1,0' для половины минимальной ширины или высоты входного изображения».
Но я не знаю, как реализовать это в R, чтобы преобразовать серию x, y. Может ли кто-нибудь предложить какую-либо помощь? Спасибо!
Что я пробовал до сих пор
Я экспериментировал со своей собственной функцией, модифицировав найденный мною простой алгоритм здесь , но это, кажется, приводит к большему бочкообразному искажению (и полярность которого, похоже, нельзя изменить):
undistortFun <- function(X, Y, strength) {
imWidth <- 640
imHeight <- 480
radius_u <- sqrt(imWidth^2 + imHeight^2) / strength
normX <- X - (imWidth / 2)
normY <- Y - (imHeight / 2)
distance <- sqrt(normX^2 + normY^2)
r <- distance / radius_u
theta <- ifelse(r == 0, 1, atan(r) / r)
newX <- (imWidth / 2) + theta * normX
newY <- (imHeight / 2) + theta * normY
return(data.frame(X = newX, Y = newY))
}
Похожие вопросы
Я нашел два похожих вопроса, здесь и здесь, но они связаны с неискажающими изображениями, а не с необработанными координатами x,y, и реализованы на Java и C++, с которыми я не знаком.
R
для алгоритмов оптической коррекции. Но было бы легче комментировать, если бы вы предоставили источник алгоритма коррекции ствола, на который вы ссылаетесь в другом месте. (Обратите внимание, что я не могу сопротивляться предложению, что, если ваша первая попытка увеличивает кажущееся искажение, вы должны изменить полярность :-)) - person Carl Witthoft   schedule 06.08.2014-distort
. - person MrFlick   schedule 06.08.2014Rsrc = r * ( A*r^3 + B*r^2 + C*r + D )
- person jogall   schedule 07.08.2014