![f4c23671812272a834a193a03e5aa915.png](https://i-blog.csdnimg.cn/blog_migrate/e2826b1f681d5cabfa0b4f9c89885976.jpeg)
一般提到畸变,都会想到镜头畸变,如下图依次为枕形畸变、无畸变、桶形畸变。这些畸变可以通过棋盘格标定进行校正。
![e96d23e1057c319c5f0d12d38e40d1ae.png](https://i-blog.csdnimg.cn/blog_migrate/701d309fa4f149dad89f4b1f7c83be8b.jpeg)
这里讲的畸变是指几何畸变,比如仿射畸变、投影畸变。啥意思?如下图,由于拍摄角度没对正,正方形变形了,这就是几何畸变,而通过校正,使原有的平行、垂直关系得以保持,得到正视图的效果。
![28e3ef0ba8921f821a790388c59464af.png](https://i-blog.csdnimg.cn/blog_migrate/953d513b5659df273eb4f99146ca43cf.jpeg)
![2487d5dae2357d1706e94843a1ac58b7.png](https://i-blog.csdnimg.cn/blog_migrate/bc2932830f012a5f30e1ef4a23c1ab55.jpeg)
![c605a5d0a63811183d1625265b4adda0.png](https://i-blog.csdnimg.cn/blog_migrate/f32780b207ad686131271d9b682cf098.jpeg)
实现原理
如何实现呢?本质是利用消失点原理,如下图,相交于无穷远的平行线,经过投影变换,在图像中会相交于一点,即消失点。
![5c64b3cfa84d47e5df1cfb7c02183fe8.png](https://i-blog.csdnimg.cn/blog_migrate/37ea4a1cada58eabbfe3e28b98077c83.jpeg)
不同的平行线会相交于不同消失点,而一个平面上的各组平行线的消失点共线。这个可以通过公式推导证明,而且消失线方程与投影变换矩阵有关。
![d064b6c6132ae239c0e2482e6c4f8563.png](https://i-blog.csdnimg.cn/blog_migrate/5b66d706f57021e7a4dde0b2a45a8a89.png)
所以通过在图像上描出几组平行关系,就可以计算消失点、消失线,进而反解出投影变换矩阵,利用此矩阵进行图像变换,就可以去除投影畸变。这就是几何畸变校正的总体思路。
实现方式
具体方法有两种:
1、根据两组平行关系做仿射校正,再根据两组垂直关系做度量校正
-
- 仿射校正恢复平行关系;
- 度量校正恢复垂直关系,使图像与真实尺寸之间为相似关系。
2、根据5组垂直关系直接校正
理论如何推导,代码又如何实现呢?直接上干货:Image-Rectification-Through-Vanishing-Elements(利用消失元素实现图像校正),这个貌似是一个家庭作业,作者提供的文档sajaved_hw1.pdf中对相关理论做了推导,然后使用matlab做了实现,效果如下
![4a4351bacf9229e76071a0fc295e2d44.png](https://i-blog.csdnimg.cn/blog_migrate/f22bcbf0905362bdbbdd1ae779f59f95.jpeg)
![45a324256b0f8625e88e330b6bf332ac.png](https://i-blog.csdnimg.cn/blog_migrate/d024c61750faab23b73341e0eb517b07.jpeg)
![448a6e405b8552659cdee7c11dcdb958.png](https://i-blog.csdnimg.cn/blog_migrate/9c10da7903a85a363b1dd90f824abdc2.jpeg)
效果很不错!
不过作者没有提供第二种方法的实现,但他的文档最后给了一个链接,如下图,点击下载hw2_s2.pdf,这个文档对两种方法做了总结,并使用opencv做了实现,实现效果见本文开头的几张图
![545f5bbed027dae4752a03bc12bf8aa0.png](https://i-blog.csdnimg.cn/blog_migrate/2fa58d6aab9a953ba3055a14129dc8b5.jpeg)
自动校正
以上算法有个问题,就是需要人工选择平行线和垂直线,所以无法实现自动化校正。怎么办?别着急,看这里Image-Rectification(Python实现),作者对图像做边缘提取,然后自动找消失点1和2,最后校正去除几何畸变:
![de85201e9a2aadbff0c17dd09aff0d79.png](https://i-blog.csdnimg.cn/blog_migrate/c00e2b1952ac11a2ce1d628f71174152.jpeg)
![2666cd51ce273a239fb4c5cb194844bf.png](https://i-blog.csdnimg.cn/blog_migrate/42f316d6120a25b7d1b79d8796c1791a.jpeg)
![ccb77e9ecbab0ed4795f917a0211067c.png](https://i-blog.csdnimg.cn/blog_migrate/decbf768101ff0e549f2cbed79b61622.jpeg)
自己做个测试,效果还不错:
![b62e5e215be6079d50f7c837c403d818.png](https://i-blog.csdnimg.cn/blog_migrate/b7924236f4660434e2b04089c046dfd2.jpeg)
这个算法可以编到手机里,实现图像自动校正。