认知与分析分享 http://blog.sciencenet.cn/u/AlecXu 为创造价值而奋斗

博文

技术博客——荧光染色细胞照片批处理 精选

已有 20703 次阅读 2013-5-14 21:57 |个人分类:程序分享|系统分类:科研笔记|关键词:学者| 图片处理, 细胞荧光染色

      这应该算是我到科学网写文章的第一篇纯技术性的博客。秉着知识共享的原则,我把自己写的代码贡献出来。今后我也可能会断断续续地在这里发表一些没有保密必要的代码,以方便刚好有这些需要的人。

      这次公布的代码是用来给荧光染色的细胞数量做统计的。我自己的研究工作其实用不上这个,是我一个合作者在另一个我没有参与的研究项目中产生的需要,文章已经被接收,但是是审稿人提出的其中一个要求,因为涉及到对比不同的细胞种类的区别,需要对细胞数量做统计。因为周四就要交稿,人工去数是太费事了,所以她让我帮个忙。事实上有些开源软件已经可以实现这样的功能,比如生物成像领域里常用的ImageJ,下载个专门的插件就可以了。ImageJ 的图形界面 (GUI)很好,但是如果要对照片进行批处理的话,就需要使用macro语言,虽然也未必有多难学,不过我对ImageJ 了解十分有限,与其花时间学习怎么在ImageJ 里程序,不如用我更熟悉的MATLAB来处理了。当然网上也能找到一些有着具体步骤介绍如何使用MATLAB解决相关问题的网页,比如Steve Eddins的写的一篇技术博客对我帮助就不小,其网址是:http://blogs.mathworks.com/steve/2006/06/02/cell-segmentation/ 只是他提供的内容不能完全满足我的需要,比如他没有提供我最需要的做细胞统计的功能。

       下面我给出我用MATLAB写的代码,并在给出一些注解,说明我的需要和语句的功能。

clc; close all; clear all;
cd 'Y:PeopleLeidatacell-counting'; % 转到图片保存的文件夹
list=dir(pwd); % 对该文件夹下所有文档做列表
FileNames={list(~[list.isdir]).name}; % 自动提取文件夹内所含所有文档的文件名
Num_file=length(FileNames); % 计算文件夹内所有文件的数量
FileNameStr=regexp(FileNames,'_','split'); % regexp适用于找文件名中惯常使用的命名模式,这个因人而异。

%说明一下,我的图片命名都是5个字母序列,后接3个数字,然后是下横杠,下横杠后又是字母加数字。

%上面的那个语句是把图片名称当中横杠前后的两部分分开,以供使用。

fileID = fopen('summary.txt','w'); % 对细胞计数的结果最终都会写入到专门建立的txt文档里去
header = cell(1,4); %下面这几个带header字样的都用于报告最终统计结果,这里我一共分四列,因需要而异。
header{1,1}='Cell_type';
header{1,2}='Pic_num';
header{1,3}='Depth';
header{1,4}='Num_cell';
fprintf(fileID, '%st%st%st%sn', header{1},header{2},header{3},header{4});
for i=1:Num_file
   LetterStr = FileNameStr{i}{1}(1:5); % 截取图片名称中下横杠前的最前面的5个字母
   NumStr = str2double(FileNameStr{i}{1}(6:8)); % 截取5个字母后面的三个数字
   depth =  str2double(FileNameStr{i}{2}(isstrprop(FileNameStr{i}{2},'digit'))); %截取下横杠后面的字符中的数字
   I=imread(FileNames{i}); %按图片顺序读取照片
   imb = I(:,:,3);% 原图片是RGB三色图,我专门选择显示细胞核DAPI染色的蓝色通道用于计算细胞数量
   imbw = im2bw(imb,graythresh(imb)); % 根据图片自身亮度计算一个阀值,把图片转成黑白色图片。
   imbw_fill = imclose(imbw, ones(5,5)); %这个和其下的一个操作用于去除细胞核没有被染上色的空洞
   imbw_fill = imfill(imbw_fill, 'holes');
   figure,
   subplot(1,3,1); % subplot用于在同一个figure下显示多个不同的图片,这里设定为三列。
   imshow(I); %显示原图,对应下面左边的图片。
   subplot(1,3,2);
   imshow(imbw); %显示没有给细胞核补洞时的黑白照,对应下面中间的图片
   B = bwboundaries(imbw_fill); %用于找出图片中的细胞核边界
   area = bwarea(imbw_fill); %计算细胞核在图片中所占的总面积(图片中细胞所占的像素总数量)
   area_thre = round(area/length(B))/3; %用于判定物体是否为细胞核的面积阀值,这里取平均面积的1/3
   imbw_cell = bwareaopen(imbw_fill, area_thre);% 小于细胞核平均面积1/3的物体会不会被计算在内
   subplot(1,3,3),
   imshow(imbw_cell); %显示经过补洞和删除了面积过小物体的细胞核图片,对应下面右边的图片。
   R = regionprops(imbw_cell,'BoundingBox'); % 用于圈出细胞核,并在相应位置加上方框。
   NumCell = length(R); %计算细胞核数量
   figure,
   imshow(I), hold on; % 显示原始图片
   for j=1:NumCell
       boxp=R(j).BoundingBox;
       rectangle('position',boxp,'edgecolor','r'); %内嵌的这个循环语句用于在原始图片上绘制圈入细胞核的方框。
   end
   fprintf(fileID,'%st%dt%dt%dn',LetterStr,NumStr,depth,NumCell); %最终的统计结果被依次写入到文档里
end
fclose('all');

------

效果图:

下图为圈出细胞的显微镜图片




https://m.sciencenet.cn/blog-3503-689996.html

上一篇:在中国,学者保持独立思想之困难——以李银河批张艺谋评论为例
下一篇:从今年的欧洲歌唱大赛看瑞典社会

14 徐大彬 孙瑜隆 戴德昌 李宇斌 贺乐 唐凌峰 眭飞 苏光松 杨华磊 李璐 傅蕴德 石浩 biofans rosejump

该博文允许注册用户评论 请点击登录 评论 (9 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-20 04:29

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部