实例背景
为了帮助医生减少重复性工作,对肺部CT图像进行计算机辅助检测的技术被广泛应用于肺癌的诊断和治疗过程中。而图像处理是应用在,对CT图像中医生所关注的区域进行精确的分割和定位。因此需要选择一种合适的图像分割算法。
这里我们选择分水岭分割的方法。该方法可以有效地提取图像中我们所关注的区域。在灰度图像中使用分水岭方法可以将图像分割成不同的区域,每个区域就可能对应一个我们所关注的对象。对于这些图像的子区域可以进行进一步的处理。除此之外,分水岭方法还可以提取目标的轮廓等特征。
分水岭算法
分水岭算法以数学形态学图像处理为基础,属于基于区域的图像分割算法。这种思想来源于地形学。
“集水盆地”
假设将一幅图像看作一个立体的地形表面,且图像中每个像素点的海拔高度由该点的灰度值表示,则图像中的每个局部极小值和它的影响区域被称为集水盆地。
“山脊”
图像的边缘灰度值变化幅度较大,对应于集水盆地的边界,即地形学中的山脊
“山坡”
图像的边缘位置扫描到灰度极小值点的渐变过程具有坡度的特点,因此被称为山坡。
过度分割问题
分水岭变换的目标是求出梯度图像的“分水岭线”,传统的差分梯度算法对近邻图像做差分运算,容易受到噪声和量化误差等因素的影响,往往会在灰度均匀的区域产生过度的“谷底”,这些在分水岭变换中就对应于“集水盆地”。因此,传统梯度算法最终将导致出现“过分割”的现象,即一个灰度均匀的区域可能被过度分成多个子区域,以致产生大量的虚假边缘,从而对算法的准确性造成影响。
解决上述问题的方法
标记分水岭分割算法
基于标记的分水岭分割算法能有效控制过分割现象的发生,该算法的标记包括内部标记和外部标记。其基本现象是通过引入标记来修正梯度图像,使得局部最小值仅出现在标记的位置,并设置阈值h来对像素值进行过滤,删除最小值深度小于阈值h的局部区域。
代码实现
分水岭算法的主要目标在于找到图像的连通区域并进行分割。
分割算法
function Watershed_Fun(fileName)
% 分水岭分割入口函数
rgb=imread(fileName);
if ndims(rgb)==3
I=rgb2gray(rgb);
else
I=rgb;
end
sz=size(I);
if sz(1)~=256
I=imresize(I,256/sz(1));
rgb=imresize(rgb,256/sz(1));
end
%y方向边缘提取算子
hy=fspecial('sobel');
%x方向边缘提取算子
hx=hy';
%提取y方向边缘
Iy=imfilter(double(I),hy,'replicate');
%提取x方向边缘
Ix=imfilter(double(I),hx,'replicate');
%计算梯度图像
gradmag=sqrt(Ix.^2+Iy.^2);
%形态学算子
se=strel('disk',3);
%图像开运算
Io=imopen(I,se);%开运算属于形态学图像处理,是先腐蚀后膨胀,作用是:可以使边界平滑,消除细小的尖刺,断开窄小的连接,保持面积大小不变等。
%图像腐蚀
Ie=imerode(I,se);
%图像重建
Iobr=imreconstruct(Ie,I);%imreconstruct:图像的形态学重构
%图像闭
Ioc=imclose(Io,se);
%图像膨胀
Iobrd=imdilate(Iobr,se);
%图像再重建
Iobrcbr=imreconstruct(imcomplement(Iobrd),imcomplement(Iobr));
%图像求反
Iobrcbr=imcomplement(Iobrcbr);
%句柄极大操作
fgm=imregionalmax(Iobrcbr);
%形态学算子
se2=strel(ones(3,3));
%图像闭
fgm2=imclose(fgm,se2);
%图像腐蚀
fgm3=imerode(fgm2,se2);
%图像面积开
fgm4=bwareaopen(fgm3,15);
%二值化
bw=im2bw(Iobrcbr,graythresh(Iobrcbr));
%计算区域距离
D=bwdist(bw);
%分水岭
DL=watershed(D);
%过滤背景
bgm= DL==0;
%处理背景
gradmag2=imimposemin(gradmag,bgm|fgm4);
%分水岭
L=watershed(gradmag);
%标记矩阵加颜色
Lrgb=label2rgb(L,'jet','w','shuffle');
%显示中间过程
h1=figure(1);
set(h1,'Name','图像灰度化','NumberTitle','off');
subplot(1,2,1),imshow(rgb),title('原图像');
subplot(1,2,2),imshow(I),title('灰度图像');
h2=figure(2);
set(h2,'Name','图像形态学操作','NumberTitle','off');
subplot(1,2,1),imshow(Iobrcbr),title('图像形态学操作');
subplot(1,2,2),imshow(bw),title('图像二值化');
h3=figure(3);
set(h3,'Name','图像梯度显示','NumberTitle','off');
subplot(1,2,1),imshow(rgb),title('待处理图像');
subplot(1,2,2),imshow(gradmag),title('梯度图像');
%显示结果
h4=figure(4);
imshow(rgb),hold on;
himage=imshow(Lrgb);
set(h4,'Name','图像分水岭分割','NumberTitle','off');
效果如下
经过分水岭算法分割**正常肺部**CT图像。
1、图像灰度化
2、图像梯度边缘
3、图像二值化
经过分水岭算法分割**右上肺结合**CT图像。
1、图像灰度化
2、图像梯度边缘
3、图像二值化