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

2D Java Discussion :

Statistiques de couleur


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Par défaut Statistiques de couleur
    Bonjour à tous,

    Existe-t-il à votre connaissance un moyen simple, avec Graphics2D ou une API pas trop lourde, permettant d'obtenir des statistiques sur les couleurs dans une image, SVP ?

    Je voudrais savoir le pourcentage de blanc/gris clair dans une image pour déterminer si, s'agissant d'une page de livre par exemple, elle contient "assez" d'informations, en proportion des espaces supposément vides.
    Joker : j'aimerais bien être capable de déterminer plus simplement si l'image (PNG) est en "noir et blanc" (aliasing gris toléré), ça pourrait suffire dans certains cas.

    Merci d'avance et bonne journée.

  2. #2
    Membre éclairé
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Par défaut proposition, pour le B&W
    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
    /**
     * Teste si une image est "en noir et blanc", c'est-à-dire si elle est
     * uniquement composée de couleurs dégradées du gris
     * 
     * @param img
     *              une image à tester
     * @param tolerance [0.0-1.0]
     *              écart toléré dans la nuance de gris ; ex: TRUE si [250, 251, 250] à 1%
     * @return false si au moins une couleur n'est pas dégradée du gris
     */
    public static boolean isBlackAndWhite(BufferedImage img, float tolerance) {
    	for (int i = 0; i < img.getHeight(); i++) {
    		for (int j = 0; j < img.getWidth(); j++) {
    			Color color = new Color(img.getRGB(j, i));
    			if (!isBlackAndWhite(color, tolerance)) {
    				return false;
    			}
    		}
    	}
    	return true;
    }
     
    /**
     * Teste si une couleur est "en noir et blanc", c'est-à-dire si elle est un
     * dégradé de gris
     * 
     * @param color
     *              une couleur à tester
     * @param tolerance [0.0-1.0]
     *              écart toléré dans la nuance de gris ; ex: TRUE si [250, 251, 250] à 1%
     * @return false si la couleur n'est pas un dégradé de gris
     */
    public static boolean isBlackAndWhite(Color color, float tolerance) {
    	assert tolerance >= 0.0f && tolerance <= 1.0f;
    	float ref = avg(color.getRed(), color.getGreen(), color.getBlue()) / 255.0f;
    	return areSimilar(ref, color.getRed() / 255.0f, tolerance)
    			&& areSimilar(ref, color.getGreen() / 255.0f, tolerance)
    			&& areSimilar(ref, color.getBlue() / 255.0f, tolerance);
    }
     
    private static float avg(int... values) {
    	int sum = 0;
    	for (int i : values) {
    		sum += i;
    	}
    	return sum / values.length;
    }
     
    private static boolean areSimilar(float f1, float f2, float tolerance) {
    	return Math.abs(f1 - f2) <= tolerance;	//DEBUG on part du principe que f1 et f2 sont positifs...
    }

  3. #3
    Membre éclairé
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Par défaut proposition, pour le "remplissage"
    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
    /**
     * Teste si une image est "blanche", c'est-à-dire si elle est
     * composée de couleurs proches du blanc, en indiquant leur proportion.
     * 
     * @param img
     *              une image à tester
     * @param tolerance [0.0-1.0]
     *              écart toléré dans la nuance de blanc ; ex: TRUE si [254, 253, 255] à 1% (soit 0.01f)
     * @return la proportion de pixels "blancs" trouvés dans l'image
     */
    public static float isWhite(BufferedImage img, float tolerance) {
    	int nbPxl = 0;
    	for (int i = 0; i < img.getHeight(); i++) {
    		for (int j = 0; j < img.getWidth(); j++) {
    			Color color = new Color(img.getRGB(j, i));
    			if (isWhite(color, tolerance)) {
    				nbPxl++;
    			}
    		}
    	}
    	return ((float) nbPxl) / (img.getHeight() * img.getWidth());
    }
     
    /**
     * Teste si une couleur est "blanche", c'est-à-dire si elle est plus ou moins claire.
     * 
     * @param color
     *              une couleur à tester
     * @param tolerance [0.0-1.0]
     *              écart toléré dans la nuance de blanc ; ex: TRUE si [254, 253, 255] à 1% (soit 0.01f)
     * @return false si la couleur n'est pas assez proche du blanc [255, 255, 255]
     */
    public static boolean isWhite(Color color, float tolerance) {
    	assert tolerance >= 0.0f && tolerance <= 1.0f : "la tolérance doit être comprise entre 0 et 1 (soit 0% et 100%)";
    	return areSimilar(1.0f, color.getRed() / 255.0f, tolerance)
    			&& areSimilar(1.0f, color.getGreen() / 255.0f, tolerance)
    			&& areSimilar(1.0f, color.getBlue() / 255.0f, tolerance);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 03/05/2015, 23h29
  2. [FAQ] Comment paramétrer les boxplots : couleurs, statistiques, etc. ?
    Par fafabzh6 dans le forum Contribuez
    Réponses: 0
    Dernier message: 23/10/2012, 17h02
  3. Mixage de Couleurs
    Par exxos dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 29/05/2002, 13h34
  4. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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