最佳答案
本身代码没什么问题,你将下面的代码段存为 duhe.m 文件
然后在命令行运行下面的代码
|
5 条回复
本身代码没什么问题,你将下面的代码段存为 duhe.m 文件
然后在命令行运行下面的代码
|
可以加一下你的联系方式吗?有些问题问比较方便! |
寒江雪cxl 发表于 2018-4-4 09:44 有问题在论坛发帖就可以了,这里牛人很多的。他们看到会回复你的。 另外,请你了解下这个帖子:你知道如何正确提问么?请使用“最短代码-错误重现”方式,他会使你更好的获得帮助。 希望你能在这里收获,在这里成长! |
matlabzhanghu 发表于 2018-4-4 10:22 I=imread('blood.jpg'); % 读入处理图像 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); 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.5*ave<area(i) && area(i)<=1.5*ave numred1=numred1+1; % 如果细胞区域的面积在0.51.5倍之间视为一个细胞 end if 1.5*ave<area(i) && area(i)<=2.5*ave numred1=numred1+2; % 如果细胞区域的面积在1.52.5倍之间视为两个细胞 end if 2.5*ave<area(i) && area(i)<=3.5*ave numred1=numred1+3; % 如果细胞区域的面积在2.53.5倍之间视为三个细胞 end end numred1; % 查看面积法得到的红细胞个数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 程序运行结果 运行结果少了最终结果图,能帮我看看吗? |
Powered by Discuz! X3.4
© 2001-2021