zoukankan      html  css  js  c++  java
  • 统计细胞数量

    统计图片中细胞的数量,问题来自于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); %关闭视频文件
    
    
    
  • 相关阅读:
    Prime Ring Problem 素数环
    下沙的沙子有几粒?
    小兔的棋盘
    超级楼梯
    一只小蜜蜂...
    变形课
    Buy the Ticket
    How Many Trees?
    通过拦截器来统计每个action的执行时间
    apache+tomcat+session(JK实现方式)
  • 原文地址:https://www.cnblogs.com/zjutzz/p/5281633.html
Copyright © 2011-2022 走看看