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

来源:互联网 发布:网络直播需要什么资质 编辑:程序博客网 时间:2024/06/10 03:08

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。


原创粉丝点击