Просто нарисуйте пиксели на маске прежде, чем отобразить их в видеоплеере. То, что у вас есть, работает, но оно построит границу внутри фигуры для игрока маски. Поэтому возьмите свои границы, которые вы обнаружили от 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
Спасибо большое за ваш ответ. Это отображает границу для blob в проигрывателе, но при этом отображается исходное изображение с границей, а не бинарным изображением. Я хочу, чтобы граница отображалась вокруг двоичного изображения. Можете ли вы сказать мне, почему это так? Также я хотел бы знать, в чем разница между использованием bwboundaries и bwperim. – BlueBee
А, я предположил, что вы хотели его на исходном изображении, а не на двоичном изображении. Я обновлю свой пост. Разница между 'bwboundaries' и' bwperim' заключается в том, что 'bwboundaries' дает вам периметры blobs как набор' (x, y) 'точек. 'bwperim' возвращает периметр капли в качестве изображения. Это изображение очень важно для рисования пикселей, чтобы отобразить это на рисунке. – rayryeng
Спасибо большое, теперь он отлично работает :). Можно ли увеличить ширину периметра/границы. Кроме того, как построить центроид поверх изображения маски, как он отображается в настоящее время в отдельном окне. – BlueBee