标记分水岭分割算法 如果图像中的目标物体是连接在一起的,则分割起来会更困难,分水岭分割算法 经常用于处理这类问题,通常会取得比较好的效果。分水岭分割算法把图像看成 一幅“地形图”,其中亮度比较强的区域像素值较大,而比较暗的区域像素值较 小,通过寻找“汇水盆地”和“分水岭界限”,对图像进行分割。 直接应用分水岭分割算法的效果往往并不好,如果在图像中对前景对象和背景对 象进行标注区别,再应用分水岭算法会取得较好的分割效果。基于标记控制的分 水岭分割方法有以下基本步骤: 1.计算分割函数。图像中较暗的区域是要分割的对象。 2.计算前景标志。这些是每个对象内部连接的斑点像素。 3.计算背景标志。这些是不属于任何对象的像素。 4.修改分割函数,使其仅在前景和后景标记位置有极小值。 5.对修改后的分割函数做分水岭变换计算。 使用MATLAB 图像处理工具箱 注:期间用到了很多图像处理工具箱的函数,例如fspecial、imfilter、watershed、 label2rgb、imopen、imclose、imreconstruct、imcomplement、imregionalmax、 bwareaopen、graythresh 和imimposemin 函数等。 第一步:读入彩色图像,将其转化成灰度图像 clc; clear all; close all; rgb = imread('Sunset.jpg'); if ndims(rgb) == 3 I = rgb2gray(rgb); else I = rgb; end figure('units', 'normalized', 'position', [0 0 1 1]); subplot(1, 2, 1); imshow(rgb); title('原图'); subplot(1, 2, 2); imshow(I); title('灰度图'); 第2 步:将梯度幅值作为分割函数 使用Sobel 边缘算子对图像进行水平和垂直方向的滤波,然后求取模值,sobel 算子滤波后的图像在边界处会显示比较大的值,在没有边界处的值会很小。 hy = fspecial('sobel'); hx = hy'; Iy = imfilter(double(I), hy, 'replicate'); Ix = imfilter(double(I), hx, 'replicate'); gradmag = sqrt(Ix.^2 + Iy.^2); figure('units', 'normalized', 'position', [0 0 1 1]); subplot(1, 2, 1); imshow(I,[]), title('灰度图像') subplot(1, 2, 2); imshow(gradmag,[]), title('梯度幅值图像') 可否直接对梯度幅值图像使用分水岭算法? L = watershed(gradmag); Lrgb = label2rgb(L); figure('units', 'normalized', 'position', [0 0 1 1]); subplot(1, 2, 1); imshow(gradmag,[]), t...