统计细胞数量

统计图片中细胞的数量,问题来自于matlab自带的example。

Blob Analysis是对图像中相同灰度值的前景像素进行识别的一种方法。Blob就是灰度值相同的前景像素构成的连通域。Blob分析可为机器视觉应用提供图像中的blobs的数量、位置、形状和方向等信息,还可以提供相关blobs间的几何拓扑结构。
图像分割的结果就是所谓的Blob(binary large objects),在halcon中该数据类型被叫做“区域”。
在特征提取这一步,Blob的像素数,重心,方向等被计算出来。
例: 计算所有灰度值在120和255像素构成的8连通区域的面积与中心坐标。
read_image (Image, 'particle')
threshold (Image, BrightPixels, 120, 255)
connection (BrightPixels, Particles)
area_center (Particles, Area, Row, Column)

Blob翻译成中文,是“一滴”,“一抹”,“一团”,“弄脏”,“弄错”的意思。在计算机视觉中的Blob是指图像中的具有相似颜色、纹理等特征所组成的一块连通区域。显然,Blob分析其实就是将图像进行二值化,分割得到前景和背景,然后进行连通区域检测,从而得到Blob快的过程。简单来说,blob分析就是在一块“光滑”区域内,将出现“灰度突变”的小区域寻找出来。举例来说,假如现在有一块刚生产出来的玻璃,表面非常光滑,平整。如果这块玻璃上面没有瑕疵,那么,我们是检测不到“灰度突变”的;相反,如果在玻璃生产线上,由于种种原因,造成了玻璃上面有一个凸起的小泡、有一块黑斑、有一点裂缝。。。那么,我们就能在这块玻璃上面检测到纹理,颜色发生突变的部分,而这些部分,就是生产过程中造成的瑕疵,而这个过程,就是blob分析。显然,纺织品的瑕疵检测,玻璃的瑕疵检测,机械零件表面缺陷检测,可乐瓶缺陷检测,药品胶囊缺陷检测等很多场合都会用到blob分析。

%统计细胞数
%[问题描述]用基本的形态学操作和blob分析来统计细胞数量。
%每个细胞亮度不同,分割不太容易
%[具体做法]先用腐蚀操作预处理,然后用blob分析来获取所有细胞
%blob本意是binary large objects
%blob分析,就是将二值化的图像中,灰度值相同的区域作为一个blob
%处理完整张图片后,得到所有的blob对象

%初始化
VideoSize=[432 528];
%创建视频读取系统对象
filename = 'ecolicells.avi';
hvfr = vision.VideoFileReader(filename, ...
                              'ImageColorSpace', 'Intensity',...
                              'VideoOutputDataType', 'single');

%创建两个形态学腐蚀系统对象,用来移除不平均的光照强度,并加强边界
hdilate1 = vision.MorphologicalDilate('NeighborhoodSource', 'Property', ...
                   'Neighborhood', strel('square',7));
hdilate2 = vision.MorphologicalDilate('NeighborhoodSource', 'Property', ...
                   'Neighborhood', strel('square',7));

%创建一个自动化阈值系统对象,用于灰度图到二值图的转化
hautoth = vision.Autothresholder( ...
  'Operator', '<=', ...
  'ThresholdScaleFactor', 0.8);

%创建一个Blob分析系统对象,用来找到被分割的细胞的重心
hblob = vision.BlobAnalysis( ...
                'AreaOutputPort', false, ...
                'BoundingBoxOutputPort', false, ...
                'OutputDataType', 'single', ...
                'MinimumBlobArea', 7, ...
                'MaximumBlobArea', 300, ...
                'MaximumCount', 1500);
%致谢:数据来源
ackText = ['Data set courtesy of Jonathan Young and Michael Elowitz, ' ...
             'California Institute of Technology'];    

%创建播放视频的对象
hVideo = vision.VideoPlayer;
hVideo.Name = 'Results';
hVideo.Position(1) = round(hVideo.Position(1));
hVideo.Position(2) = round(hVideo.Position(2));
hVideo.Position([4,3]) = 30 + VideoSize;

%在循环中处理视频流
frameCount = int16(1);
while ~isDone(hvfr)
    %读取一帧视频
    image = step(hvfr);
    
    %应用形态学腐蚀操作和图像计算的组合
    %移除不平均的光照,以及加强细胞的边界
    
    y1 = 2*image - step(hdilate1, image);
    y1(y1<0) = 0;
    y1(y1>1) = 1;
    y2 = step(hdilate2, y1) - y1;
    
    y3 = step(hautoth, y2); %图像二值化
    Centroid = step(hblob, y3); %计算重心
    numBlobs = size(Centroid, 1); %也计算细胞数量
    
    %显示帧数和细胞数
    frameBlobTxt = sprintf('Frame %d, Count %d', frameCount, numBlobs);
    image = insertText(image, [1 1], frameBlobTxt, ...
        'FontSize', 16, 'BoxOpacity', 0, 'TextColor', 'white');
    image = insertText(image, [1 size(image,1)], ackText, ...
        'FontSize', 10, 'AnchorPoint', 'LeftBottom', ...
        'BoxOpacity', 0, 'TextColor', 'white');
    
    %显示视频
    image_out = insertMarker(image, Centroid, '*', 'Color', 'green');
    step(hVideo, image_out);
    
    frameCount = frameCount + 1;
end

release(hvfr); %关闭视频文件


原文地址:https://www.cnblogs.com/zjutzz/p/5281633.html