matlab利用图像处理手段进行细胞计数

以前没有关注这方面的内容,因为本身与医学也相差万里。总是不理解为什么女朋友每天实验会那么辛苦,原来会经常数数以万计的细胞。大致了解了下一般采用的是PS、Image J等手段来进行细胞计数,但也都会出现不同程度的误差。所以就想着从图像处理的角度去尝试下,网上也已经有一些相关的利用MATLAB编写的代码。

一般来说利用图像处理的手段可以分为以下几个步骤:

  1. 图像格式的转换,及RGB图像转化为GRAY图像,这步大家都了解的;
  2. 然后进行图像的分割,中间会利用一些形态学处理方式,主要思想就是先进行膨胀扩大细胞边缘,然后进行腐蚀取反以确定细胞核的位置,之后采用分水岭算法将连接的细胞分割开;
  3. 对图像进行高斯滤波使图像变得模糊,细胞核相对于细胞边缘颜色较深,突出显示细胞核位置;
  4. 对图像进行锐化获得细胞的轮廓位置信息并进行边沿去除操作;
  5. 通过中值滤波之后对检测到的细胞进行编号。

matlab利用图像处理手段进行细胞计数_第1张图片

 

matlab利用图像处理手段进行细胞计数_第2张图片

matlab利用图像处理手段进行细胞计数_第3张图片

matlab利用图像处理手段进行细胞计数_第4张图片

用上面两幅图验证了下,结果还不错,具体是什么细胞我也不是很清楚。中间会有几个参数对结果有一定的影响,图像分割时的灰度阈值由大津法产生,高斯滤波是sigma设为3,其中对最终结果影响最大的是中值滤波的模板大小,通常情况下设置为13较为合理,可以适当的根据图像中细胞数量的多少进行调节。排列较密集时可以适当降低模板大小,对于细胞中心部分和边沿部分变现差异很小且散布集中的细胞处理有一定的难度。班门弄斧了,希望大家指点吐槽,但不接受人身攻击。

clc;close all;clear all;
origin_img=imread('C:\Users\Administrator\Desktop\大黄\1.png'); 
subplot(2,3,1);imshow(origin_img);title('原始图像');
[m,n]=size(origin_img);
img=rgb2gray(origin_img);%灰度
B=origin_img(:,:,3);
B_gray=im2double(B);
level=graythresh(B_gray);
B_bw=im2bw(B_gray,level);
show_img1=B_bw;
subplot(2,3,2);imshow(show_img1);title('灰度图像');
D=-bwdist(~show_img1);
mask=imextendedmin(D,2);
D2=imimposemin(D,mask);
Ld=watershed(D2);
Water_splited=show_img1;
Water_splited(Ld==0)=0;
show_img1=Water_splited;
subplot(2,3,3);imshow(show_img1);title('分割后图像');
sigma=3;
gausFilter=fspecial('gaussian',[5,5],sigma);
Mod=imfilter(img,gausFilter,'replicate');%高斯滤波
subplot(2,3,4);imshow(Mod);title('模糊图像');
lamda=1;
img2=(img-lamda*Mod)/(1-lamda);
subplot(2,3,5);imshow(uint8(img2));title('锐化后图像');%锐化后图像
img3=imclearborder(img2,8);
subplot(2,3,6);imshow(uint8(img3));title('去除边缘图像');%锐化后图像
% % BW = imregionalmin(img3,8);%最小连通区域
% P=BW+5;
% % img4 = bwareaopen(img3,P,8);%删除小于P后的图像
% imwrite(uint8(img2),'leansharpe.jpg');
K=imnoise(img3,'salt & pepper',0.005);%加入椒盐噪声
n2=12;%中值滤波的模板的大小
I=im2bw(K);
Y3=medfilt2(K,[n2 n2]); %调用系统函数进行中值滤波,n2为模板大小 
[L,num] = bwlabel(Y3,8);
STATS1=regionprops(L,'Perimeter'); 
ahe=size(STATS1);
figure(2);imshow(origin_img);
m1=ahe(1,1);
m=zeros(2,m1); 
for i=1:m1
  % 计算目标区域中心,用于显示编号的位置
  [p,q]=find(L==i);
  temp=[p,q];   
  [x,y]=size(temp);
  m(1,i)=sum(p)/x;
  m(2,i)=sum(q)/x;
end
for i=1:m1
  figure(2);
  text(m(2,i),m(1,i),int2str(i),'FontSize',12,'color','red','LineWidth',10)
end
num

 

 

 

 

 

 

你可能感兴趣的:(matlab利用图像处理手段进行细胞计数)