github
分水岭算法对噪声比较敏感,容易出现过分割。常见的处理过分割的方法包括:
1). 预处理,图像降噪;
2). 应用标记 (marker)。选择标记需要用户的参与,图像结构的先验知识;
3). 区域融合
本篇博客介绍,基于区域近邻图(RegionAdjacency Graph ,RAG)融合的过分割后处理方法。
此方法依赖于已分割的区域个数和噪声方差,个数越多效果越差,处理时间越长。最糟的情况是每个像素为1个区域。因而,为了减少分水岭分割的个数,需要对图像先降噪,再分水岭分割,最后区域融合
相似度计算
相似度用来判断两个邻近区域是不是应该融合。区域就是初始分割后,属于同一标记的像素集合。
K个区域的RAG, 表示为G=(V,E),其中顶点集
V=1,2...,K
V
=
1
,
2...
,
K
,对应的边集合
E⊂V×V
E
⊂
V
×
V
。每个顶点节点代表一个区域,边表示和邻近区域相连,边权重就是两个区域之间的相似度,如图所示:
很自然的我们会想到用两个邻近区域的均值的距离来衡量相似性,距离越小越相似,不相邻的区域我们直接令相似度为无穷大。但是不同区域的个数不同,对于较小的区域我们倾向于将它和近邻融合,因而我们将区域的个数的信息作为权重来调整相似度。
因此相似度的计算方式定义如下:
RM={R1M,R2M,...,RMM} R M = { R M 1 , R M 2 , . . . , R M M } 表示图像Y的M个区域集合。 RkM={pk,1,pk,2,...,pk,||RkM||} R M k = { p k , 1 , p k , 2 , . . . , p k , | | R M k | | } 是第k个区域 RkM R M k 的样本集。 ||R|| | | R | | 表示集合的基数,有限集的基数(cardinality )就是传统概念下的“个数”。 μ(RkM) μ ( R M k ) 是每部分的均值:
最后的分割个数n由 δ(⋅) δ ( ⋅ ) 决定,如果 δ δ 小于某个阈值则迭代终止。阈值可以根据噪声分布来确定。
算法流程
输入:K部分的RAG,K-RAG
迭代 util min(δ)>=Treshold m i n ( δ ) >= T r e s h o l d
- (K-i)-RAG的边集合中找到最相似的边( δ δ 最小)
- 融合最相似边对应的两个区域顶点,得到(K-i-1)-RAG
- 更新顶点和边集合
输出:(K-n)-RAG
实例
处理步骤:
1. 对输入图像进行平滑滤波
2. 求梯度图像,对梯度进行阈值
3. 分水岭分割
4. 区域融合
对此算法来说,梯度图像的阈值,影响着区域融合的效果和计算时间。更大的阈值意味着分水岭分割后区域个数越少,计算速度越快。但是过大的阈值会丢失边缘轮廓。
% 读取图像
I=imread('cameraman.tif');
% 估计图像的噪声方差
varn=EstimaOfNoise(I);
% 图像平滑,目的是减少较小的尺寸区域
h=fspecial('average',[3 3]);
SI=imfilter(I,h);
figure,imshow(SI);title('smoothed Image');
% 求梯度图像
h1=[-1,0,1];
h2=h1';
Ix=imfilter(double(SI),h1,'replicate');
Iy=imfilter(double(SI),h2,'replicate');
gradmag = sqrt(Ix.^2 + Iy.^2);%求模
figure,imshow(gradmag./max(gradmag(:)));title('gradient Image');
% candidate egde pixels which is regional maxima
CanI=imregionalmax(gradmag)
% 调整梯度图像,只平滑非candidate egde pixels
h=fspecial('average',[3 3]);
Gs=imfilter(gradmag,h);
Gs(CanI~=0)=gradmag(CanI~=0);
% 阈值梯度图像
bw=zeros(size(I));
T=10*sqrt(varn);
bw(Gs>T)=gradmag(Gs>T);
figure,imshow(bw);title('bw')
% 分水岭分割
label=watershed(bw);
RGBLabel=label2rgb(label);
figure,imshow(RGBLabel);
title(' watershed with treshold Image of gradient Image');
% 基于最近邻图的区域融合
Rlabel=RegionMerging(I,label,1000,2);
RGBRlabel=label2rgb(Rlabel);
figure,imshow(RGBRlabel);title('watershed segment after RegionMerging');
初始分水岭分割结果如图所示
区域融合后的结果如图所示
参考文献
[1]. Haris K, Efstratiadis S N, Maglaveras N, et al. Hybrid image segmentation using watersheds and fast region merging.[J]. IEEE Transactions on Image Processing A Publication of the IEEE Signal Processing Society, 1998, 7(12):1684-1699.