图像处理(四)图像分割(2)测地距离Geodesic图割
2016-01-28 08:08
267 查看
这段时间为了搞项目,涉及到图像分割算法,由于感觉传统的分割算法得出来的效果都很差。于是就尝试各种图像分割算法,把每种分割算法的代码都写一写,一来是为了提高自己的编程能力,二来是为了更加深刻的了解算法。学习基于测地距离的图像分割算法,是由于之前把grab cut算法实现了一遍,感觉效果很坑爹,于是就尝试基于测地距离的分割算法。这个算法开始前,需要先非常熟悉“测地距离”这个概念,因为之前写过三角网格曲面上的Dijkstra算法,在三维曲面空间中两点间的测地距离就是两点间沿着曲面走的最短路径,因为之前对测地距离这个概念就比较熟悉,所以看《Geodesic Matting: A Framework for Fast Interactive Image》这篇paper,也就觉得没有什么难度,所以果断写代码,试验一下效果再说。
1、算法原理:基于测地距离的图像分割属于一种图论的分割算法。图论分割算法:即把图像上的每个像素点当做图的顶点,图的每个顶点有四个邻接顶点(每个像素点有四个邻接像素点,除边界点),每两个邻接像素点用相应的边连接,边的长度与两个像素点间的相似度有关(测地距离),而非采用简单的欧式距离作为边长(相邻像素点间的欧式距离为1),具体文献中边长的计算方法见下文。
2、基于测地距离的分割算法流程:给定一张待分割的图片,首先算法会利用该图片构造一张距离图,边的距离大小:参考文献中采用的是现根据已知的标记点前景、背景,对未知的像素点进行核密度估计,并根据相邻相似点间的隶属于前景的概率差,作为边长,我写的demo中是直接采用像素值的差值作为边长。
具体实现:在测地距离的算法中提供两种类型的笔刷,其作用是用来标记为分割时的前景F和相应的背景B。
①首先会需要用户在相应的前景和背景区域做标记。
②计算未标记点到已标记点前景的测地距离d1,及背景的测地距离d2。测地距离的计算方法我的demo中采用的是Dijkstra算法进行计算(Dijkstra算法原理请百度搜索)。具体过程如下:首先,把标号为的标记点到目标的测地距离初始化为0,到背景的测地距离初始化为无穷大;同样,把标号为的标记点到背景的测地距离初始化为0,到目标的测地距离初始化为无穷大。根据连通标号矩阵,搜索标号为的所有标记点的4连通邻域像素点,找出这些像素点中权重概率最小的那个像素点,把最小权重概率对应的像素点添加到已排好序的路径上,并通过比较原来的权重概率与加入新顶点后的新概率大小,决定是否更新其它像素点的权重概率。这样,不断地添加新的像素点到已排好序的路径上,直到图像中所有像素点全部搜索完为止。于是由一个或多个权重概率加和得到每个像素点到目标的测地距离d1(x)。同理,可以计算出图像中各像素点到背景的测地距离d2(x)。
③根据测地距离的大小,判断未标记点属于前景或背景。根据概率公式,由图像中的每个像素点到目标和背景的测地距离,计算出该像素点分属于目标和背景的概率:
![](https://img-blog.csdn.net/20150424112810250?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGppbWNl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
,
![](https://img-blog.csdn.net/20150424112827956?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGppbWNl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
对于图像中的各像素点,若
![](https://img-blog.csdn.net/20150424112729699?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGppbWNl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
,则把该像素点判为目标像素点则判为把该像素点判为背景像素点。
看一下我测试的几张图片分割效果:
![](https://img-blog.csdn.net/20150424113058200?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGppbWNl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20150424113044902?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGppbWNl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
原图 分割结果
![](https://img-blog.csdn.net/20150424113211639?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGppbWNl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20150424113341548?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGppbWNl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
原图 分割结果
最后总结一下算法的优缺点:这个算法给我的感觉,至少比grab cut 算法强,2004年的grab cut 算法paper效果看起看挺不错的,但是试验起来感觉很坑爹。
算法优点:计算速度快,比grab cut算法快好多(demo未做整理,边长重复计算,因此速度达不到文献中速度),对图片中包含半透明区域的图像分割也有一定的效果。
算法缺点:如果前景和背景边缘比较模糊,这时测地距离的图像分割容易出错。这时候用户如果想得到一个较好的分割效果,需要额外的交互或者对图像进行其他的处理。
附:还有一篇2010年文献《Geodesic graph cut for interactive image segmentation》结合了graph cut 算法和测地距离分割算法的优点,把两种算法结合起来,可克服两种算法存在的缺陷。
总结:图像分割算法基本上鲁棒性都很差,加点噪声,边缘较弱等对所有的图像分割算法影响都很大,算法一般只对文献上的图片效果较好。
1、算法原理:基于测地距离的图像分割属于一种图论的分割算法。图论分割算法:即把图像上的每个像素点当做图的顶点,图的每个顶点有四个邻接顶点(每个像素点有四个邻接像素点,除边界点),每两个邻接像素点用相应的边连接,边的长度与两个像素点间的相似度有关(测地距离),而非采用简单的欧式距离作为边长(相邻像素点间的欧式距离为1),具体文献中边长的计算方法见下文。
2、基于测地距离的分割算法流程:给定一张待分割的图片,首先算法会利用该图片构造一张距离图,边的距离大小:参考文献中采用的是现根据已知的标记点前景、背景,对未知的像素点进行核密度估计,并根据相邻相似点间的隶属于前景的概率差,作为边长,我写的demo中是直接采用像素值的差值作为边长。
具体实现:在测地距离的算法中提供两种类型的笔刷,其作用是用来标记为分割时的前景F和相应的背景B。
①首先会需要用户在相应的前景和背景区域做标记。
②计算未标记点到已标记点前景的测地距离d1,及背景的测地距离d2。测地距离的计算方法我的demo中采用的是Dijkstra算法进行计算(Dijkstra算法原理请百度搜索)。具体过程如下:首先,把标号为的标记点到目标的测地距离初始化为0,到背景的测地距离初始化为无穷大;同样,把标号为的标记点到背景的测地距离初始化为0,到目标的测地距离初始化为无穷大。根据连通标号矩阵,搜索标号为的所有标记点的4连通邻域像素点,找出这些像素点中权重概率最小的那个像素点,把最小权重概率对应的像素点添加到已排好序的路径上,并通过比较原来的权重概率与加入新顶点后的新概率大小,决定是否更新其它像素点的权重概率。这样,不断地添加新的像素点到已排好序的路径上,直到图像中所有像素点全部搜索完为止。于是由一个或多个权重概率加和得到每个像素点到目标的测地距离d1(x)。同理,可以计算出图像中各像素点到背景的测地距离d2(x)。
③根据测地距离的大小,判断未标记点属于前景或背景。根据概率公式,由图像中的每个像素点到目标和背景的测地距离,计算出该像素点分属于目标和背景的概率:
,
对于图像中的各像素点,若
,则把该像素点判为目标像素点则判为把该像素点判为背景像素点。
看一下我测试的几张图片分割效果:
原图 分割结果
原图 分割结果
最后总结一下算法的优缺点:这个算法给我的感觉,至少比grab cut 算法强,2004年的grab cut 算法paper效果看起看挺不错的,但是试验起来感觉很坑爹。
算法优点:计算速度快,比grab cut算法快好多(demo未做整理,边长重复计算,因此速度达不到文献中速度),对图片中包含半透明区域的图像分割也有一定的效果。
算法缺点:如果前景和背景边缘比较模糊,这时测地距离的图像分割容易出错。这时候用户如果想得到一个较好的分割效果,需要额外的交互或者对图像进行其他的处理。
附:还有一篇2010年文献《Geodesic graph cut for interactive image segmentation》结合了graph cut 算法和测地距离分割算法的优点,把两种算法结合起来,可克服两种算法存在的缺陷。
总结:图像分割算法基本上鲁棒性都很差,加点噪声,边缘较弱等对所有的图像分割算法影响都很大,算法一般只对文献上的图片效果较好。
本文地址:http://blog.csdn.net/hjimce/article/details/45221607
作者:hjimce 联系qq:1393852684
更多资源请关注我的博客:http://blog.csdn.net/hjimce
原创文章,转载请保留这两行作者信息
相关文章推荐
- PHP GD 图像处理组件的常用函数总结
- PHP图像处理之imagecreate、imagedestroy函数介绍
- jsvascript图像处理―(计算机视觉应用)图像金字塔
- Javascript图像处理思路及实现代码
- PHP图像处理之使用imagecolorallocate()函数设置颜色例子
- java数字图像处理基础使用imageio写图像文件示例
- 使用Java进行图像处理的一些基础操作
- javascript图像处理―边缘梯度计算函数
- Javascript图像处理―阈值函数实例应用
- Javascript图像处理―虚拟边缘介绍及使用方法
- PHP图像处理类库及演示分享
- php图像处理函数大全(推荐收藏)
- Javascript图像处理―图像形态学(膨胀与腐蚀)
- Javascript图像处理―平滑处理实现原理
- Swift图像处理之优化照片
- 在Ubuntu上安装OpenCV3.0和Python-openCV的经历
- VTK学习笔记之图像处理
- vtk 图像处理 多种 操作
- 05-VTK在图像处理中的应用(2)
- 新手上路之图像处理学习心得