首页 文章详情

Matlab 图形处理 || 对细胞进行计数、求面积等操作~~方法与应用

新机器视觉 | 816 2022-05-15 05:31 0 0 0
UniSMS (合一短信)

、点击下方卡片,关注“新机器视觉”公众号

重磅干货,第一时间送达

完整代码已经上传github:

https://github.com/ImageVisioner/Matlab_ImageProcessing_cell.git


各位撇学生,这次是真的好久不见啦,我是小刘老师。今天的任务是教会大家利用Matlab对大肠杆菌细胞进行计数这是一个非常基础的图像任务,利用Matlab能够快速的实现。

先看看我们今天要处理的图像长什么样子:

Ecoli=imread('Ecoli.png')imshow(Ecoli),title('Ecoli Image');

其中绿色部分为大肠杆菌红色部分为其他杂质


  去除红色杂质细胞  

在这里我们的思路是将原图转换到HSV空间,新建一个黑色背景,将绿色的大肠杆菌复制到黑色背景里面。

Ecoli_hsv = rgb2hsv(Ecoli);%转到hsv空间% 创建一个黑色的背景flagnew = zeros(size(Ecoli));


在图中找寻绿色的像素

%在图中找寻绿色的像素[row, col] = ind2sub(size(Ecoli_hsv),find(Ecoli_hsv(:,:,1)>0.12...    & Ecoli_hsv(:,:,1)< 0.6 & Ecoli_hsv(:,:,2)>0.16 & Ecoli_hsv(:,:,3)>0.18));

遍历循环到黑色背景中
%遍历循环到黑色背景中for k = 1 : length(row)    flagnew_hsv(row(k),col(k),:) = Ecoli_hsv(row(k),col(k),:);end


最重要的是将图像从hsv转到rgb空间:

Ecoli_green = hsv2rgb(flagnew_hsv);

看看这提取效果,我都要啧啧称赞

  图像的预处理操作  

阈值操作:
level = graythresh(Ecoli_green);disp(level)

转到灰色空间并二值化:
Ecoli_green_gray=rgb2gray(Ecoli_green)BW_Ecoli_green = imbinarize(Ecoli_green_gray,level);

利用bwareaopen函数删除小于指定面积的连通域,用来剔除无用的细胞:
BW_Ecoli_green = bwareaopen(BW_Ecoli_green,15);imshow(BW_Ecoli_green)


利用 bwconncomp - 查找二值图像中的连通分量,默认对二维使用 8连通,对三维使用 26 连通。
colorc = bwconncomp(BW_Ecoli_green,8)

给你的细胞染色看看:
labeled = labelmatrix(colorc );RGB_Ecoli = label2rgb(labeled,'spring','c','shuffle');

边缘检测,与叠加掩膜操作

Ecoli_green_edge=edge(BW_Ecoli_green,'Canny',0.5);double_BW_Ecoli_green=im2double(BW_Ecoli_green)double_Ecoli_green_edge=im2double(Ecoli_green_edge)B=labeloverlay(double_Ecoli_green_edge,double_BW_Ecoli_green)hold on;


  给你的图像进行一些神操作  

把上图染色后的图像进行框选:

%for loopfor k=1:Num_obj    [row,cum] = find(L == k);    rbar = mean(row);    cbar = mean(cum);    plot(cbar,rbar,'marker','S','markeredgecolor','m','markersize',25,'LineWidth',2);end


将计数标在细胞旁边上:

status=regionprops(L,'BoundingBox');centroid = regionprops(L,'Centroid');figure();imshow(L);for i=1:Num_obj    %Number mark    text(centroid(i,1).Centroid(1,1)-15,centroid(i,1).Centroid(1,2)-15, num2str(i),'Color', 'r')end


  计算细胞的一些面积信息 

希望能够得到的信息自动弹出计算了多少个细胞:

box_1 = dialog('Name','Number of targets','position',[580 300 220 100]);uicontrol('Style','text','units','pixels','position',[45 40 120 50],'fontsize',15,'parent',box_1,'string',strcat("The number of cell:",num2str(Num_obj)));uicontrol('units','pixels','position',[80 10 50 20],'fontsize',15,'parent',box_1,'string','OK','callback','delete(gcf)');



82个细胞,如果想每个都各个统计太费时间啦。我们试着利用在命令行输入需要计算那个细胞的面积和其他信息就算哪个,不就可以了
input_num=int32(input("please input number:\n"))
if input_num>Num_obj ||input_num<=0 errordlg("Please enter the correct integer!") else input_num<=Num_obj ||input_num>0 image_part=(copy_mark_L==input_num) part=regionprops(image_part,'Area') %Please note: the unit is pixel square disp(part.Area) end

我们就可以得到编号为1的像素面积值了。

本文仅做学术分享,如有侵权,请联系删文。


—THE END—
good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter