我在这个镜头畸变校正程序中不断得到一张白色的照片

Posted

技术标签:

【中文标题】我在这个镜头畸变校正程序中不断得到一张白色的照片【英文标题】:I keep getting a white picture in this lens distortion correction program 【发布时间】:2019-12-27 15:39:17 【问题描述】:

我想编写一个代码来纠正失真并帮助去除鱼眼图像。 我在这里找到了它的伪代码,并试图坚持下去:http://www.tannerhelland.com/4743/simple-algorithm-correcting-lens-distortion/

from PIL import Image
import numpy as np 

im = Image.open('myimage.png')
img = Image.new("RGB",(512,512),'green')
im = im.convert("RGB")

pix_val = im.load()

pix_valNew = img.load()

width, height = im.size

strength = 1.5
zoom = 1.0


halfWidth = width/2
halfHeight = height/2
theta = -1
if strength == 0:
    strength = 0.00001
correctionRadius = ((width**2 + height**2)/strength)**0.5
for x in range(512):
    for y in range(512):

        newX = x - halfWidth
        newY = y - halfHeight

        distance = (newX**2 + newY**2)**0.5
        r = distance/correctionRadius

        if r == 0:
            theta = 1
        else:
            theta = np.arctan(r)/r
        sourceX = (int)(halfWidth + theta * newX * zoom)
        sourceY = (int)(halfHeight + theta * newY * zoom)
        pix_valNew[x,y] = pix_val[sourceX,sourceY]

img.show()

我不断收到一张全白的图像,但我无法对其进行故障排除,因为我对它完全陌生。

512x512 是我想要“去鱼”的图像的分辨率。 据我了解,逻辑是在 鱼眼图像并将其映射到正常图像中的相应位置

有人要求我提供链接的伪代码,但我也将其粘贴在这里。如下: 输入: 作为浮点数的强度 >= 0。0 = 没有变化,高数字等于更强的修正。 缩放为浮点 >= 1。(1 = 缩放不变)

算法:

set halfWidth = imageWidth / 2
set halfHeight = imageHeight / 2

if strength = 0 then strength = 0.00001
set correctionRadius = squareroot(imageWidth ^ 2 + imageHeight ^ 2) / strength

for each pixel (x,y) in destinationImage
    set newX = x - halfWidth
    set newY = y - halfHeight

    set distance = squareroot(newX ^ 2 + newY ^ 2)
    set r = distance / correctionRadius

    if r = 0 then
        set theta = 1
    else
        set theta = arctangent(r) / r

    set sourceX = halfWidth + theta * newX * zoom
    set sourceY = halfHeight + theta * newY * zoom

    set color of pixel (x, y) to color of source image pixel at (sourceX, sourceY)

我们将不胜感激任何形式的帮助。

【问题讨论】:

欢迎堆栈溢出。您应该考虑更新您的帖子以包含伪代码。 您的“myimage.png”是 512x512 图像吗? 你调试过变量的值吗?想知道它们在哪一点偏离了您的预期? @Cris "Lense" 是 generally considered to be a misspelling。 @LightnessRacesBY-SA3.0:我在修复错字时打错了字。谢谢! 【参考方案1】:

似乎在某些输入组合下,正在计算源图像的非法索引。一个简单的解决方法是替换

pix_valNew[x,y] = pix_val[sourceX,sourceY]

与:

    try:
        pix_valNew[x,y] = pix_val[sourceX,sourceY]
    except IndexError:
        print('IndexError', x, y, sourceX, sourceY)
        pix_valNew[x, y] = (0, 0, 0)

另外,刚刚注意到你的代码行:

correctionRadius = ((width**2 + height**2)/strength)**0.5

应该是:

correctionRadius = ((width**2 + height**2)**0.5)/strength

【讨论】:

对不起,它仍然是白色图像 如果您将 strength 设置为 1 并将 zoom 设置为 1,那么代码应该只是复制原始图像。你会遇到这种情况吗? 糟糕,我的意思是强度为零应该给出相同的图像。 在我的回答中添加了关于 ab 不正确的代码行的注释,但我怀疑它是否有任何显着影响。 没有。强度为零和缩放一只会给我一条黑色垂直线,中间有一个小中断,不超过从 (0,0) 开始一直向下延伸的几个像素

以上是关于我在这个镜头畸变校正程序中不断得到一张白色的照片的主要内容,如果未能解决你的问题,请参考以下文章

影像镜头畸变校正

镜头畸变模型与校正模型

OpenCV:鱼眼相机去畸变=图像去畸变+点去畸变

好用的照片校正软件

摄像头距离标定方法研究(得到像素和毫米的转换比)

DxO Analyzer 光学模块鱼眼镜头MTF测试