该部分对图割算法工具箱(GCO3.0)具体怎么实现简单图像的分割做一个实例。
相关理论介绍以及工具箱的介绍见先前博客:
— 图像分割之图割工具箱GCO3.0的使用(二)
— matlab实现图割算法中的最大流最小割Max-flow/min-cut问题(一)
一)准备之前
对于一副图像分割之前,需要确定分割成几类,这里以灰度图像为例(彩色图像略复杂),通常来说分割成几类只有两种情况:事先知道该分成几类或者实现不知道该分成几类(这就是自适应分割了)。该工具箱应该是对于事先知不知道几类的都可以处理,对于自适应分割只要找到对应的分割准则即可。为了简单起见,这里以知道类别数来进行实验。
选择经典的lena图像,并将其分割成5类。回顾下图割理论,关于图割中图的构造主要包括两个部分的边权值:点与类中心之间的权值、点与点之间的权值。对于这两部分都以简单的图像灰度信息来构造,点与类中心之间的权值按照点的灰度值与类中心的灰度值差值的平方来计算。点与点之间的权值也可以直接按照灰度相差来计算的,这里以文献上常用的方法来计算。
二)点与类中心权值-datacost
要计算点与类中心的权值大小,点的灰度知道(原始图像就是),那么需要知道类中心的权值,因此需要对图像进行初始化预分类得到开始的一个分类标签,从而得到初始的类中心。这以kmeans来进行预分类如下:
%k-means预分类找到中心与分类
%init_lable预分类,列向量; ctrs-类中心灰度值值
[init_lable,ctrs] = kmeans(img(:),Numlables); %img(:)通过索引转化为列向量可用
其中Numlables是定义的分类数(5),matlab自带的kmeans方法理论上适用于一维情况,而图像是二维的,因此需要把图像转化以一条长链(一维)才能用,得到的ctrs就是开始的类中心(灰度)。然后需要计算的就是所有点中,每个点相对于每个类中心的边权值。把上节画的图再用一遍,形象的相关权值定义如下:
可以看到的datacost,这里每个datacost计算方式为
function datacost = Datacost1(img,ctrs)
[m,n] = size(img);
num_lables = size(ctrs,1);
totalsizes = m*n;
datacost = zeros(totalsizes,num_lables);
for i = 1:totalsizes
Ip = double(img(i));
for j = 1:num_lables
datacost(i,j) = (Ip - ctrs(j)).^