图像切割—基于图的图像切割(Graph-Based Image Segmentation)
图像切割—基于图的图像切割(Graph-Based Image Segmentation)
Reference:
Efficient Graph-Based Image Segmentation,IJCV 2004,MIT Code
最后一个暑假了,不打算开疆辟土了。战略中心转移到品味经典。计划把图像切割和目标追踪的经典算法都看一看。再记些笔记。
Graph-Based Segmentation 是经典的图像切割算法,作者Felzenszwalb也是提出DPM算法的大牛。该算法是基于图的贪心聚类算法,实现简单。速度比較快,精度也还行。
只是。眼下直接用它做切割的应该比較少,毕竟是99年的跨世纪元老,可是非常多算法用它作垫脚石。比方Object
Propose的开山之作《Segmentation as Selective Search for Object Recognition》就用它来产生过切割(oversegmentation)。还有的语义切割(senmatic segmentation )算法用它来产生超像素(superpixels)详细忘记了……
图的基本概念
由于该算法是将照片用加权图抽象化表示,所以补充图的一些基本概念。
图是由顶点集(vertices)和边集(edges)组成,表示为。顶点,在本文中即为单个的像素点。连接一对顶点的边具有权重,本文中的意义为顶点之间的不相似度,所用的是无向图。
树:特殊的图。图中随意两个顶点,都有路径相连接,可是没有回路。如上图中加粗的边所连接而成的图。假设看成一团乱连的珠子,仅仅保留树中的珠子和连线。那么随便选个珠子,都能把这棵树中全部的珠子都提起来。假设,i和h这条边也保留下来。那么顶点h,i,c,f,g就构成了一个回路。
最小生成树(MST, minimum spanning tree):特殊的树。给定须要连接的顶点,选择边权之和最小的树。
上图即是一棵MST
本文中,初始化时每个像素点都是一个顶点,然后逐渐合并得到一个区域,确切地说是连接这个区域中的像素点的一个MST。如图,棕色圆圈为顶点。线段为边。合并棕色顶点所生成的MST,相应的就是一个切割区域。切割后的结果事实上就是森林。
相似性
既然是聚类算法,那应该根据何种规则判定何时该合二为一,何时该继续划清界限呢?
对于孤立的两个像素点,所不同的是颜色,自然就用颜色的距离来衡量两点的相似性,本文中是使用RGB的距离,即
当然也能够用perceptually uniform的Luv或者Lab色彩空间,对于灰度图像就仅仅能使用亮度值了,此外。还能够先使用纹理特征滤波,再计算距离,比方,先做Census Transform再计算Hamming distance距离。
全局阈值à自适应阈值
上面提到应该用亮度值之差来衡量两个像素点之间的差异性。对于两个区域(子图)或者一个区域和一个像素点的相似性,最简单的方法即仅仅考虑连接二者的边的不相似度。
如图,已经形成了棕色和绿色两个区域,如今通过紫色边来推断这两个区域是否合并。
那么我们就能够设定一个阈值,当两个像素之间的差异(即不相似度)小于该值时,合二为一。
迭代合并,终于就会合并成一个个区域。效果类似于区域生长:星星之火,能够燎原。
显然,上面这张图应该聚成右图所思的3类,高频区h,斜坡区s,平坦区p。
假设我们设置一个全局阈值。那么假设h区要合并成一块的话,那么该阈值要选非常大。可是那样就会把p和s区域也包括进来。切割结果太粗。假设以p为參考,那么阈值应该选特别小的值,那样的话。p区是会合并成一块。可是,h区就会合并成特别特别多的小块,如同一面支离破碎的镜子,切割结果太细。
显然,全局阈值并不合适,那么自然就得用自适应阈值。对于p区该阈值要特别小,s区稍大。h区巨大。
对于两个区域(原文中叫Component,实质上是一个MST,单独的一个像素点也能够看成一个区域),本文使用了很直观,但抗干扰性并不强的方法。先来两个定义。原文根据这两个附加信息来得到自适应阈值。
一个区域的类内差异:
能够近似理解为一个区域内部最大的亮度差异值,定义是MST中不相似度最大的一条边。
两个区域的类间差异:
即连接两个区域全部边中,不相似度最小的边的不相似度,也就是两个区域最相似的地方的不相似度。
那么直观的推断是否合并的标准:
等价条件
解释: ,各自是区域和所能忍受的最大差异,当二者都能忍受当前差异时。你情我愿,一拍即合,仅仅要有一方不愿意,就不能强求。
特殊情况。当二者都是孤立的像素值时。,全部像素都是"零容忍"仅仅有像素值全然一样才干合并。自然会导致过切割。所以刚開始的时候,应该给每一个像素点设定一个能够容忍的范围。当生长到一定程度时。就应该去掉该初始容忍值的作用。
原文条件例如以下
添加项:
当中为区域所包括的像素点的个数,如此。随着区域逐渐扩大,这一项的作用就越来越小,最后差点儿能够忽略不计。那么就是一个能够控制所形成的的区域的大小,假设。那么,差点儿每一个像素都成为了一个独立的区域,假设,显然整张图片都会聚成一块。所以,越大。切割后的图片也就越大。
当然,能够採用中位数来应对超调,只是这就变成了一个NP难问题。证明见原文
形状相似
前面提到的用颜色信息来聚类,改动相似性衡量标准,能够聚类成我们想要的特定形状。
比方我们希望得到非常多长条形的区域,那么能够用聚类后的所形成的区域的面积/周长 + 亮度值的差 衡量两个子图或者两个像素之间的相似度。
由于长条形的面积/周长会比較小。
算法步骤
Step 1: 计算每个像素点与其8邻域或4邻域的不相似度。
如左边所看到的,实线为仅仅计算4领域。加上虚线就是计算8邻域。因为是无向图,依照从左到右。从上到下的顺序计算的话。仅仅须要计算右图中灰色的线就可以。
Step 2: 将边依照不相似度non-decreasing排列(从小到大)排序得到。
Step 3: 选择
Step 4: 对当前选择的边进行合并推断。设其所连接的顶点为。假设满足合并条件:
(1)不属于同一个区域;
(2)不相似度不大于二者内部的不相似度。
则运行Step 5。否则运行Step 6
Step 5: 更新阈值以及类标号。
更新类标号:将的类标号统一为的标号。
更新该类的不相似度阈值为:。
注意:因为不相似度小的边先合并,所以。即为当前合并后的区域的最大的边,即。
Step 6: 假设,则依照排好的顺序。选择下一条边转到Step 4,否则结束。
结果
Segmentation parameters: sigma = 0.5, k= 500, min = 50.
Sigma:先对原图像进行高斯滤波去噪。sigma即为高斯核的
k:
控制合并后的区域的大小,见前文
min: 后处理參数,切割后会有非常多小区域,当区域像素点的个数小于min时。选择与其差异最小的区域合并即。
性质讨论
结果尽管不是非常好,但有非常好的全局性质。结论非常有意思,有兴趣的能够看看。
首先要说明的是,对于不论什么图像,始终存在一种切割方法,使得切割的结果既只是细。也只是粗。
可是并不唯一。
引理
假设step 4
时,,但并没有合并,即,那么肯定有一个区域已经切割好了,比方,那么区域的范围就不会再有添加,它将会成为终于的切割区域中的一个区域。
Proof:
如果。,因为边是依照non-decreasing排序。所以剩下的连接的边的不相似度肯定都不低于。最小的边都不行,其余的边自然是靠边站了。
只是,原文说仅仅能仅仅有一个已经切割好了。可是我认为另一种情况。 而且,那么这两个区都应该分好了才对呀。
Not Too fine
切割太细,也就是本来不应该分开的区域被拦腰截断。可是本算法是能保证有情人终成眷属的,绝对不会干棒打鸳鸯拆散一对是一对的事。
Proof:
反证法:如上图。本不应该切割,则应该满足条件。如果分开了,那么必然存在一条边导致二者没有合并。那么由前面的引理,必然存在一个区域成为终于切割结果的一部分,如果为A部分,再回溯到推断这条边的时候。必然有。,从而,因为是按non-decreasing
顺序,所以A部分和B部分最小的边就是,那么与如果条件矛盾。
Not Too coarse
切割太粗。也就是本应该分开的区域没有分开。但本算法能保证当断则断。不会藕断丝连。
反证法:如上图。本应该切割,则应满足条件。如果还是 ,为连接A,B最小的边。如果合并了,因为。并且是non-decreasing
顺序,所以在判定边之前A区域已经形成。
假设切割过粗。则判定这条边时最小的边满足,则必然使得二者合并了。
和条件矛盾。
等权边处理先后次序的影响
假设两条边。的权值同样,那么排序时候。谁排前头。谁落后面有影响吗?结论是木有。
Proof:
Case1:,连接的区域同样,即,连接的都是区域。那么它俩谁在前面都没关系。
Case2:,连接的区域全然不同,比方连接区域,,连接区域,那么谁先谁后,都不影响是否合并,也不影响是否合并。
Case3:连接,连接
Case3-1:在先。在后,而且,使得合并。交换二者处理顺序。先处理。后处理。
假设不合并,那不影响合并;假设合并,那么合并后的,照样合并。
Case3-2:在先,在后,而且,不合并,交换二者处理顺序。先处理,后处理。假设是。
那是否合并。都不会使得合并;假设,那相同也有,相同也没影响。
补充:
彩色图片
对于彩色图片,上文是将R,G,B作为距离。整张图片仅仅进行一次切割。原文说对每个通道都进行一次切割,最后对结果取交集,也就是说图片中的两个点要划分到同一个区域,则在R,G,B三个通道的划分结果中。它俩得始终在同一个区域。原文说这样效果更好……只是他的程序是採用一次切割。
Nearest Neighbor Graphs
前文是仅仅用了空间位置来构件图的连接关系,缺点是明显的,空间不相邻,色彩全然一样也白搭,于是中间略微有断开都会分成多个部分。于是还有一种更为平等的策略是二者一块考虑,先映射到特征空间。再构建图。此时有连接关系的就不一定是4/8邻域了,因为有对边。因此假设考虑全部边的连接关系的话,太恐怖了!原文是对每一个像素点找10个欧氏距离近期的点即10近期邻。构建图。当然。第二种方法不是固定邻居数目,而是限定距离范围。
那么类内距离的解释就和直观了。类内最短的距离,那么会以这条边为半径,在特征空间构成一个超球体,只是会和别人有相交。
相同还是两个类直接的最短距离。
找10-NN太累,原文採用近似算法ANN《Approximate nearest neighbor searching》来找10近邻。快。
剩下的和上面一样,可是有一点我没明确,就是的更新,比方上图。肯定是用绿色这条线更新,那么的意义就不再是包括集合全部点的最短半径了,求解?
结果例如以下:能够看到被栏杆分开的草地也连在一块了,以下的花朵也属于同一个类别
下个星期写Mean shift,敬请期待
图像切割—基于图的图像切割(Graph-Based Image Segmentation)的更多相关文章
- Kaggle "Microsoft Malware Classification Challenge"——就是沙箱恶意文件识别,有 Opcode n-gram特征 ASM文件图像纹理特征 还有基于图聚类方法
使用图聚类方法:Malware Classification using Graph Clustering 见 https://github.com/rahulp0491/Malware-Classi ...
- 跟我学Python图像处理丨基于灰度三维图的图像顶帽运算和黑帽运算
摘要:本篇文章结合灰度三维图像讲解图像顶帽运算和图像黑猫运算,通过Python调用OpenCV函数实现. 本文分享自华为云社区<[Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽 ...
- Java基于opencv实现图像数字识别(五)—投影法分割字符
Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ...
- Java基于opencv实现图像数字识别(一)
Java基于opencv实现图像数字识别(一) 最近分到了一个任务,要做数字识别,我分配到的任务是把数字一个个的分开:当时一脸懵逼,直接百度java如何分割图片中的数字,然后就百度到了用Buffere ...
- Learning Combinatorial Embedding Networks for Deep Graph Matching(基于图嵌入的深度图匹配)
1. 文献信息 题目: Learning Combinatorial Embedding Networks for Deep Graph Matching(基于图嵌入的深度图匹配) 作者:上海交通大学 ...
- 笔记:基于DCNN的图像语义分割综述
写在前面:一篇魏云超博士的综述论文,完整题目为<基于DCNN的图像语义分割综述>,在这里选择性摘抄和理解,以加深自己印象,同时达到对近年来图像语义分割历史学习和了解的目的,博古才能通今!感 ...
- Java基于opencv实现图像数字识别(四)—图像降噪
Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...
- Java基于opencv实现图像数字识别(二)—基本流程
Java基于opencv实现图像数字识别(二)-基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条:来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程. 我做的主要 ...
- 【图像配准】基于互信息的图像配准算法:MI、EMI、ECC算法
简单介绍: 基于互信息的图像配准算法以其较高的配准精度和广泛的适用性而成为图像配准领域研究的热点之中的一个.而基于互信息的医学图像配准方法被觉得是最好的配准方法之中的一个.基于此.本文将介绍简单的基于 ...
随机推荐
- poj2411 Mondriaan's Dream (状压dp+多米诺骨牌问题)
这道题的解析这个博客写得很好 https://blog.csdn.net/shiwei408/article/details/8821853 大致意思就是我们可以只处理两行之间的关系,然后通过这两个关 ...
- IT同行请教我如何培养读书习惯,结果就是“读了1本书,并写下'读《成交》有感'一文”
前段时间,我把CSDN博客的签名加上了"读过100+本经典书籍". 一个经常关注我CSDN博客的老乡,问我是如何做到的. 该老乡,准确来说是前辈,该前辈买了很多技术读物却没有耐心读 ...
- vue生命周期的基础部分
Vue实例从创建到销毁的过程,就是生命周期. Vue的生命周期包括:开始创建.初始化数据.编译模板.挂载Dom.渲染→更新→渲染.卸载等一系列过程. 在Vue的整个生命周期中,提供了一系列的事件,可以 ...
- HDU——T 1498 50 years, 50 colors
http://acm.hdu.edu.cn/showproblem.php?pid=1498 Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...
- 12:打印 1 到最大的 n 位数
题目:输入数字 n.按顺序打印出从 1 到 最大的 n 位十进制数.比方输入 3 ,则打印出 1.2 .3 一直到最大的3位数即 999. 解析: easy知道不能用 int 等数字类型表示(大数问题 ...
- POJ 2906 数学期望
开始时直接设了一个状态,dp[i][j]为发现i种bug,j个系统有bug的期望天数.但很错误,没能转移下去.... 看了题解,设状态dp[i][j]为已发现i种bug,j个系统有bug,到完成目标状 ...
- cocos2d-x 中XML解析与数据存储
一不小心就玩了一周的游戏了.哎.玩的时候时间过得总是这么快... 于是今天决定看一下之前不怎么非常熟悉的XML;(之前做游戏时数据的储存用到过XML,但这块是还有一个同事在做,所以不怎么熟悉), 看了 ...
- silverlight wpf Command提交时输入验证
silverlight 或WPF在MVVM模式中使用INotifyDataErrorInfo接口对输入进行验证时 控件lostFocus时会触发验证,但在提交动作(例如button的Command)时 ...
- Python一行代码获得IP地址
比较靠谱的方法, 通过构造UDP包获得本机IP地址 python -c "import socket;print([(s.connect(('8.8.8.8', 53)), s.gets ...
- 将hexo的评论系统由gitment改为Valine
title: 将hexo的评论系统由gitment改为Valine toc: false date: 2018-09-13 15:10:56 categories: methods tags: hex ...