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 。每个顶点节点代表一个区域,边表示和邻近区域相连,边权重就是两个区域之间的相似度,如图所示:
很自然的我们会想到用两个邻近区域的均值的距离来衡量相似性,距离越小越相似,不相邻的区域我们直接令相似度为无穷大。但是不同区域的个数不同,对于较小的区域我们倾向于将它和近邻融合,因而我们将区域的个数的信息作为权重来调整相似度。
因此相似度的计算方式定义如下:
输入:K部分的RAG,K-RAG
迭代 util min(δ)>=Treshold m i n ( δ ) >= T r e s h o l d
输出:(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.