请问光学上的“鞍形”畸变的算法如何?

fking22 2003-08-19 08:24:55
就是原来方形的图形变成四条双曲线所围成的图形。
...全文
1000 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
fking22 2003-09-01
  • 打赏
  • 举报
回复
问题是这方面的资料很不好找
dingdang614 2003-09-01
  • 打赏
  • 举报
回复
我觉得这应该从成像的原理上去考虑。
边缘视场上产生畸变时,变形的点和方式都是一定的。给他来一个光学较正就行了。
我知道有人已经在硬件上把这个问题很好地觖决了。算法应该是成熟的。
你可以找找与照相/成像系统相关的东西。
zzwu 2003-08-31
  • 打赏
  • 举报
回复
happy__888([顾问团]寻开心):

1.变换公式
x' = (k1 + k2*(x*x+y*y) )* x
和变换公式
x' = k1(1+k2(x*x+y*y))x
本质上一致的, 令后一式中的 k1*k2 = k2', 就成为前一公式了.

2.把x*x+y*y改成为sqrt(xx+yy)是一种办法,可以使平方项增长速减慢些, 但由于图像尺寸一般总是比1大2-3数量级, 矩形边界点的数据平房开方后还是>>>1,不是最好办,所以要彻底解决,最好还是先规范化为妥, 我想.






寻开心 2003-08-30
  • 打赏
  • 举报
回复
是不是还可以改造一下,把x*x+y*y改成为sqrt(xx+yy)这个时候k2可能就好取一些,避免了平方项增长速度太快的问题。
就是按照距离做线性增量
寻开心 2003-08-29
  • 打赏
  • 举报
回复
这个公式主要是使用的距离中点的平方距离作为线性增量,越远变化越大。
k2是调节这个线性变化尺度的,是不是和k1分开好一点
写成:
x = (k1 + k2*(x*x+y*y) )* x
这样可以分开调节,免得动k1影响后面的平方距离的效果
而且意义也很清晰,k1控制的是线性缩放, k2控制的平方距离缩放量

还有就是如何控制最大的缩放量,例如一个方的,如何控制凹如或者是凸出的最大尺度,
从这个公式当中难以控制,不仅仅是一个反算的问题,还要考虑两个参数k1和k2各自的权重。

zzwu 2003-08-29
  • 打赏
  • 举报
回复
无论如何, 乘积项 k2(x*x+y*y) 的数值不能太大, 且要<1才合理, 这时1+k2(x*x+y*y)之和,主要由前项 1 来决定, 结果图形和原始图形的形状相差不会太大, 而随k2的变化最明显.
所以我认为,先把你的原始图像缩小为(-1,-1,1,1)(方法可参照 happy__888提供的式子做),然后再做变换,则不会产生意外情况,k2的值的取法也会更方便.
fking22 2003-08-29
  • 打赏
  • 举报
回复
嗯,说的不错。看了 zzwu 的解释,我现在已经能较好的选择我需要的图形的 k1 k2值了。
不过还有一个问题就是k1是放大系数,k2可以影响图形的变换率。我通过
1+k2(x*x+y*y) = 1~3 (因为我选择的图是350×350,所以x y最大是350)以内这样小范围算出k2值,然后做变换,这时四边变换后的曲率变化明显,但当 1+k2(x*x+y*y) 的值大的时候四边变形后曲率好像没变一样
寻开心 2003-08-28
  • 打赏
  • 举报
回复
那个公式是有问题,在前面说了,是使用抛物线来做到,会有交叉,不合适。
应该用双曲线,双曲线是有渐进线的(渐进线在图片的对角线上),可以避免交叉的。


还是用zzwu的那个公式:
x'=k1(1+k2(x*x+y*y))x
Y'=k1(1+k2(x*x+y*y))y

他的那个公式还有点不理解,如果是下面的这个样子还好说:
x' = (x*x+y*y)*k1 + k2*x
y' = (x*x+y*y)*k1 + k2*y
这个公式表示按照平方距离的线性变化来移动点,物理意义比较强。
他的公式多了一个和x的乘积,就不明白是作甚么的。
fking22 2003-08-28
  • 打赏
  • 举报
回复
to happy:
你的公式我用 c1=c2=0.9998试验了一下,将一幅350×350的图变换后出来是
一个以图中心为原点,x、y轴分割方形图为四块,每块变换后为花瓣形,以
分割方块对角线为对称轴的图,不是枕形或桶形形状啊
就是类似这样的:

* *
* * * *
* * * *
* *
* * * *
* * * *
* *

















