2017-10-08 3 views
0

J'ai une image RVB en 2D. Je voudrais créer des groupes de pixels qui ont la même couleur (valeur RVB); ils sont lus de gauche à droite, puis de haut en bas. Lorsque le pixel actuel a une valeur RGB différente de la précédente, cela signifie que j'ai trouvé un groupe (qui contient les pixels précédents).Comment utiliser Voisinage pour utiliser tous les canaux?

Je sais qu'il existe les fonctions CImg CImg_for2x2(img,x,y,z,c,I,T) mais le problème est que cela ne fonctionne que sur le canal c, alors que je suis intéressé par la valeur RGB. Doc: http://cimg.eu/reference/group__cimg__loops.html#lo6

Savez-vous s'il est possible de dire "CImg" pour comprendre que je travaille avec la valeur RVB et pas seulement la valeur du rouge, par exemple?

Répondre

1

Il est difficile de dire de votre question, mais je pense que vous cherchez « Connected Component Analysis » ou « étiquetage ».

L'outil CImg pour cela est label().

Donc, si vous commencez avec cette image qui a 3 taches blanches en elle:

enter image description here

puis exécutez ceci:

#include <iostream> 
#include "CImg.h" 
using namespace std; 
using namespace cimg_library; 

int main(int argc, char** const argv) 
{ 
    CImg<int> img("input.png"); 
    img.label(0,0); 
    img.save_png("result.png"); 
} 

Il sera "label" tous distincts blobs dans l'image avec un numéro unique, comme ceci:

enter image description here

+0

La partie noire est-elle également identifiée? –

+1

Tous les pixels noirs sont sortis étiquetés (c'est-à-dire colorés) comme 0, ils sont donc noirs. Tous les pixels dans le blob en haut à gauche sont sortis avec l'étiquette (c.-à-d. La couleur) 1. Tous les pixels dans la grande barre sur la droite sont sortis étiquetés comme 2. Tous les pixels dans le grand carré sont sortis étiquetés 3. Je puis 'normalized()' (c'est-à-dire étaler les valeurs sur l'échelle complète de 0-255) l'image pour que 1 devienne 85, 2 deviennent 170 et 3 deviennent 255. –