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

更多推荐