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

Langage Java Discussion :

variation spatiale des couleurs


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 25
    Par défaut variation spatiale des couleurs


    Grâce à Pseudocode, j'ai pu mettre en pratique ma théorie sur la quantification de la variation spatiale des couleurs afin de faire un distingo entre les images CGI et les véritables photos, telle que définie ci-dessous:
    Nous avons utilisé l'observation que les changements de couleurs se produisent dans une moindre mesure de pixels en pixels dans les CGIs que dans les photographies.
    La raison est probablement parce que les photographies contiennent de vrais scènes et objets avec beaucoup de changements de couleurs naturelles, tandis que les CGIs n'ont pas un tel luxe en raison des limitations inhérentes au dessin avec une palette de couleur limitée.
    Afin de mesurer la variation spatiale des couleurs, pour chaque pixel des images, nous avons déterminé l'orientation du plan le mieux adapté à un voisinage 5*5 centré sur le pixel concerné. Après normalisation des triplets <R, G, B> vers nR, nG, nB, alors une variation alpha peut être obtenu par:

    là où la distance Euclidienne de chaque Pixel dans le voisinage 5*5 du pixel central se résume et est normalisée par le chiffre 25.
    Voici le code correspondant:
    Code Java : 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
    package spatial;
     
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
     
     
    public class spatialvariation {
     
    	public static void main(String[] args)throws Exception {
     
    		// lecture de l'image
    		BufferedImage image = null; 
    		try {
    			image = ImageIO.read(new File("1.bmp"));
    		} catch (IOException e) {
    			e.printStackTrace();
    			return;
    		}
     
    	}
    		// retourne un triplet de couleur normé
    		public static double[] getRGB(BufferedImage image, int x, int y) {
    			int argb = image.getRGB(x,y);
    			int a = (argb >>24 ) & 0xFF;
    			int r = (argb >>16 ) & 0xFF;
    			int g = (argb >> 8 ) & 0xFF;
    			int b = argb & 0xFF;
    			double norme = Math.sqrt(r*r + g*g + b*b);
    			return new double[] {r/norme, g/norme, b/norme};
    		}
     
    		public static double getAlpha(BufferedImage image, int x, int y) {
    			double alpha=0;
     
    			// triplet central
    			double[] rgb_0 = getRGB(image,x,y); 
     
    			// pour tout le voisinage 5x5 = [-2,-1,0,1,2]x[-2,-1,0,1,2]
    			for(int dy=-2;dy<=2;dy++) {
    				for(int dx=-2;dx<=2;dx++) {
     
    					// coordonnées du voisin
    					int y_i = y+dy;
    					int x_i = x+dx;
     
    					// gestion des bords
    					if (y_i<0) y_i=0;
    					if (y_i>=image.getHeight()) y_i=image.getHeight()-1;
    					if (x_i<0) x_i=0;
    					if (x_i>=image.getWidth()) x_i=image.getWidth()-1;
     
    					// triplet du voisin
    					double[] rgb_i = getRGB(image,x_i,y_i);
     
    					// calcul de alpha
    					double delta_r = rgb_i[0]-rgb_0[0];
    					double delta_g = rgb_i[1]-rgb_0[1];
    					double delta_b = rgb_i[2]-rgb_0[2];
    					alpha+=Math.sqrt( delta_r*delta_r + delta_g*delta_g + delta_b*delta_b );
    				}
    			}
     
    			return alpha/25;
    		}
     
    }
    J'ai essayé aussi avec un
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    private static BufferedImage image;
    entre public class et public static void main; mais dans les deux cas, je n'ai rien en sortie (sous Eclipse), pas de bug ni de message d'erreur....RIEN.
    J'ai dû faire une erreur dans le code concernant l'output de mon image, mais je débute en Java et je ne vois pas où.....

    Quelqu'un peux m'aider??
    Merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Dans la méthode main tu charges l'image et ensuite ... tu ne fais rien ! Donc il ne se passe pas grance chose

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 25
    Par défaut
    Citation Envoyé par the-gtm Voir le message
    Dans la méthode main tu charges l'image et ensuite ... tu ne fais rien ! Donc il ne se passe pas grance chose
    Ben mais si! J'ai mon Public Static Double pour la variation spatiale elle-même?? A moins que j'ai oublié la partie du code pour l'output de la valeur avec un System.Out.Printin à la fin?? Dois-je l'inclure dans ma méthode main ou peut-il être séparé? Et que dois-je lui attribuer?

    Désolé pour mon "inculture", je fais ce que je peux pour apprendre!!

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Ce que tu as fait c'est déclarer une classe (spatialvariation) qui a trois méthodes statiques (main, getRGB et getAlpha). Si tu indente ton code correctement, tu verras que getRGB et getAlpha ne sont pas dans main, mais dans spatialvariation.

    La méthode main est le point d'entrée de ton programme, quand on arrive au bout il s'arrête. Comme dans main tu n'appelle jamais getRGB ni getAlpha, ces méthodes ne sont jamais exécutées.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 25
    Par défaut
    Citation Envoyé par the-gtm Voir le message
    Ce que tu as fait c'est déclarer une classe (spatialvariation) qui a trois méthodes statiques (main, getRGB et getAlpha). Si tu indente ton code correctement, tu verras que getRGB et getAlpha ne sont pas dans main, mais dans spatialvariation.

    La méthode main est le point d'entrée de ton programme, quand on arrive au bout il s'arrête. Comme dans main tu n'appelle jamais getRGB ni getAlpha, ces méthodes ne sont jamais exécutées.
    OK, mille merci, j'ai compris le principe: donc j'ai indenté mon code de façon à y inclure les deux méthodes getRGB et getAlpha, là forcément, j'ai plein d'erreurs, puisque ma méthode main ne connait pas getRGB et getAlpha, n'est ce pas?

    Donc, maintenant il me faut aussi appeller dans mon main getRGB et getAlpha avec un
    try { , c'est bien ça?
    mais que puis-je mettre de cohérent pour ma main-class après?

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Tu ne peux pas mettre un méthode dans une autre, les méthodes sont dans une classe. Donc tes trois méthodes doivent être les unes à la suite des autres.

    Par contre une méthode peut en appeler une autre, par exemple dans ton code, getAlpha appelle getRGB.

    Il faut que trouve un cours de Java et/ou de programmation, parce que là il te manque les bases : tu vas finir par trouver une solution à ton problème mais tu n'auras pas progressé au passage.

Discussions similaires

  1. [Débutant] [bar3] variation de la couleur en fonction de la hauteur des barres
    Par martineaston dans le forum MATLAB
    Réponses: 10
    Dernier message: 27/06/2013, 09h36
  2. TValueListEditor : Avoir des couleurs différentes par rangée
    Par Griswold dans le forum Composants VCL
    Réponses: 2
    Dernier message: 06/08/2004, 20h41
  3. Des couleurs en mode console
    Par davcha dans le forum MFC
    Réponses: 3
    Dernier message: 08/05/2004, 15h37
  4. [Debutant] gestion des couleurs ??
    Par MaxiMax dans le forum OpenGL
    Réponses: 5
    Dernier message: 26/03/2004, 09h34
  5. pb pour modifier la luminositée des couleurs
    Par mathieutlse dans le forum Langage
    Réponses: 2
    Dernier message: 08/01/2003, 15h45

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