分水岭算法及相应处理
2016-05-29 18:39
323 查看
matlab中分水岭函数并不能直接得到想要的分割结果。网络上有下面三种处理方式:
代码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);
上述的第三种方法为最优方法,不过还是会由于背景的不均匀造成大量的误分割。在做该部分内容时,基于图像重建来去除噪声并进行保留细节特征。代码如下:
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);
代码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);
上述的第三种方法为最优方法,不过还是会由于背景的不均匀造成大量的误分割。在做该部分内容时,基于图像重建来去除噪声并进行保留细节特征。代码如下:
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);
相关文章推荐
- jps,jmap,jstack等一系列jdk tools的实现原理.
- 常见问题及对策之如何对齐多个对象
- 术语的解释(二)
- 设计模式之策略模式
- bzoj 1503: [NOI2004]郁闷的出纳员 treap
- JavaScript---网络编程(1)-介绍、变量、运算符与语句
- JavaScript---网络编程(1)-介绍、变量、运算符与语句
- 一个操作系统的实现(8)-进一步体会分页机制
- OS X系统下安装PHP开发环境
- javascript中的立即执行函数
- Linux的chattr与lsattr命令详解
- 从零开始学_JavaScript_系列(22)——dojo(9)(表单、JsonRest的post方法,widget的使用思路)
- 高级I/O-----socketpair
- Nesterov's method
- 数据抓包(网络爬虫)-正方教务管理系统登录后获取自己的课程表
- 一个操作系统的实现(7)-获取机器内存并进行合理分页
- 【R语言学习】split函数
- 另一份Java应用调优指南之-工具篇
- NS3—LB(负载均衡)
- javascript+Java 实现MD5加密登录密码