使用分水岭变换的分割
1、使用距离变换和分水岭变换分割二值图像
(1)代码
%使用距离变换和分水岭变换分割二值图像 clc; clear all; close all; f=imread('0.jpg'); figure;imshow(f);title('原图像'); g=im2bw(f,graythresh(f)); %图像二值化 figure;subplot(2,3,1);imshow(g);title('二值图像'); gc=~g; %对图像求补 subplot(2,3,2);imshow(gc);title('二值图像的补'); D=bwdist(gc); %距离变换 subplot(2,3,3);imshow(D);title('距离变换'); L=watershed(-D); subplot(2,3,4);imshow(L);title('分水岭脊线'); w=L==0; subplot(2,3,5);imshow(w);title('分水岭脊线反向'); g2 = g&-w; subplot(2,3,6);imshow(g2);title('和二值图像叠加');
(2)结果
2、使用梯度的分水岭分割
(1)代码
%使用梯度的分水岭分割 clc; clear all; close all; f=imread('0.jpg'); figure;imshow(f);title('原图像'); %% %形态学分水岭变换 h=fspecial('sobel'); %sobel边缘检测 figure;imshow(h);title('sobel'); fd=tofloat(f); %图像转化为浮点型 g=sqrt(imfilter(fd, h, 'replicate') .^ 2 + imfilter(fd, h', 'replicate') .^ 2); %计算梯度 figure;imshow(g);title('梯度'); L = watershed(g); %分水岭线 figure;imshow(L);title('分水岭线'); wr = L == 0; g2 = imclose(imopen(g, ones(3,3)), ones(3,3)); %对梯度图像形态学闭操作 figure;imshow(g2);title('梯度闭操作后'); L2 = watershed(g2); figure;imshow(L2);title('分水岭线2'); wr2 = L2 == 0; f2 = f; f2(wr2) = 255; figure;imshow(f2);title('分割结果');
(2)结果
扫描二维码关注公众号,回复:
11666687 查看本文章
3、控制标记符的分水岭分割
(1)代码
%控制标记符的分水岭分割 clc; clear all; close all; f=imread('0.jpg'); figure;imshow(f);title('原图像'); %% %形态学分水岭变换 h=fspecial('sobel'); %sobel边缘检测 figure;imshow(h);title('sobel'); fd=tofloat(f); %图像转化为浮点型 g=sqrt(imfilter(fd, h, 'replicate') .^ 2 + imfilter(fd, h', 'replicate') .^ 2); %计算梯度 figure;imshow(g);title('梯度'); L = watershed(g); %分水岭线 figure;imshow(L);title('分水岭线'); wr = L == 0; figure;imshow(L);title('分水岭线反向'); %% rm=imregionalmin(g); %计算图像中所有的局部小区域的位置 %im = imextendedmin(f,h) %用函数imextendedmin 来得到内部标记符的集合 %,f 是灰度图像,h 是高度阈值,im 是一幅二值图像,im 的前景像素标记了深的局部小区域的位置 im=imextendedmin(f,2); %计算比近邻点更暗的图像中“低点”集合 fim=f; fim(im)=175; figure;imshow(fim);title('fim'); Lim = watershed(bwdist(im)); %计算内部标记符图像im 的距离变换的分水岭变换 em = Lim == 0; figure;imshow(Lim);title('Lim'); g2 = imimposemin(g, im | em); L2 = watershed(g2); f2 = f; f2(L2 == 0) = 255; figure;imshow(f2);title('最终结果');
(2)结果