统计图片中细胞的数量,问题来自于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;endrelease(hvfr); %关闭视频文件