2015-08-24 2 views
0

Existe-t-il un moyen pratique de créer un nouveau passe-partout à partir des sorties d'une opération floodfill? Je veux obtenir un tapis de seulement les pixels qui sont détectés comme étant connectés au pixel d'amorçage et sont inondés techniquement.Récupérer les sorties de remplissage (pixels connectés) copiées dans un nouveau passe-partout

Je suppose que j'ai exécuté la méthode floodFill à un certain point de départ et seulement 1/4 du total des pixels ont été remplis lorsqu'ils ont été connectés. Je veux copier ces pixels uniquement sur une nouvelle image, qui représente seulement le nombre de pixels 1/4 et probablement plus petite que l'image d'entrée originale.

Je l'ai fait de toute façon via une très longue, consommation de temps + CPU. En bref, mon approche donnait des couleurs différentes pour différents appels floodfill et de garder des enregistrements de pixels de même couleur dans une structure de données séparée, etc.

Je veux savoir s'il existe une approche directe et plus facile en utilisant le masque créé par floodfill ou en utilisant toute autre approche.

Répondre

2

Ce dont vous avez besoin n'est pas complètement clair. S'il vous plaît jeter un oeil à ce code, et vérifiez si croppedResult est ce que vous voulez.

#include <opencv2\opencv.hpp> 
using namespace cv; 

int main() 
{ 
    // Create a test image 
    Mat1b img(300, 200, uchar(0)); 
    circle(img, Point(150, 200), 30, Scalar(255)); 
    rectangle(img, Rect(30, 50, 40, 20), Scalar(255)); 
    rectangle(img, Rect(100, 80, 30, 40), Scalar(255)); 

    // Seed inside the circle 
    Point seed(160, 220); 

    // Setting up a mask with correct dimensions 
    Mat1b mask; 
    copyMakeBorder(img, mask, 1, 1, 1, 1, BORDER_CONSTANT, Scalar(0)); 

    Rect roi; 
    uchar seedColor = 200; 
    floodFill(img, mask, 
     seed + Point(1,1), // Since the mask is larger than the filled image, a pixel (x,y) in image corresponds to the pixel (x+1,y+1) in the mask 
     Scalar(0),   // If FLOODFILL_MASK_ONLY is set, the function does not change the image (newVal is ignored), 
     &roi,    // Minimum bounding rectangle of the repainted domain. 
     Scalar(5),   // loDiff 
     Scalar(5),   // upDiff 
     4 | (int(seedColor) << 8) | FLOODFILL_MASK_ONLY); 
     // 4-connected | with defined seedColor | use only the mask 

    // B/W image, where white pixels are the one set to seedColor by floodFill 
    Mat1b result = (mask == seedColor); 

    // Cropped image 
    roi += Point(1,1); 
    Mat1b croppedResult = result(roi); 

    return 0; 
} 

image de test img:

enter image description here

Masque mask après floodFill:

enter image description here

Masque result avec seulement seedColor pixels:

enter image description here

recadrée masque croppedResult:

enter image description here


MISE À JOUR

// B/W image, where white pixels are the one set to seedColor by floodFill 
    Mat1b resultMask = (mask == seedColor); 
    Mat1b resultMaskWithoutBorder = resultMask(Rect(1,1,img.cols,img.rows)); 

    Mat3b originalImage; 
    cvtColor(img, originalImage, COLOR_GRAY2BGR); // Probably your original image is already 3 channel 

    Mat3b imgMasked(img.size(), Vec3b(0,0,0)); 
    originalImage.copyTo(imgMasked, resultMaskWithoutBorder); 

    Mat3b croppedResult = imgMasked(roi); 
    return 0; 
+0

Merci pour la réponse. Mais je ne comprends pas ces déclarations. ||||| Résultat Mat1b = (masque == seedColor); // Image rognée roi + = Point (1,1); Mat1b croppedResult = résultat (roi); |||| Et quel est ce paramètre roi de l'enfouissement et de ce qui y est stocké? –

+1

Sélectionnez uniquement le pixel avec la valeur == seedColor; traduire Rect 1 px down et 1 px right; obtenir une sous-matrice en utilisant le Rect. Comme le dit doc, roi est la boîte englobante des points inondés. – Miki

+0

Vraiment intéressant .. !!! Mais pourquoi devrions-nous traduire Rect 1 px vers le bas et 1 px à droite? Est-ce parce que le roi est donné lié à l'image originale et? Je sais que le masque est quand même 1 pixel plus large et plus grand que l'original et que l'augmentation vient des côtés supérieur et gauche? –