Augmenter la luminosité d'une image

Résolu/Fermé
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 - 11 mars 2012 à 17:30
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 13 mars 2012 à 15:45
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.

A voir également:

10 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
11 mars 2012 à 17:49
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
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
Modifié par Étienne9 le 11/03/2012 à 18:42
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
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
Modifié par KX le 11/03/2012 à 18:53
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
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
Modifié par KX le 11/03/2012 à 18:58
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
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
12 mars 2012 à 14:04
C'est au brightness qu'on touche ?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
12 mars 2012 à 14:30
Oui, je crois, il faudrait tester pour s'en assurer...
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
13 mars 2012 à 09:32
On peut charger une image en HSB directement ?
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
13 mars 2012 à 12:03
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
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
13 mars 2012 à 12:09
Oui c'est ça, mais normalement la teinte (hue : qui est entre 0 et 360) tu n'as pas à y toucher.
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
Modifié par Étienne9 le 13/03/2012 à 12:18
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
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
13 mars 2012 à 12:20
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
13 mars 2012 à 12:23
Mais hsb[0] je n'ai même pas besoin de lui attribuer quoi que ce soit non ?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
13 mars 2012 à 12:31
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
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
13 mars 2012 à 12:34
Avec la luminosité j'ai un problème, quand je tape une valeur inférieur à 100 l'image est noire.
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
13 mars 2012 à 12:45
Peut être que j'ai compris, si je mets entier aussi...
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
13 mars 2012 à 12:50
d'autant que j'ai rappelé tout à l'heure que la valeur était entre 0 et 1 !!!
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
13 mars 2012 à 12:52
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
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
13 mars 2012 à 13:38
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
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
13 mars 2012 à 14:43
Merci beaucoup, c'est résolu pour moi.
Une fois encore vous m'avez sauvé la vie.
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
13 mars 2012 à 15:40
Qu'est alpha s'il vous plaît ?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
13 mars 2012 à 15:45
La transparence, c'est le A de ARGB
0
slayyem88 Messages postés 2 Date d'inscription mardi 13 mars 2012 Statut Membre Dernière intervention 13 mars 2012
13 mars 2012 à 12:00
je cherche le méme probléme
-1
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
13 mars 2012 à 12:01
Et bien lis, la réponse sera la même !
0