1

Я вызываю некоторые изображения внутри цикла for, а затем выполняю некоторую обработку на этих изображениях. После этого я использую функцию step для отображения этих фреймов и их масок внутри видеоплеера. Как добавить границу к объекту внутри изображения маски? Кроме того, как я могу сделать границу толще и построить центроиды каждого блоба в маске в изображении маски? Ниже приведен примерный код кода.Как построить границу и центроиды на видеокадрах, называемых внутри функции step()

videoPlayer = vision.VideoPlayer(); 
    maskPlayer = vision.VideoPlayer(); 
    for ii = 1:nfiles 
    filenameii = [............] 
    frame= imread(filenameii); 
    mask = dOB(frame,BackgroundImg); 
% some processing on the images 
    mask= bwareaopen(mask,27); 
    boundaries = bwboundaries(mask,'noholes'); 
    B=boundaries{1}; 
    Centroid = regionprops(mask,'centroid'); 
    Centroids = cat(1, Centroid.Centroid); 
    plot(B(:,2),B(:,1),'g','LineWidth',3); 
    plot(Centroids(:,1), Centroids(:,2), 'r+', 'MarkerSize', 10); step(videoPlayer,frame); 
    step(maskPlayer, mask); 

P.S: Я знаю, как вывести его на фигуру с помощью hold on, но я хотел бы это сделать прямо на изображение перед выводом его в видеоплеере. Любые рекомендации будут оценены.

ответ

2

Просто нарисуйте пиксели на маске прежде, чем отобразить их в видеоплеере. То, что у вас есть, работает, но оно построит границу внутри фигуры для игрока маски. Поэтому возьмите свои границы, которые вы обнаружили от bwboundaries, создайте линейные индексы из этих координат и установите значения в изображении на белый. Что может быть еще проще, так это взять маску, которую вы обнаружили, и использовать bwperim, чтобы автоматически создавать маску, содержащую границы капель. Я также вижу, что вы заполняете отверстия в маске, так что вы можете использовать imfill непосредственно на выходе вашей пост-обработки, чтобы он дал вам изображение вместо координат. Затем вы использовали бы эту маску для прямого индексирования в свое изображение и установки координат границ капли на нужный вам цвет. Если вы захотите сделать периметр более толстым, поможет простая дилатация изображения с помощью imdilate с использованием квадратного структурирующего элемента соответствующего размера. Просто определите размер окрестности этого структурирующего элемента как толщину периметра, который вы желаете. Наконец, если вы хотите вставить центроиды в маску и, так как у вас есть MATLAB Computer Vision System Toolbox, используйте функцию insertMarker, чтобы вы могли использовать набор точек для каждого центроида и поместить их прямо в изображение. Однако вы должны обязательно сменить маску с logical на тип данных, более подходящий для изображений. uint8 должен работать. Поэтому, нарисуйте изображение на этот тип, затем умножьте все ненулевые значения на 255, чтобы обеспечить сохранение белых цветов в маске. С insertMarker вы хотите вставить красные плюсы размером 10, поэтому нам нужно убедиться, что мы вызываем insertMarker, чтобы это отразить. Кроме того, поскольку вы хотите иметь цветное изображение, вам придется сделать свою маску искусственно цветной и сделать эту картину индивидуально для каждой плоскости для цвета, который вы хотите. Поскольку вы хотите зеленый, это соответствует значению RGB (0,255,0).

Поэтому я изменил ваш код, чтобы он это сделал. Кроме того, я вычислил центроиды заполненной маски вместо оригинала. Мы не хотели бы ложно сообщать о центроидах объектов с пробелами ... если это не то, на что вы нацелены, но предположим, что вы не:

videoPlayer = vision.VideoPlayer(); 
maskPlayer = vision.VideoPlayer(); 

% New - Specify colour you want 
clr = [0 255 0]; % Default is green 

% New - Define thickness of the boundaries in pixels. 
thickness = 3; 

% New - Create structuring element 
se = strel('square', thickness); 

for ii = 1:nfiles 
    filenameii = [............] 
    frame = imread(filenameii); 
    mask = dOB(frame, BackgroundImg); 
    % some processing on the images 
    mask = bwareaopen(mask,27); 
    %boundaries = bwboundaries(mask,'noholes'); 
    %B=boundaries{1}; 

    % New code - fill in the holes 
    mask = imfill(mask, 'holes'); 

    Centroid = regionprops(mask,'centroid');  

    % New code - Create a boundary mask 
    mask_p = bwperim(mask, 8); 

    % New code - Make the boundaries thicker 
    mask_p = imdilate(mask_p, se); 

    % New code - create a colour image out of the mask 
    [red, green, blue] = deal(255*uint8(mask)); 

    % Paint the perimeter of the blobs in the desired colour 
    red(mask_p) = clr(1); green(mask_p) = clr(2); blue(mask_p) = clr(3);   

    Centroids = cat(1, Centroid.Centroid); 
    %plot(B(:,2),B(:,1),'g','LineWidth',3); 
    %plot(Centroids(:,1), Centroids(:,2), 'r+', 'MarkerSize', 10); 

    % New - Make mask into RGB image for marker painting and to 
    % show to the user 
    mask_p = cat(3, red, green, blue); 

    % New - Insert the centroids directly in the mask image 
    mask_p = insertMarker(mask_p, Centroids, '+', 'color', 'r', 'size', 10); 

    step(videoPlayer, frame); 

    % New - Show new mask in the player 
    step(maskPlayer, mask_p); 
end 
+0

Спасибо большое за ваш ответ. Это отображает границу для blob в проигрывателе, но при этом отображается исходное изображение с границей, а не бинарным изображением. Я хочу, чтобы граница отображалась вокруг двоичного изображения. Можете ли вы сказать мне, почему это так? Также я хотел бы знать, в чем разница между использованием bwboundaries и bwperim. – BlueBee

+0

А, я предположил, что вы хотели его на исходном изображении, а не на двоичном изображении. Я обновлю свой пост. Разница между 'bwboundaries' и' bwperim' заключается в том, что 'bwboundaries' дает вам периметры blobs как набор' (x, y) 'точек. 'bwperim' возвращает периметр капли в качестве изображения. Это изображение очень важно для рисования пикселей, чтобы отобразить это на рисунке. – rayryeng

+0

Спасибо большое, теперь он отлично работает :). Можно ли увеличить ширину периметра/границы. Кроме того, как построить центроид поверх изображения маски, как он отображается в настоящее время в отдельном окне. – BlueBee