您的位置:首页 > 编程语言 > Qt开发

基于qt,opencv交互式的graphcuts算法的实现

2017-08-23 19:46 295 查看
1.原理

交互式graphcuts算法是通过标记目标和背景像素,统计像素的灰度值,然后计算出目标像素和背景像素灰度值的均值和方差,再通过高斯函数代入该均值和方差映射出原图。通过映射出的原图和构造的图(graph)送入能量函数,当能量函数达到最小时,即为分割完成。

这里通过个人的理解,对graphcuts的原理大致说明了一下,关于graphcuts原理的讲解,请参考http://blog.csdn.net/zouxy09/article/details/8532111这篇博客对graphcuts算法讲解的已经够透彻了。

如果对graphcuts算法不是很理解的同学,本博客可能不是很适合你!

2.基于qt,opencv交互式的graphcuts算法的实现

(1)qt是什么,qt就是做界面的工具而已;

(2)opencv是处理自然图像第三方库(如果同学要处理的是医学图像,可能本文也不适合你,因为opencv的局限性,目前只能处理自然图像)

(3)qt实现界面

由于时间关系,本文只做了一个初步界面,还有好多功能,期待其他同学后续完成。

本文用qt中的QLabel显示图像,如下图。左边窗口是显示原图,右边是分割结果图像。



(4)本文只制作了另一个简单的分割并显示的界面,所用用到的头文件如下图片所示。



graphcut.ui是显示待分割和已经分割好了的图像的窗口,bock.h,graph.h,instances.inc,LazySnapping.h,SimpleKMeans.h都是原作者写的关于图(graph)的类;graph.cpp,LazySnapping.cpp,maxflow.cpp,SimpleKMeans.cpp是原作者写相关类实现文件。本文所做的工作只有graphcut.ui,graphcut.h,graphcut.cpp三个文件,说白了,本文就是将原作者写的graphcuts算法调试成功,并加了一个界面。

3.操作步骤

这部分内容本来是没有必要讲的,为了那些帮助那些跟我一样初次接触VS,Qt,OpenCV等小白同学,这里把操作步骤写的详细一下吧。



在上图中,双击graphcut.sln。这是VS下打开工程项目的索引。打开了以后,就可以看到


这是打开graphcut项目之后,VS中显示的窗口。如果你将OpenCV和Qt安装好了,应该就可以直接按下F5键运行。项目运行成功后就会出现如下窗口


如果此时你运行到了这一步了,那就可以跟你说一声恭喜了,因为接下来你就可以立马运行graphcut算法了。此时心中有没有一万个草泥马涌现出来,终于把你运行成功了。这时候点击File->OpenImage按钮,就会显示待分割图像。本人是在百度图下载了一张泰迪熊的图像,是不是感觉很可爱啊有木有...



这时选中teddy.png图像,然后按下Edit->Segment按钮,就会弹出另一个显示泰迪熊的窗口。在弹出泰迪熊的窗口中,用鼠标左键画泰迪熊,用鼠标右键画背景。



此时,像素已经标记完了。将输入法切换成英文状态,按下键盘上的s键就完成了分割。


到此处,你已经完成本程序。有人想说,中间的交互界面怎么不是在显示泰迪熊的窗口中完成,而是在新弹出的窗口完成?因为本人刚接触Qt哈,还做不到那一步。所以交互界面只能用opencv的代码实现了。可能又有人问,那弹出的窗口怎么也关闭不了啊?此时你只要把鼠标放在新弹出的窗口上,并按下键盘上的ESC键,新弹出的窗口即可关闭。

4.总结

graphcut算法确实很强大,也有很多改进的地方。本人是一名在校硕士研究生,本人的课题也是做改进graphcut算法,不过是针对医学图像处理。貌似扯远了哈~

关于graphcut其他的相关细节,同学们只能去看《Interactive Graph Cutsfor Optimal Boundary & Region Segmentation of Objects in N-D Images》这篇论文,这篇论文是graphcut算法提出者Yuri Y. Boykov写的,他对graphcut算法从由来和原理将的很透彻。但是,中间的证明过程,我也没有看懂,不知所云。这毕竟是顶级期刊IEEE上的文章,对于我等小白要想彻底了解其中的含义,还需要下一番苦功夫哈!

最后说明一下,本文实现代码是基于VS2013,Qt5.6.2,OpenCV2.3.14,Windows10,32位

代码链接:http://download.csdn.net/download/wocanimei007/9947387。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息