Этот пример показывает, как использовать комбинацию основных морфологических операторов и анализа блоба, чтобы извлечь информацию от видеопотока. В этом случае пример считает количество бактерий Э. Коли в каждом кадре видео. Обратите внимание на то, что ячейки имеют переменную яркость, которая делает задачу из сегментации более сложной.
Используйте эти следующие разделы кода, чтобы инициализировать необходимые переменные и объекты.
VideoSize = [432 528];
Создайте Системный объект, чтобы считать видео из avi файла.
filename = 'ecolicells.avi'; hvfr = vision.VideoFileReader(filename, ... 'ImageColorSpace', 'Intensity',... 'VideoOutputDataType', 'single');
Создайте Системный объект BlobAnalysis, чтобы найти центроид сегментированных ячеек в видео.
hblob = vision.BlobAnalysis( ... 'AreaOutputPort', false, ... 'BoundingBoxOutputPort', false, ... 'OutputDataType', 'single', ... 'MinimumBlobArea', 7, ... 'MaximumBlobArea', 300, ... 'MaximumCount', 1500); % Acknowledgement 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) % Read input video frame image = step(hvfr); % Apply a combination of morphological dilation and image arithmetic % operations to remove uneven illumination and to emphasize the % boundaries between the cells. y1 = 2*image - imdilate(image, strel('square',7)); y1(y1<0) = 0; y1(y1>1) = 1; y2 = imdilate(y1, strel('square',7)) - y1; th = multithresh(y2); % Determine threshold using Otsu's method y3 = (y2 <= th*0.7); % Binarize the image. Centroid = step(hblob, y3); % Calculate the centroid numBlobs = size(Centroid,1); % and number of cells. % Display the number of frames and cells. 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'); % Display video image_out = insertMarker(image, Centroid, '*', 'Color', 'green'); step(hVideo, image_out); frameCount = frameCount + 1; end
release(hvfr); % close the video file
В окне Results показывают исходное видео, и зеленые маркеры указывают на центроидные местоположения ячеек. Номер кадра и количество ячеек отображены в левом верхнем углу.
Набор данных для этого примера был обеспечен Джонатаном Янгом и Михаэлем Эловицем из Калифорнийского технологического института. Это используется с разрешением. Для получения дополнительной информации об этих данных смотрите
Н. Розенфельд, Дж. Янг, U. Алон, P. Деревенский парень и М.Б. Эловиц, "Регуляция генов на Уровне Отдельной ячейки", Наука 2005, Издание 307, стр 1962-1965.