IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Extraction de couleur, quantification et analyses d'image sous R


Sujet :

R

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Polynésie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Extraction de couleur, quantification et analyses d'image sous R
    Bonjour,

    Je souhaiterai quantifier les couleurs d'une image. Je travail sur l'iridescence des nacres (huîtres perlières) et j'aimerai quantifier trois couleurs (rouge, jaune et vert) dans la nacre de cette coquille.

    Nom : 8Gkyc.jpg
Affichages : 461
Taille : 83,1 Ko

    J'ai testé différents packages (imager, ImageMagick, EBImage...) mais je n'ai pas vraiment trouvé quelque chose qui m'aidait..

    Je souhaiterai faire une quantification colorimetrique sous R, avec des cercles. La zone de la primitive en pixel peut-être exprimée comme celle d'un cercle de surface équivalente. La primitive est une aire continue de pixels voisins d'une couleur similaire. Le centre des cercles peut-être le "pixel ancre".

    Voici l'équation qui pourrait m'aider à réaliser ceci:

    DeltaI = Racine carrée [(Rancre + Ri)² + (Gancre - Gi)² + (Bancre - Bi)²]

    R, G et B sont les composantes colorimétriques des pixels, allant de 0 à 255, ancre est le pixel d'ancrage et i et n'importe quel pixel aux alentours qui a une couleurs similaire.

    Voici une image de ce que j'espère obtenir à la fin de mon code (source: Alçiçek & Balaban 2012):

    Nom : BMgXt.png
Affichages : 458
Taille : 329,5 Ko

    Voici mon code initial, mais je n'ai absolument pas la moindre idée de comment continuer... Peut-être en créant un package ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    library(png)
    nacre <-  readPNG("test.png")
    nacre
     
    dim(nacre)
     
    # show the full RGB image
    grid.raster(nacre)
     
    # show the 3 channels in separate images
    nacre.R = nacre
    nacre.G = nacre
    nacre.B = nacre
     
    # zero out the non-contributing channels for each image copy
    nacre.R[,,2:3] = 0
    nacre.G[,,1]=0
    nacre.G[,,3]=0
    nacre.B[,,1:2]=0
     
    # build the image grid
    img1 = rasterGrob(nacre.R)
    img2 = rasterGrob(nacre.G)
    img3 = rasterGrob(nacre.B)
    grid.arrange(img1, img2, img3, nrow=1)
    # Now let’s segment this image. First, we need to reshape the array into a data frame with one row for each pixel and three columns for the RGB channels:
     
     
    # reshape image into a data frame
    df = data.frame(
    red = matrix(nacre[,,1], ncol=1),
    green = matrix(nacre[,,2], ncol=1),
    blue = matrix(nacre[,,3], ncol=1)
      )
     
     
    ### compute the k-means clustering
    K = kmeans(df,4)
    df$label = K$cluster
     
    ### Replace the color of each pixel in the image with the mean 
    ### R,G, and B values of the cluster in which the pixel resides:
     
    # get the coloring
    colors = data.frame(
      label = 1:nrow(K$centers), 
      R = K$centers[,"red"],
      G = K$centers[,"green"],
      B = K$centers[,"blue"]
    )
     
    # merge color codes on to df
    df$order = 1:nrow(df)
    df = merge(df, colors)
    df = df[order(df$order),]
    df$order = NULL
     
    # get mean color channel values for each row of the df.
    R = matrix(df$R, nrow=dim(nacre)[1])
    G = matrix(df$G, nrow=dim(nacre)[1])
    B = matrix(df$B, nrow=dim(nacre)[1])
     
    # reconstitute the segmented image in the same shape as the input image
    nacre.segmented = array(dim=dim(nacre))
    nacre.segmented[,,1] = R
    nacre.segmented[,,2] = G
    nacre.segmented[,,3] = B
     
    # View the result
    grid.raster(nacre.segmented)
    Quelqu'un aurait-il une piste, une idée ?
    Merci d'avance

  2. #2
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    Ce n'est pas une réponse directe au problème mais une question : est-ce que l'espace RVB est le plus adapté au problème ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Polynésie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Oui c'est vrai que cela semble contre intuitif, mais je me suis basé sur deux publications (Alçiçek & Balaban 2012 et Balaban 2008) qui ont réalisé ceci avec cette équation RVB (en utilisant LensEye, un logiciel qui ne coute "que" 2500$, donc inaccessible au commun des mortels).

    Il aurait semblait plus logique de partir des trois couleurs que je souhaite étudier (Rouge, Jaune et Vert), mais je ne voit pas comment extraire ces couleurs des pixels et les classifier dans les trois couleurs, lui expliquer que #7FFF00 (rgb(127,255,0)) est du vert, mais aussi #32CD32 (rgb(50,205,50)), etc ... Faire ceci m'avancer grandement, mais je pêche un peu dessus.

  4. #4
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    Quand la couleur est exprimée sous la forme "#66334D", c'est une chaîne de caractères de 7 caractères représentant la couleur sous forme hexadécimale, les caractères 2 et 3 donnent, le rouge, 4 et 5, le vert et 6 et 7, le bleu (en hexadécimal). Pour avoir leur valeur décimale, il faut alors les convertir en nombre entier. la fonction suivante permet de la faire même si elle n'est pas optimale (à ma connaissance il n'existe pas de fonction dans R qui le fasse, mais ce serait à vérifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    rvb2mat <- function( vecteur.couleurs) {
      resultat <- matrix( NA, ncol=3, nrow=length( vecteur.couleurs), dimnames=list( NULL, c( "R", "V", "B")))
     resultat[,"R"] <- strtoi( substr( vecteur.couleurs, 2, 3), 16L)
     resultat[,"V"] <- strtoi( substr( vecteur.couleurs, 4, 5), 16L)
     resultat[,"B"] <- strtoi( substr( vecteur.couleurs, 6, 7), 16L)
     resultat
    }

Discussions similaires

  1. Analyse d'images sous python
    Par melou_science dans le forum Calcul scientifique
    Réponses: 1
    Dernier message: 19/05/2016, 18h57
  2. Réponses: 3
    Dernier message: 16/12/2015, 15h30
  3. Réponses: 1
    Dernier message: 02/11/2006, 09h25
  4. Analyse d'images
    Par gmonta dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 30/09/2005, 08h13
  5. mettre une couleur au contour d'une image
    Par totoranky dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 07/12/2004, 14h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo