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

举报
海神之光 发表于 2022/05/29 04:04:07 2022/05/29
【摘要】 一、图像分割简介 理论知识参考:【基础教程】基于matlab图像处理图像分割【含Matlab源码 191期】 二、部分源代码 clear; close all; %-----------------...

一、图像分割简介

理论知识参考:【基础教程】基于matlab图像处理图像分割【含Matlab源码 191期】

二、部分源代码

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

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

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

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

Filled_Image_BW = bwfill(Reverse_Image_BW,'holes');
subplot(336) 
imshow(Filled_Image_BW);
title('已填充背景色的二进制图像');
%第七步:对图像进行开运算,去掉细胞与细胞之间相粘连的部分
SE = strel('disk',10);
BW = imopen(Filled_Image_BW,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])) >(dd*2)
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.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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242

三、运行结果

在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]赵勇,方宗德,庞辉,王侃伟.基于量子粒子群优化算法的最小交叉熵多阈值图像分割[J].计算机应用研究. 2008,(04)

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/115267588

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。