一、简介

分水岭算法是一种图像区域分割法,分割的过程中将图片转化为灰度图,然后我会将灰度值看作是海拔,然后向较低点注水,这种基于地形学的解释,我们着重考虑三种点:\ \ 极小值点,该点对应一个盆地的最低点,当我们在盆地里滴一滴水的时候,由于重力作用,水最终会汇聚到该点。注意:可能存在一个最小值面,该平面内的都是极小值点。\ 盆地的其它位置点,该位置滴的水滴会汇聚到局部最小点。\ 盆地的边缘点,是该盆地和其它盆地交接点,在该点滴一滴水,会等概率的流向任何一个盆地。\ \ 明白上述三种点之后,我们开始往盆地的极小值点注水,然后随着注水的深入,每一个极小值点慢慢的向外扩展,然后知道两个盆地的水汇合,汇合处就是我们需要的分水岭。

从下图可以直观理解一下,首先这三块区域都含有极小值点\ \ 然后逐渐填充就能获得分水岭(即分界线)\ \ 得到分界线就能完成图像分割:\

二、源代码

``` clear; close all; %------------------ %程序中定义图像变量说明 %Image->原图变量; %ImageBW->二值化图象; %ImageBWmedfilt->中值滤波后的二值化图像; %OptimizedImageBW-〉通过“初次二值化图像”与“中值滤波后的二值化图像”进行“或”运算优化图像效果; %ReverseImageBW-〉优化后二值化图象取反; %FilledImageBW-〉已填充背景色的二进制图像; %OpenImageBW-〉开运算后的图像。 %------------------ %-------------------------------------- %-------图片前期处理------------------- %-------------------------------------- %第一步:读取原图,并显示 a= imread('b1.bmp'); subplot(331) imshow(a); title('原图'); Image=rgb2gray(a); %第二步:进行二值化 Theshold = graythresh(Image);%取得图象的全局域值 ImageBW = im2bw(Image,Theshold);%二值化图象 subplot(332) imshow(Image_BW); title('初次二值化图像');

%第三步二值化图像进行 ImageBWmedfilt= medfilt2(ImageBW,[13 13]); subplot(333) imshow(ImageBW_medfilt); title('中值滤波后的二值化图像');

%第四步:通过“初次二值化图像”与“中值滤波后的二值化图像”进行“或”运算优化图像效果 OptimizedImageBW = ImageBWmedfilt|ImageBW; subplot(334) imshow(OptimizedImageBW); title('进行“或”运算优化图像效果'); %第五步:优化后二值化图象取反,保证:‘1’-〉‘白色’,‘0’-〉‘黑色’ %方便下面的操作 ReverseImageBW = ~OptimizedImageBW; subplot(335) imshow(ReverseImage_BW); title('优化后二值化图象取反');

%第六步:填充二进制图像的背景色,去掉细胞内的黑色空隙

FilledImageBW = bwfill(ReverseImageBW,'holes'); subplot(336) imshow(FilledImageBW); title('已填充背景色的二进制图像'); %第七步:对图像进行开运算,去掉细胞与细胞之间相粘连的部分 SE = strel('disk',10); BW = imopen(FilledImageBW,SE); subplot(337) imshow(BW); title('开运算后的图像');

subplot(338),imhist(Image);

%-----------------------------------------------

%-------------开始计算细胞数--------------------

%-----------------------------------------------

[Label Number]=bwlabel(BW,8)%初步取得细胞个数 Array = bwlabel(BW,8);%取得贴标签处理后的图像 Sum = []; %依次统计贴标签后数组 for i=1:Number [r,c] = find(Array==i);%获取相同标签号的位置,将位置信息存入[r,c] rc = [r c]; Num = length(rc);%取得vc数组的元素的个数 Sum([i])=Num;%将元素个数存入Sum数组 end Sum N = 0; %假如Sum数组中的元素大于了1500,表示有两个细胞相连,像素点较多,即分为两个细胞数 ss=0; for i=1:length(Sum) ss=ss+Sum([i]);

end dd=ss/length(Sum); dd for i=1:length(Sum) if(Sum([i]))>dd N = N+1; end if(Sum([i])) >(dd2) N = N+2; end function [cen,copy]=Kmeans(I,k) % K均值聚类函数 mm=max(max(I)); % mm为I的最大灰度值 copy=I;
cen=(1:k)
mm/k; % 求出首次中心值 cen1=zeros(1,k); d=ones(1,k)./255; [m,n]=size(I); J=zeros(m,n); while(1) for i=1:m for j=1:n c=abs(I(i,j)-cen); % c为I中元素与各中心点的差值数组 cc=find(min(c)==c); % cc为距中心值最近的元素下标 J(i,j)=cc; end end % 求新的中心点 for r=1:k h=0; [J1,J2]=find(J==r); p=length(J1); for s=1:p h=h+I(J1(s),J2(s)); copy(J1(s),J2(s))=cen(r); % 按中心值,把原图像灰度分为K类 end cen1(r)=h/p; end if (abs(cen1-cen)<=d) break; else cen=cen1; end end

I=imread('b.bmp'); % 读入处理图像 R=I(:,:,1); % 分离R分量 G=I(:,:,2); B=I(:,:,3); clc; % 清屏 close all; % 关闭图像窗口 figure, % 开辟图像显示窗口 subplot(2,3,1),imshow(R),title('R分量'); subplot(2,3,2),imshow(G),title('G分量'); subplot(2,3,3),imshow(B),title('B分量'); K=rgb2hsv(I); % RGB图像转换成HSV图像 H=K(:,:,1); S=K(:,:,2); V=K(:,:,3); subplot(2,3,4),imshow(H),title('H分量'); subplot(2,3,5),imshow(S),title('S分量'); subplot(2,3,6),imshow(V),title('V分量');

%********* 白细胞计数 ********* % 分割出只有白细胞的二值图像 [cenwhite,copywhite]=Kmeans(H,3); % K均值聚类函数调用
cenwhite % 查看聚类后的中心值 figure, subplot(1,3,1),imshow(copywhite,[ ]),title('H分量K均值聚类结果'); A=copywhite; [m,n]=size(A); % 把聚类后图像二值化 for i=1:m for j=1:n if A(i,j)==cenwhite(2) A(i,j)=1; else A(i,j)=0; end end end subplot(1,3,2),imshow(A,[ ]),title('白细胞二值化结果'); C1=imdilate(A,ones(5)); % 对二值化图像腐蚀膨胀处理达到去噪效果 C2=imerode(C1,ones(11)); C=imdilate(C2,ones(6)); subplot(1,3,3),imshow(C,[ ]),title('白细胞去噪结果');

% 下面两种方法中任选一种作为白细胞计数输出: % 方法一:用4连通分割图像计算白细胞个数 L4=bwlabel(C,4); % 4连通运算 figure,subplot(1,2,1),imshow(L4,[ ]),title('法一:白细胞4连通结果'); Numwhite=max(max(L4)); % 计算4连通后图像中的最大值,即为白细胞个数 Numwhite % Numwhite为4连通计数结果,显示结果

% 方法二:用分水岭算法分割图像计算白细胞个数 % E=bwdist(~C); E=-E; E(~C)=-Inf; L0=watershed(E); rgb=label2rgb(L0,'jet'); subplot(1,2,2),imshow(rgb,[ ]),title('法二:白细胞分水岭结果'); NumWhite=max(max(L0))-1;
NumWhite % NumWhite为分水岭算法计数结果,显示结果

%********* 红细胞计数 ******** % 分割出只有红细胞的二值图像,并对其做必需处理 I1(:,:,1)=double(I(:,:,1)).C; % 把二值图像还原为彩色图像 I1(:,:,2)=double(I(:,:,2)).C; I1(:,:,3)=double(I(:,:,3)).C; figure,subplot(1,2,1),imshow(uint8(I1)),title('白细胞'); J=double(I)-double(I1); % 原图减去白细胞图得红细胞彩图 subplot(1,2,2),imshow(uint8(J)),title('红细胞'); J=rgb2hsv(J); % 红细胞图转换成HSV图 HH=J(:,:,1); SS=J(:,:,2); % 提取S分量 VV=J(:,:,3); figure, subplot(1,3,1),imshow(HH),title('红细胞图H分量'); subplot(1,3,2),imshow(SS),title('红细胞图S分量'); subplot(1,3,3),imshow(VV),title('红细胞图V分量'); [cenred,copyred]=Kmeans(SS,2); % 对S分量图均值聚类 cenred % 查看聚类后的中心值 figure,subplot(2,2,1),imshow(copyred,[ ]),title('S分量K均值聚类结果'); H=copyred; [m,n]=size(H); % 把聚类后图像二值化 for i=1:m for j=1:n if H(i,j)==cenred(2) H(i,j)=1; else H(i,j)=0; end end end subplot(2,2,2),imshow(H,[ ]),title('红细胞二值化结果'); G=imfill(H,'holes'); % 红细胞图填充孔洞 subplot(2,2,3),imshow(G,[ ]),title('红细胞填洞结果'); C1=imerode(G,ones(9)); % 开运算去除噪声 G=imdilate(C1,ones(9)); subplot(2,2,4),imshow(G,[ ]),title('红细胞去噪结果');

% 方法一:通过判断面积大小计算红细胞个数 [J,num]=bwlabel(G,8); % 8连通运算,保存区域个数num figure,subplot(1,2,1),imshow(J,[ ]),title('红细胞8连通结果'); sum=0; % 定义sum为总面积变量 numred1=0; % 定义numred1为红细胞个数变量 for i=1:num [J1,J2]=find(J==i); % 找出J中值为i的像素坐标分别存入J1,J2中 area(i)=length(J1); % area(i)为第i个红细胞的面积 sum=sum+area(i); % 面积累加 end ave=sum/num; % 求红细胞的平均面积ave for i=1:num % 通过面积比较,判断个数的增加值 if 0.5aveave numred1=numred1+1; % 如果细胞区域的面积在0.5~1.5倍之间,视为一个细胞 end if 1.5aveave numred1=numred1+2; % 如果细胞区域的面积在1.5~2.5倍之间,视为两个细胞 end if 2.5aveave numred1=numred1+3; % 如果细胞区域的面积在2.5~3.5倍之间,视为三个细胞 end ```

三、运行结果

【细胞分割】基于中值滤波+分水岭法实现细胞计数matlab源码相关推荐

  1. 【细胞分割】中值滤波+分水岭法细胞计数【含Matlab源码 640期】

    ⛄一.图像分割简介 理论知识参考:[基础教程]基于matlab图像处理图像分割[含Matlab源码 191期] ⛄二.部分源代码 clear; close all; %---------------- ...

  2. 【图像去噪】基于中值+小波+维纳+滤波器图像去噪matlab源码含 GUI

    一.简介 1 中值滤波 中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术.它也是一种邻域运算,类似于卷积,但是计算的不是加权求和,而是把数字图像或数字序列中一点的值用该点的一个邻域中 ...

  3. 【细胞分割】基于阙值+边缘+形态学+种子点图像分割matlab源码含 GUI

    一.简介 数学形态学操作可以分为二值形态学和灰度形态学,灰度形态学由二值形态学扩展而来.数学形态学有2个基本的运算,即腐蚀和膨胀,而腐蚀和膨胀通过结合又形成了开运算和闭运算. 开运算就是先腐蚀再膨胀, ...

  4. 【滤波器】基于低通滤波实现肌电信号处理含Matlab源码

    1 简介 FIR数字滤波器是数字滤波器系统中常见的滤波器,本文提出FIR数字滤波器的设计方案,并基于Ma tlab实现滤波仿真.通过使用Matlab信号处理工具箱提供的函数,选择适当的窗函数编写程序, ...

  5. 轨迹系列2——一种基于中值滤波的轨迹纠偏方法和几点思考

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在无路网的情况下,如何进行轨迹纠偏也是一个很多人在研究的内容, ...

  6. 【图像融合】基于matlab导向滤波图像融合【含Matlab源码 1959期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像融合]基于matlab导向滤波图像融合[含Matlab源码 1959期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  7. matlab三维路径规划,【路径规划】基于A星算法的三维路径规划matlab源码

    %% 该函数用于演示基于A_Star算法的三维路径规划算法 %% 清空环境 clc clear %% 数据初始化 %下载数据 starttime=cputime; load HeightData z ...

  8. 超入门级-基于中值滤波处理ECG信号的基线漂移-Python-MIT-BIH数据集

    中值滤波处理心电信号的基线漂移 距离上次发东西已经8个月,我已经本科毕业成为了一名研究生,但是我已经暂时弃硬从软,暂时开始做深度学习方向了,这篇文章就算一个我研究生学习的第一次笔记分享,我也会争取写的 ...

  9. 基于中值滤波与小波变换的图像去噪声实现

    目录 绪论 1 1.1引言 1 1.2. 图像去噪的研究现状 1 1.3图像去噪算法的发展趋势 2 1.4 本文的研究内容及组织结构 2 图像去噪的理论及常用方法 4 2.1图像中的噪声 4 2.2 ...

  10. 中值滤波去除图像噪声的matlab程序

    中值滤波:基于排序理论的一种能有效抑制噪声的非线性信号处理技术. 方法:取含有基数(偶数会有半像素的差)个模板数据的滑动模板,对模板中的数据从小到大排序,取排在中间位置上的数据作为最终的处理结果. m ...

最新文章

  1. c# SerialPort会出现“已关闭 Safe handle”的错误
  2. Linux select TCP并发服务器与客户端编程
  3. hadoop2 5个环境配置文件
  4. feign 能干什么:
  5. Python 和 R 数据分析/挖掘工具互查
  6. springboot jar包部署_Spring Boot项目基于Jar部署和打包详解教程
  7. 暑假周进度总结报告8
  8. autohotkey 双击
  9. UMLChina建模竞赛第3赛季第7轮:假烟假酒假朋友,假情假意假温柔
  10. python烤地瓜实例(深入理解面向对象编程)
  11. 自动化测试遇到的难点_自动化测试不成功的原因和实施过程中存在的问题
  12. Docker可视化工具 DockerUI 和 Shipyard 的区别
  13. 应用集成——数据库集成与简单实现IoC容器
  14. 支付宝周期扣款Java逻辑代码
  15. 笔记本修改无线网卡MAC地址
  16. android11.0 Launcher3 高端定制之循环滑动
  17. JVM第四篇之益处、常用java工具
  18. 福禄克线缆测试的PATCH CORD和CHANNEL是什么
  19. 国外超稳定网盘使用教程-DropBox网盘
  20. linux 性能测试 跑分,Tiger Lake i7-1165G7 Linux性能测试:软件版本组合对跑分影响较大...

热门文章

  1. HTML 前后端分离,再谈前后端分离开发和部署
  2. 推荐基于.NetCore一款高性能敏感词检测开源库
  3. python notebook两个窗口_JupyterNotebook 输出窗口的显示效果调整实现
  4. html投影电脑,如何将电脑内容显示到投影仪或电视上?详细教程奉上
  5. 解决应用MSBuild编译项目没有拷贝间接引用的dll题目
  6. Vue.js开发基础 05
  7. 各类学科入门书籍推荐
  8. HTML实现圆形头像效果
  9. 第09篇:Spring处理Mybatis事务
  10. mysql max() grou by 的使用小记