基于qt,opencv交互式的graphcuts算法的实现
1.原理
交互式graphcuts算法是通过标记目标和背景像素,统计像素的灰度值,然后计算出目标像素和背景像素灰度值的均值和方差,再通过高斯函数代入该均值和方差映射出原图。通过映射出的原图和构造的图(graph)送入能量函数,当能量函数达到最小时,即为分割完成。
这里通过个人的理解,对graphcuts的原理大致说明了一下,关于graphcuts原理的讲解,请参考http://blog.****.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.****.net/download/wocanimei007/9947387。