以前没有关注这方面的内容,因为本身与医学也相差万里。总是不理解为什么女朋友每天实验会那么辛苦,原来会经常数数以万计的细胞。大致了解了下一般采用的是PS、Image J等手段来进行细胞计数,但也都会出现不同程度的误差。所以就想着从图像处理的角度去尝试下,网上也已经有一些相关的利用MATLAB编写的代码。
一般来说利用图像处理的手段可以分为以下几个步骤:
用上面两幅图验证了下,结果还不错,具体是什么细胞我也不是很清楚。中间会有几个参数对结果有一定的影响,图像分割时的灰度阈值由大津法产生,高斯滤波是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