close

、點擊下方卡片,關注「新機器視覺」公眾號

重磅乾貨,第一時間送達


完整代碼已經上傳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—
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()