图像作业-细胞个数matlab

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

K均值聚类、分水岭算法计算图片中红白细胞个数K均值聚类1、任取[0,255]中K个值作为第一次分类中心2、把图像(gray)中的每一个点与K个中心值进行比较,按差值分成K组,求出新的K个中心点3、重复上一步骤4、按最后得到的中心点把图像依据点到中心点的距离分成K类。程序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)fori=1:mforj=1:nc=abs(I(i,j)-cen);%c为I中元素与各中心点的差值数组cc=find(min(c)==c);%cc为距中心值最近的元素下标J(i,j)=cc;endend%求新的中心点forr=1:kh=0;[J1,J2]=find(J==r);p=length(J1);fors=1:ph=h+I(J1(s),J2(s));copy(J1(s),J2(s))=cen(r);%按中心值K类endcen1(r)=h/p;endif(abs(cen1-cen)=d)break;elsecen=cen1;endendK均值聚类、分水岭算法总程序I=imread('blood.jpg');%读入处理图像R=I(:,:,1);%分离R分量G=I(:,:,2);B=I(:,:,3);clc;%清屏closeall;%关闭图像窗口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);%把聚类后图像二值化fori=1:mforj=1:nifA(i,j)==cenwhite(2)A(i,j)=1;elseA(i,j)=0;endendendsubplot(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);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);%把聚类后图像二值化fori=1:mforj=1:nifH(i,j)==cenred(2)H(i,j)=1;elseH(i,j)=0;endendendsubplot(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连通运算numfigure,subplot(1,2,1),imshow(J,[]),title('红细胞8连通结果');sum=0;%定义sum为总面积变量numred1=0;%定义numred1为红细胞个数变量fori=1:num[J1,J2]=find(J==i);%找出J中值为i的像素坐标分别存入J1,J2中area(i)=length(J1);%area(i)为第i个红细胞的面积sum=sum+area(i);%面积累加endave=sum/num;%求红细胞的平均面积avefori=1:num%通过面积比较if0.5*avearea(i)&&area(i)=1.5*avenumred1=numred1+1;%如果细胞区域的面积在0.51.5倍之间胞endif1.5*avearea(i)&&area(i)=2.5*avenumred1=numred1+2;%如果细胞区域的面积在1.52.5倍之间细胞endif2.5*avearea(i)&&area(i)=3.5*avenumred1=numred1+3;%如果细胞区域的面积在2.53.5倍之间细胞endendnumred1;%查看面积法得到的红细胞个数numred1%方法二%D=bwdist(~G);D=-D;D(~G)=-Inf;L=watershed(D);rgb=label2rgb(L,'jet');subplot(1,2,2),imshow(rgb,[]),title('红细胞分水岭算法结果');numred2=max(max(L))-1;numred2;%查看分水岭算法得到的红细胞个数numred2%为缩小误差%NumRed=floor((numred1+numred2)/2);%floor()为向上取整。相关函数有ceil()向上取整,round()四舍五入。NumRed;%查看最终得到的红细胞个数NumRed程序运行结果R分量G分量B分量H分量S分量V分量H分量K均值聚类结果白细胞二值化结果白细胞去噪结果法一白细胞4连通结果法二白细胞分水岭结果红细胞图H分量红细胞图S分量红细胞图V分量S分量K均值聚类结果红细胞二值化结果红细胞填洞结果红细胞去噪结果红细胞8连通结果红细胞分水岭算法结果白细胞红细胞

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功