分水岭算法及相应处理
matlab中分水嶺函數(shù)并不能直接得到想要的分割結(jié)果。網(wǎng)絡上有下面三種處理方式:
代碼1:
filename=‘1.jpg';
f=imread(filename);
f=rgb2gray(f);
b1=im2bw(f,0.6);
out=edge(f,'canny',0.3); ?
se=strel('disk',1);
b=imclose(b1,se);
b=imopen(b,se);
[X,Y]=size(b);
d=bwdist(b);
I=watershed(-d);
w=I==0;
wait=imfill(w,'holes');
g=f;
g2=imimposemin(d,w);
I2=watershed(g2);
g(w)=0;
wait=imopen(wait,se);
imshow(w);
代碼2:
filename='1.jpg';
f=imread(filename);
f=rgb2gray(f);
b=im2bw(f,graythresh(f));
[X,Y]=size(b);
h=fspecial('sobel');
fd=double(f);
g=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);
I=watershed(g);
wr=I==0;
g2=imclose(imopen(g,ones(3,3)),ones(3,3));
I2=watershed(g2);
wr2=I2==0;
f2=f;
f2(wr2)=0;
imshow(f);
代碼3:
filename='1.jpg';
f=imread(filename);
f=rgb2gray(f);
b=im2bw(f,graythresh(f));
[X,Y]=size(b);
h=fspecial('sobel');
fd=double(f);
g=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);
I=watershed(g);
wr=I==0;
rm=imregionalmin(g);
im=imextendedmin(f,50);
lim=watershed(bwdist(im));
em=lim==0;
g2=imimposemin(g,im|em);
I2=watershed(g2);
f2=f;
f2(I2==0)=0;
imshow(f2);
上述的第三種方法為最優(yōu)方法,不過還是會由于背景的不均勻造成大量的誤分割。在做該部分內(nèi)容時,基于圖像重建來去除噪聲并進行保留細節(jié)特征。代碼如下:
clc;
clear;
img=imread('1.jpg');
I=rgb2gray(img);
se = strel('disk', 5);
Ie=imerode(I,se);
Io=imopen(I,se);
subplot(1,2,1);imshow(I,[]);title('gray');
subplot(1,2,2);imshow(Ie);title('腐蝕');
figure;imshow(Io);title('開運算');
Iobr=imreconstruct(Ie,I);
figure;
imshow(Iobr,[]);title('基于開的重建圖像');
Iobrd = imdilate(Iobr, se);
Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));
Iobrcbr = imcomplement(Iobrcbr);
figure;
imshow(Iobrcbr,[]);title('基于開閉操作的重建圖像');
f=Iobrcbr;
%f=rgb2gray(f);
b=im2bw(f,graythresh(f));
%bb=im2bw(ff,graythresh(f));
[X,Y]=size(b);
h=fspecial('sobel');
fd=double(f);
g=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);
I=watershed(g);
wr=I==0;
rm=imregionalmin(g);
im=imextendedmin(f,13);
lim=watershed(bwdist(im));
em=lim==0;
g2=imimposemin(g,im|em);
I2=watershed(g2);
f2=f;
f2(I2==1)=255;
figure;
subplot(1,2,1);imshow(b);
subplot(1,2,2);imshow(f2);
figure;
imshow(I2);
總結(jié)
以上是生活随笔為你收集整理的分水岭算法及相应处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器视觉 · 立体相机
- 下一篇: 人脸识别(通过照片库区别人物)