Coder Social home page Coder Social logo

jocelynwang2333 / image-stitching Goto Github PK

View Code? Open in Web Editor NEW

This project forked from zysc1996/image-stitching

0.0 0.0 0.0 15.6 MB

对两张包含部分相同内容的图片进行基于sift特征提取的图片拼接

Python 99.26% Jupyter Notebook 0.74%

image-stitching's Introduction

Image-Stitching

项目内容

使用 python + opencv,使用SIFT算法、RANSAC除噪,对两张包含部分相同内容的图片进行基于特征提取的图像拼接

实验步骤


第一步:对输入图象进行图像增强,目前测试了直方图均衡化、亮度匹配 % 图象增强虽然放在开头,确是其他部分调整完之后最后进行的内容,在得到base line之后根据结果缺陷有针对性地进行图象增强)
第二步:使用SIFT算法对两张图片进行特征提取 % 在充分理解SIFT算法之后,可以考虑换用SURF等其他特征提取算法来进行对比分析
第三步:对两张图上的特征点进行匹配(目前测试了brute匹配器的暴力匹配、flann匹配器的K-最近邻匹配) % 依照目前的结果来看,虽然两种匹配方式选择的特征点对有所区别,不过最终拼接的效果在图片质量高时相差很小
第四步:对匹配好的特征点对,进行筛选,尽量剔除误匹配,根据匹配效果最好的四个点计算投影变换使用的单应性矩阵(目前测试了RANSAC算法剔除误匹配) % 直接调用,最省心的一步
第五步:根据第四步返回的单应性矩阵进行图片拼接,考虑了两种拼接方法 % 直接覆盖式:即将图片的重叠部分找到后,保留某张图的重叠部分区域灰度图的权重为1,另外图片的权重为0。(原楼主使用的代码) % 加权融合式:与上述方法的区别在于将各图的重叠部分区域分别按重叠部分所占各图比例赋予0~1之间的权重,使得权重之和结果为一。(后续New_Code)

直接覆盖式问题及缺陷

1、目前测试的两种增强方式都是为了实现亮度归一化,避免在特征匹配良好的情况下,因为图片亮度而导致的不自然。很遗憾目前的两种方法都不理想。亮度匹配是根据两张图片的亮度均值之差对其中一张图片的亮度进行整体平移,但是测试结果显示跟不增强的结果几乎没什么区别。直方图均衡化在图片高亮部分表现不错,但是对低亮度部分几乎不起作用,并且在图片分辨率不高的情况下会严重损害图像清晰度,产生马赛克一样的色块。

2、SIFT算法提取特征时,对图片的亮度十分敏感,如果亮度差别比较明显的话,即使特征很明显也很容易产生大量误匹配最终导致匹配失败。这也是最后想到引入图像增强进行亮度归一化的原因,不过目前并没有得到很好的解决。

3、由于opencv的图片拼接API封装的过于高级,没有基本工具包可用,所以全部代码都是由手写实现。其中最关键的是对单应性矩阵的理解,如果不能应用单应性矩阵计算出变换后的画布最大尺寸,就有可能产生图片变换后超出画布范围的情况。

-------------------------------------------------这里是分割线----------------------------------------------------------

结果分析

实验说明

根目录中的图片即为算法输出的结果,原代码命名方式为:图像增强方法__特征匹配方法__拼接图片组编号。新代码的命名为拼接图片编号__output. 原楼主代码为main.py 以及 utils.py, 新代码命名为:StitchImg.py

结果分析

经过两种不同的匹配器对比试验结果,可以找到brute匹配器以及flann匹配器之间的差距。上面已经阐述过,这里不再赘述。(见上述编号1、2、3、4的实验结果) 经过两种不同的拼接方式的对比,最理想条件下,两种方式均能做到完美拼接,(见实验1的结果)。但在图片出现比如清晰度不高,视角发生改变时,没找哪种方法是完美的,各有优劣。 由于原实验是对右图进行仿射变换,故右图出现拉扯的感觉,反之后续新代码实验中左图出现拉扯的感觉,由于视角变幻,将两个不同的视角转换到同一个坐标系上时,图片的信息量不发生改变,故这个现象暂时无法解决(见实验编号2) 比如,直接覆盖式拼接后由于为直接补上重叠处,重叠边缘可看到较为明显的一条痕迹,但重叠部分保持较完整的还原效果(见实验编号3),同样的,原实验中光线的亮暗拼接在一起后有较为明显的差距;而加权融合式不仔细看不出这条拼接的裂痕,也自行将光线的亮暗同化,因为有一个代码中alpha过渡的过程。但由于进行了权重赋值,会有失真感,仔细看有些情况下会出现虚影。 另外,在代码质量上,后续代码中对画布的大小为认为定义,可以考虑计算出重叠后图像的总长度和宽度来对top,bottom,left,right进行新的赋值。否则会出现一些拼接图像超出画布而显示不出来的情况。原代码由于进行了封装用类以及函数的**,使之可调用性以及鲁棒性较强。 但总体来说,新的方法在拼接图像的整体效果上,优于原方法。 若讲将上述方法进行结合,效果会更好。

后续工作以及展望

1、光线强弱优化问题 2、边缘过渡问题 3、视角变幻问题 这个项目可尝试的内容还有很多,会在将来不定期更新。

image-stitching's People

Contributors

zysc1996 avatar jocelynwang2333 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.