zzwu 2003-08-28
  • 打赏
  • 举报
回复
我对公式
x'=k1(1+k2(x*x+y*y))x
Y'=k1(1+k2(x*x+y*y))y
的理解是:
先不考虑K1(不妨设k1=1),且(x*x+y*y)<1时,则(x,y)->(x',y')的变化决定与K2,当k2正,则显然是放大,且放大率在近四角的点比在近X或Y轴的边界点大,由此就可以使正常矩形产生鞍形失真,或使桶形失真校正为正常矩形.
同理可以理解k2为负的情况.
至于k1,完全是等比例的放大,不会影响形状的变化.
fking22 2003-08-27
  • 打赏
  • 举报
回复
to happy:
y' =y * (1-c1) * (x*x+1)
x' = x * (1-c2) * (y*y+1)

不知c1 c2取什么参数好,我试的时候把一个方形图变换后会变成很窄很长的图
寻开心 2003-08-27
  • 打赏
  • 举报
回复
使用两个线性变换就可以做到的啊。
xs ys xe ye 区间到-1 -1 1 1 的变换
x' = -1 + 2* ( x - xs ) / (xe-xs)
y' = -1 + 2* ( y - ys ) / (ye-ys)

反向变换就是
x = xs + (xe-xs)*(x'+1)*0.5
y = ys + (ye-ys)*(y'+1)*0.5

失真校正使用下面公式有什么问题呐?
y' =y * (1-c1) * (x*x+1)
x' = x * (1-c2) * (y*y+1)
我自己没有尝试过,但是想知道自己推导的那里有问题。
fking22 2003-08-27
  • 打赏
  • 举报
回复
可以说有点头绪吧。不过如你所说的,那k1、k2参数取值确实不好取。

一般图象都不会在(-1,-1,1,1)范围的呀,缩到(-1,-1,1,1)太小了吧?
zzwu 2003-08-27
  • 打赏
  • 举报
回复
我认为,将原始图像的大小规范化到(-1,-1,1,1)范围,再利用上面的公式,就可避免产生预想不到的后果.
自然,最后仍需利用k1将结果图像放大到实际尺寸.
寻开心 2003-08-27
  • 打赏
  • 举报
回复
镜头是一种情况,还有显示器的情况是两组相互垂直的约束射线枪的控制板不均衡,那个时候x和y不同性。
因此更普遍的情形是x和y方向对称,但是不是中心对称。也就是x和y方向的失真强度不同。


给出的公式是想把组成方块按照对角线分隔成为4块,每个对应部分做从直线段到抛物线的变换,现在想来也不合理。当初是觉得对称轴在坐标轴上渐近线是45度线的双曲线方程不好写,才用了抛物线,可是对称轴在坐标轴上的抛物线很有可能和方块的对角线相交(而双曲线是有渐近线的不会相交)。

是否可以考虑在方块的四个边界中心向外的一定距离各设置一个扰动点,它对象素产生吸附或者是推来的作用,利用力学原理做向量合成计算呐。


关于镜头的变化的解决方法,可以仿照这个网址上的方式来做:
http://www.edm2.com/0512/glass.html
就是透镜的效果,把镜子的半径设置的比较大就可以达到目的。
和前面给出的那个网址上说明的是一致的。

zzwu 2003-08-27
  • 打赏
  • 举报
回复
happy__888([顾问团]寻开心) :
由摄像产生的图像失真,我想,归根到底是因镜头引起,而镜头表面是一个球面或抛物面,引起失真总是各个方向都同性的,不可能在x方向和y方向产生差别,所以用x*x+y*y因子来乘似更有理.
fking22 2003-08-26
  • 打赏
  • 举报
回复
还有没有什么进展? 要不我就结贴了
zzwu 2003-08-26
  • 打赏
  • 举报
回复
不知道你的问题是否已经解决?
zzwu 2003-08-23
  • 打赏
  • 举报
回复
各位:
我上面提供的变换公式是从一本早期的图像书中看到的,原来以为很好理解,后试验一下,也发现了一些问题,不像我原来想象的那样简单.
我上面所讲的各种功能(矫正失真图形或将不失真图形弄成失真)虽然都能达到,但k1,k2的选择必须化点功夫. 任取的k1,k2值,有时确实会产生预想不到的后果!
fking22 2003-08-22
  • 打赏
  • 举报
回复
我倒没仔细看,好像没有两次相交。
你的公式我回去再试一下看看。
加载更多回复(25)

4,445

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