1

J'appelle certaines images dans une boucle for puis j'effectue un traitement sur ces images. Après cela, j'utilise la fonction step pour afficher ces images et leurs masques dans un lecteur vidéo. Comment puis-je ajouter une limite à un objet à l'intérieur de l'image du masque? Aussi, comment puis-je rendre la frontière plus épaisse et tracer les centroïdes de chaque blob dans le masque dans l'image du masque? Voici l'esquisse du code.Comment tracer des limites et des centroïdes sur des trames vidéo appelées à l'intérieur de la fonction 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: Je sais comment l'afficher sur une figure en utilisant hold on mais je voudrais que cela fait directement sur l'image avant de l'afficher dans le lecteur vidéo. Toute orientation serait appréciée.

Répondre

2

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 
+0

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

+0

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

+0

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