基于SIFT的图像拼接(融合)实现
本文旨在提供一份可以运行的图像拼接代码,对网上的程序进行整合和修改。文末附上相关参考资料供大家学习理解。
思路是利用尺度不变特征变换(SIFT) 算法提取图像的特征点并进行了试验对比,然后利用随机抽样一致(RANSAC) 算法消除误匹配,确定了图片的空间映射模型。最后利用渐入渐出融合算法进行图像的拼接和修复。(需要完整代码可以私信我或者评论留下邮箱)
- 编程环境介绍及准备:
1.win10家庭版64位、Matlab R2019b
2.将siftWin32.exe放在Matlab安装文件bin目录下的win64里,例如我的路径就是D:\matlabr2019b\bin\win64(网上有人说放在win32目录下都可以试一下)
- 程序
包含SIFT提取特征点程序siftWin32.exe,主程序为zjpj.m.
- 程序调试
个人修改代码遇到各种问题,所以把遇到问题和解决办法列在下面供大家交流学习
1.不同的图片拼接需要调整sitf.m里的distRatio阈值来保证程序的正常运行和最好的拼接效果。俩张图的像素值最好一样。
2.如果想看某个变量的类型除了查看工作区,也可在在命令窗口输入whos+变量名即可。
3.如果看到错误使用 imread>parse_inputs (line 445) 文件名或 URL 参数必须为字符矢量,查看是否对图片读出的数据又使用imread读取了一遍。
4.如果看到未定义 N 维数组的转置。请改用 PERMUTE 出错。这是对三维矩阵转置了,处理图像先转到灰度图像,原程序使用isrgb判断是否为三维矩阵,因为版本问题isrgb已经被删除,我已经找到isrgb的源码在程序包里大家想用可以试一下,我用其他的方法处理了。
5.大部分报错矩阵维度不一致,个人理解有可能是左右图读取顺序相反或者是特征点提取阈值设置的问题,或者超出匹配对数和迭代的次数。
- 拼接效果
原图1:
拼接后:
原图2:
拼接后:
- 总结
最后的图像融合算法效果较好的,但是如果俩张图差距较大或者有明显的色差和边缘就会影响到拼接效果,但是此融合算法不用投影到柱面就可以进行拼接。个人感觉比较适用于场景较暗或者色调单一的场景。如上第二组也可作为一种特殊的滤镜效果。
- 参考资料:(点击文字即可查看)
代码:
SIFT特征提取程序:https://ww2.mathworks.cn/matlabcentral/fileexchange/30849-image-mosaic-using-sift
原理:
渐入渐出融合算法:http://www.voidcn.com/article/p-ptpamyvb-bbr.html