仿射变换即把三维物体所成的二维图像进行还原。话不多说,直接上效果:
1.平面翻转
可以使用鼠标任意选取四个点,然后将这四个点变换成矩形。运行结果如下:
2.基于霍夫变换
3.基于仿射变换
先来看另一组基于霍夫变换进行仿射的例子(道路检测):
很显然,简单的检测出最长边再旋转的方法在这里行不通了,因为从三维(但是图像是二维的)变化到二维需要新的算法。
原理:获取原图上四个点,推出新图像的四个点,然后得出它们的变换矩阵,将这个矩阵应用到原图的每一个点,得出新的图像。
(原图)
(变换后的图)
这里存在两个问题:一是变换后新的图像会有一些点没有被映射到,所以是黑的。二是只能对角度较小的原图进行变换,像张荣帅一开始给我发的那个就不行,因为太大了,原图的很多点会被映射到非常大的矩阵中去。
然后我先解决第一个问题:双线性插值,原理是竖着插又横着插,运行结果如下:
针对第二个问题,我想到的是通过线性规划来解决,就是只对我选的四个点以内的图像进行变换,别的点都不要了,我拿车牌的图运行了一下:
但是同样的代码运行到马路那张图时,就变成这样了:
原因是针对不同的原图像所选取的四边形,线性规划时有时候要取直线下方的点,有时候要取直线上方的点,符号不能确定,后来想到的办法是,四个点,取了一条直线后,剩下两点里面任取一个点,然后和这个点同一边(判断方法为“同号”)的点就是我们要的点。
运行结果如下:
如果要取远一点也OK(之前完全取不了,因为新数组太大了):(仍有优化空间)
最后的功能就是可以将任意四边形,二维也好,三维也好,变回矩形。
注:有需要源文件及设计文件的朋友可以联系作者,作者创作不易,希望客官们打赏~(作者联系方式见评论区)