Подсчет клеток

В этом примере показано, как использовать комбинацию базовых морфологических операторов и анализа больших двоичных объектов для извлечения информации из видеопотока. В этом случае пример подсчитывает количество E. Coli bacteria в каждом кадре видео. Обратите внимание, что ячейки имеют различную яркость, что делает задачу сегментации более сложной.

Инициализация

Используйте эти следующие разделы кода, чтобы инициализировать необходимые переменные и объекты.

VideoSize = [432 528];

Создайте Системный объект, чтобы считать видео из avi файла.

filename = 'ecolicells.avi';
hvfr = VideoReader(filename);

Создайте Системный объект 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 hasFrame(hvfr)
    % Read input video frame
    image = im2gray(im2single(readFrame(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

Figure Results contains an axes object and other objects of type uiflowcontainer, uimenu, uitoolbar. The axes object contains an object of type image.

Сводные данные

В окне Results показывают исходное видео, и зеленые маркеры указывают на центроидные местоположения ячеек. Номер системы координат и количество ячеек отображены в левом верхнем углу.

Кредиты набора данных

Набор данных для этого примера был обеспечен Джонатаном Янгом и Михаэлем Эловицем из Калифорнийского технологического института. Это используется с разрешением. Для получения дополнительной информации об этих данных смотрите

Н. Розенфельд, Дж. Янг, U. Алон, P. Деревенский парень и М.Б. Эловиц, "Регуляция генов на Уровне Отдельной ячейки", Наука 2005, Издание 307, стр 1962-1965.