Il suffit de peindre les pixels sur le masque avant de l'afficher dans le lecteur vidéo. Ce que vous avez fonctionne, mais il va tracer la limite à l'intérieur de la figure pour le joueur de masque. Par conséquent, prenez vos limites que vous avez détectées à partir de bwboundaries
, créez des index linéaires à partir de ces coordonnées et définissez les valeurs dans votre image sur blanc. Ce qui peut être encore plus simple est de prendre votre masque que vous avez détecté et utiliser bwperim
pour produire automatiquement un masque qui contient les limites des blobs. Je vois aussi que vous remplissez les trous du masque, donc vous pouvez utiliser imfill
directement sur la sortie de votre post-traitement afin qu'il vous donne une image au lieu de coordonnées. Vous utiliserez alors ce masque pour indexer directement dans votre image et définir les coordonnées des limites du blob à la couleur désirée. Si vous souhaitez rendre le périmètre plus épais, une simple dilatation de l'image avec imdilate
en utilisant l'élément structurant carré de taille appropriée vous aidera. Définissez simplement la taille du voisinage de cet élément structurant pour qu'il soit l'épaisseur du périmètre que vous désirez. Enfin, si vous voulez insérer les centroïdes dans le masque et que vous disposez de MATLAB Computer Vision System Toolbox, utilisez la fonction insertMarker
pour pouvoir utiliser un ensemble de points pour chaque centroïde et les placer directement dans l'image. Cependant, vous devez être sûr de changer le masque d'un logical
en un type de données plus approprié pour les images. uint8
devrait fonctionner. Par conséquent, copiez l'image sur ce type, puis multipliez toutes les valeurs non nulles par 255 pour vous assurer que les couleurs blanches sont conservées dans le masque. Avec insertMarker
, vous voulez insérer des plus rouges avec une taille de 10, donc nous devons nous assurer que nous appelons insertMarker
pour refléter cela. Aussi, parce que vous voulez avoir une image en couleur, vous devrez colorer artificiellement votre masque et faire cette peinture individuellement pour chaque plan pour la couleur que vous voulez. Puisque vous voulez le vert, cela correspond à la valeur RVB de (0,255,0)
.
Par conséquent, j'ai modifié votre code afin qu'il le fasse. En outre, j'ai calculé les centroïdes du rempli au lieu de l'original. Nous ne voulons pas signaler faussement les centroïdes d'objets avec des lacunes ... sauf si c'est ce que vous visez, mais supposons que vous n'êtes pas:
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
Merci beaucoup pour votre réponse. Cela affiche une limite pour le blob dans le lecteur mais cela donne l'image originale avec limite et non l'image binaire. Je veux que la limite soit affichée autour de l'image binaire. Peux-tu me dire pourquoi c'est ainsi? Aussi, je voudrais savoir quelle est la différence entre l'utilisation de bwboundaries et bwperim. – BlueBee
Ah, j'ai supposé que vous le vouliez sur l'image originale, pas sur l'image binaire. Je vais mettre à jour mon message. La différence entre 'bwboundaries' et' bwperim' est que 'bwboundaries' vous donne les périmètres des blobs comme un ensemble de points' (x, y) '. 'bwperim' renvoie le périmètre des blobs en tant qu'image. Cette image est vitale pour peindre les pixels pour l'afficher sur la figure. – rayryeng
Merci beaucoup, son fonctionnement parfaitement maintenant :). Est-il possible d'augmenter la largeur du périmètre/Limite. En outre, comment tracer le centroïde au-dessus de l'image du masque tel qu'il est actuellement affiché dans une fenêtre séparée. – BlueBee