这个示例展示了如何结合使用基本形态运算符和blob分析从视频流中提取信息。在本例中,该示例计算了每个视频帧中大肠杆菌的数量。注意,细胞的亮度是不同的,这使得分割任务更具挑战性。
使用下面的代码段初始化所需的变量和对象。
VideoSize = [432 528];
创建一个System对象从avi文件中读取视频。
文件名=“ecolicells.avi”;hvfr = VideoReader(文件名);
创建一个BlobAnalysis System对象来查找视频中分割的细胞的质心。
hblob =愿景。BlobAnalysis (...“AreaOutputPort”假的,...“BoundingBoxOutputPort”假的,...“OutputDataType”,“单一”,...“MinimumBlobArea”7...“MaximumBlobArea”, 300,...“MaximumCount”, 1500);%确认ackText = [数据集由乔纳森·杨和迈克尔·埃洛维茨提供...加州理工学院];
创建System对象来显示视频。
hVideo = vision.VideoPlayer;hVideo。Name =“结果”;hVideo.Position(1) =圆(hVideo.Position (1));hVideo.Position(2) =圆(hVideo.Position (2));hVideo。Position([4 3]) = 30+VideoSize;
创建一个处理循环来计算输入视频中的单元格数。这个循环使用上面实例化的System对象。
frameCount = int16 (1);而hasFrame (hvfr)%读取输入视频帧形象= im2gray (im2single (readFrame (hvfr)));结合形态学扩张和图像算法%的操作,以消除不均匀的照度和强调单元格之间的边界。Y1 = 2*image - imdilate(image, strel(“广场”7));日元(y1 < 0) = 0;y1 (> 1) = 1;Y2 = imdilate(y1, strel(“广场”7) - y1;th = multithresh (y2);%用大津法确定阈值Y3 = (y2 <= th*0.7); / /将图像二值化。质心= step(hblob, y3);%计算质心numBlobs =大小(重心,1);%和单元格数。%显示帧和单元格的数量。frameBlobTxt = sprintf ('帧%d,计数%d'frameCount numBlobs);image = insertText(image, [1 1], frameBlobTxt,...“字形大小”, 16岁,“BoxOpacity”0,“输入TextColor”,“白色”);image = insertText(image, [1 size(image,1)], ackText,...“字形大小”10“AnchorPoint”,“LeftBottom”,...“BoxOpacity”0,“输入TextColor”,“白色”);%显示视频image_out = insertMarker(图像,质心,‘*’,“颜色”,“绿色”);步骤(hVideo image_out);frameecount = frameecount + 1;结束
结果窗口显示原始视频,绿色标记显示细胞的质心位置。帧号和单元格数显示在左上角。
这个例子的数据集是由加州理工学院的Jonathan Young和Michael Elowitz提供的。它是经允许使用的。有关此数据的其他信息,请参见
N. Rosenfeld, J. Young, U. Alon, P. Swain, M.B. Elowitz,“单细胞水平上的基因调控”,《科学》2005年第307卷,1962-1965页。