Augmenter la luminosité d'une image

Résolu
Étienne9 Messages postés 1090 Statut Membre -  
KX Messages postés 19031 Statut Modérateur -
Bonjour,

Alors voilà, désormais je cherche à augmenter la luminosité d'une image en pour-cent.
Ma première idée est de travailler en ARGB et augmenter la luminance mais je ne sais pas si c'est comme ça que l'on doit faire.

Cordialement.

10 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Au lieu de travailler en RGB, tu devrais utiliser le format HSB (hue, saturation, brightness)

    int rgb = img.getRGB(x, y);
    Color clr = new Color(rgb);
    float[] hsb = Color.RGBtoHSB(clr.getRed(), clr.getGreen(), clr.getBlue(), null);
    
    //TODO : modification de hsb pour traitement
    
    int rgb2 = Color.HSBtoRGB(hsb[0],hsb[1],hsb[2]);
    img.setRGB(x, y, rgb2);
    0
  2. Étienne9 Messages postés 1090 Statut Membre 49
     
    Question : après je devrai sûrement programmer quelque chose pour augmenter ou diminuer la saturation, je travaillerai aussi en HSB et je changerai juste le S ou c'est plus compliqué que ça??
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Normalement modifier la saturation devrait suffire. Après peut-être que ça ne fera pas exactement ce que tu veux et qu'il faudra aussi jouer sur le contraste, mais dans tout les cas tu ne touchera pas à la teinte.

      La seule vraie complication que tu pourrais avoir c'est avec la transparence, car je ne sais pas trop comment ça se comporte lors du passage de RGB à HSB, puisque l'alpha n'est pas passé en paramètre de la conversion... Mais au pire il suffira de le récupérer avant, de faire la conversion, puis de le remettre après.
      0
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      En tenant compte de la transparence :

      int rgb = img.getRGB(x, y);
      Color clr = new Color(rgb,true);
      int alpha = clr.getAlpha();
      float[] hsb = Color.RGBtoHSB(clr.getRed(), clr.getGreen(), clr.getBlue(), null);
      
      //TODO : modification de hsb pour traitement
      
      rgb = Color.HSBtoRGB(hsb[0],hsb[1],hsb[2]);
      clr = new Color(rgb);
      clr = new Color(clr.getRed(), clr.getGreen(), clr.getBlue(), alpha);
      img.setRGB(x, y, clr.getRGB());
      0
    3. Étienne9 Messages postés 1090 Statut Membre 49
       
      C'est au brightness qu'on touche ?
      0
    4. KX Messages postés 19031 Statut Modérateur 3 020
       
      Oui, je crois, il faudrait tester pour s'en assurer...
      0
    5. Étienne9 Messages postés 1090 Statut Membre 49
       
      On peut charger une image en HSB directement ?
      0
  3. Étienne9 Messages postés 1090 Statut Membre 49
     
    hsb[0] c'est hue, hsb[1] c'est saturation et hsb[2] c'est Brightness c'est ça ?
    Et votre code je dois tout mettre dans deux boucles imbriquées c'est ça ?
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Oui c'est ça, mais normalement la teinte (hue : qui est entre 0 et 360) tu n'as pas à y toucher.
      0
  4. Étienne9 Messages postés 1090 Statut Membre 49
     
    Une question : j'essaie de faire la fonction mais qui s'appelle lumisat, c'est-à-dire qu'avec une seule fonction elle va faire deux choses. Possible ? Style, selon le paramètre elle change soit la luminosité, soit la saturation.
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Tu peux changer hsb[1] et hsb[2] en même temps (genre augmenter le premier et diminuer le deuxième) ça ne posera aucune problème !
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Étienne9 Messages postés 1090 Statut Membre 49
     
    Mais hsb[0] je n'ai même pas besoin de lui attribuer quoi que ce soit non ?
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Regarde mon code ! hsb est issu de la conversion RGBtoHSB à partir du pixel existant, donc hsb[0] a déjà une valeur qui correspond à un angle entre 0 et 360 degrés du cercle chromatique et correspondant aux valeurs RGB déjà présente initialement dans l'image. Si tu modifies hsb[0] tu vas changer la couleur alors que toi tu veux juste agir sur les deux autres.
      0
  7. Étienne9 Messages postés 1090 Statut Membre 49
     
    Avec la luminosité j'ai un problème, quand je tape une valeur inférieur à 100 l'image est noire.
    0
    1. Étienne9 Messages postés 1090 Statut Membre 49
       
      Peut être que j'ai compris, si je mets entier aussi...
      0
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      d'autant que j'ai rappelé tout à l'heure que la valeur était entre 0 et 1 !!!
      0
  8. Étienne9 Messages postés 1090 Statut Membre 49
     
    Voilà ma fonction, il y a un soucis pour la luminosité inférieure à 100%
    Alors désolé pour les commentaires que vous m'avez fait souvent avec les paramètres mais je ne suis pas habitué à mettre énormément de paramètres.

    public static void lumisat(String choix, int pourcent)
    {
    // Cette fonction est chargée de changer soit la luminosité soit la saturation.
    int pix=0,h=0,w=0,x=0,y=0;
    double lumi=0,sat=0;
    if ((pourcent == 100) || (pourcent <=0)) {
    // Si la valeur est 100%, cela ne sert à rien d'appliquer la fonction.
    System.out.println("Erreur : le pourcentage est soit négatif soit egal a 0.");
    return;
    }
    else {
    lumi = 1;
    sat = 1;
    if(choix.equals("luminosite")) {
    lumi = pourcent/100;
    }
    else {
    if(choix.equals("saturation")) {
    sat = pourcent/100;
    }
    }
    }
    BufferedImage img=null;
    try {
    img = ImageIO.read(new File("./image.bmp"));
    }
    catch (Exception e) {}
    w = img.getWidth();
    h = img.getHeight();
    for(y=0;y<h;y++) {
    for(x=0;x<w;x++) {
    int rgb = img.getRGB(x, y);
    Color clr = new Color(rgb,true);
    int alpha = clr.getAlpha();
    float[] hsb = Color.RGBtoHSB(clr.getRed(), clr.getGreen(), clr.getBlue(), null);
    hsb[1] = (float) (hsb[1]*sat);
    hsb[2] = (float) (hsb[2]*lumi);
    rgb = Color.HSBtoRGB(hsb[0],hsb[1],hsb[2]);
    clr = new Color(rgb);
    clr = new Color(clr.getRed(), clr.getGreen(), clr.getBlue(), alpha);
    img.setRGB(x, y, clr.getRGB());
    }
    }
    try {
    ImageIO.write(img,"bmp",new File("lumisat.bmp"));
    }
    catch (Exception e) {};
    // Et on crée l'image.
    }
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Si tu fais pourcent/100 alors que pourcent est un entier inférieur à 100 alors nécessairement ça fera 0 !
      HSB t'impose d'utiliser des float, alors pourquoi mettre des double en plein milieu ?
      De plus ton code ne te permet que d'augmenter les valeurs pas de les diminuer.

      Il faudrait plutôt utiliser au maximum les float en passant en paramètre 1 (=100% pas de changement), entre 0 et 1 (diminution), supérieur à 1 (augmentation), ça t'évitera la manipulation toute moche de String.

      public static void lumisat(float lumi, float sat) 
      // ...
      hsb[1] *= lumi;
      hsb[2] *= sat;
      0
  9. Étienne9 Messages postés 1090 Statut Membre 49
     
    Merci beaucoup, c'est résolu pour moi.
    Une fois encore vous m'avez sauvé la vie.
    0
  10. Étienne9 Messages postés 1090 Statut Membre 49
     
    Qu'est alpha s'il vous plaît ?
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      La transparence, c'est le A de ARGB
      0
  11. slayyem88 Messages postés 3 Statut Membre
     
    je cherche le méme probléme
    -1
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Et bien lis, la réponse sera la même !
      0