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

Java Discussion :

Programme filtre jaune [Débutant(e)]


Sujet :

Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 5
    Par défaut Programme filtre jaune
    Bonjour à tous,

    Je suis en terminale S options sciences de l'ingénieur et pour le bac nous devons rendre un projet. Mon projet cible un drone de reconnaissance permettant de connaitre la taille d'une zone incendiée. Pour cela, avec une caméra il prend une photo de la zone en question. Que fait le java ici me direz-vous ? On y vient..

    Je dois créer un programme qui convertit les pixels de l'image "correspondant à du feu" en jaune et le reste en blanc.
    J'en ai donc conclu que mon programme devait analyser chaque pixel de l'image :
    - si le pixel possède une intensité de rouge et de vert respectivement supérieures à 180 et 200 ( soit une couleur proche de celle du feu) il doit être remplacé par un pixel d'intensité de rouge et de vert de 255 chacun afin d'obtenir du jaune.
    - si le pixel possède ne possède pas les intensités souhaitées, on le remplace par un pixel d'intensité de rouge de vert et de bleu de 255 afin d'obtenir du blanc.

    Le problème est que je ne sais absolument pas coder en java, ni en aucun autre langage ; j'en appelle donc à votre aide . J'ai à ma disposition le logiciel "Java's cool 4".
    Si vous pouvez me renseigner sur mon programme, m'envoyer le lien d'un programme qui filtre une couleur ou le programme directement, vous m'aideriez beaucoup.

    Merci d'avance,
    Logan.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Je ne peux pas te dire pour Java's Cool (ce n'est pas du Java, mais un truc qui se base dessus et simplifie soi-disant), mais en Java, pour faire le remplacement de pixel dont tu parles, tu peux simplement utiliser une instance de Bufferedimage. La méthode getRGB(x, y) te donne la couleur rgba (srgb) du pixel de coordonnées x et y. Tu peux extraire chaque composante par opérations bitwise, ou simplement utiliser la classe Color :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Color color =  new Color(image.getRGB(x,y),true);
    int rouge = color.getRed();
    int vert= color.getGreen();
    int bleu = color.getBlue();
    Ensuite, la méthode setRgb(x, y, rgb) te permattra de réaffecter la couleur de ton choix (rgb) au pixel de coordonnées x et y. Pour réobtenir le rgb à partir de composantes rouge, verte et bleue, tu peux faire : int rgb=new Color(rouge,vert,bleu).getRGB().

    En cherchant sur le net "BufferedImage et Java's Cool" tu devrais pouvoir trouver des exemples qui te permettront de réaliser ton programme complet.

    En revanche, je ne suis pas sûr que la détection de feu en elle-même sera très efficace par ce moyen.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 5
    Par défaut
    Me revoilà,
    Après quelques recherches j'obtiens un programme qui est celui-ci. Je tiens à préciser que je ne comprends pas forcément toutes les lignes car je me suis basé sur des programmes déjà faits. J'aimerai donc avoir votre avis ou des conseils afin d'améliorer mon programme. Merci d'avance.
    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
    BufferedImage image = seuillageImage(); 
    if (image != null) 
          result = new BufferedImage(image.getWidth(), image.getHeight(),BufferedImage.TYPE_INT_RGB); 
     
          for (int y = 1; y < image.getWidth()-1; y++) 
          { 
             for (int x=1; x < image.getHeight()-1; x++) 
             { 
                 int rgb = image.getRGB(y, x); // récupere la valeur RGB du pixel 
     
             int valR = (int) (getRed(rgb)); 
                 if(valR>180)
                    int valG = (int) ((getGreen(rgb)))
    			   if valG>200
    			     int valB = (int) ((getBlue(rgb)))
    			       if valB<40
    			         setRGB(y, x, makeRGB(255, 255, 0)); 
                    	  else 
                   	    setRGB(y, x, makeRGB(255, 255, 255)); 
                      else 
                        setRGB(y, x, makeRGB(255, 255, 255)); 
                 else 
                   setRGB(y, x, makeRGB(255, 255, 255)); 
                            } 
        }

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Peut-être commencer par nous montrer un programme capable de compiler et un minimum lisible (il manque les blocs des ifs, c'est parfaitement illisible, même avec l'indentation un peu près correcte) et syntaxiquement correcte (qui, sans forcément les méthodes et les imports, compile).

    Pourquoi ne traites-tu pas la ligne au bord ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 103
    Par défaut
    Simplifier tes conditions avec quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for (int x = 1; x < image.getHeight() - 1; x++)
    				{
    					int rgb = image.getRGB(y, x); // récupere la valeur RGB du pixel 
     
    					if ((getRed(rgb) > 180) && (getGreen(rgb) > 200) && (getBlue(rgb) < 40))
    						result.setRGB(y, x, makeRGB(255, 255, 0));
    					else
    						result.setRGB(y, x, makeRGB(255, 255, 255));
     
    				}
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 5
    Par défaut
    Etant vraiment novice je ne savais pas ce que c'était que compiler. Donc après avoir compilé et simplifié le programme, j'obtiens ceci, Est-ce bon ?
    Merci d'avance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void main() {
    load(image); //mettre le lien url de l'image
    BufferedImage image = seuillageImage(); 
    if (image != null) 
    result = new BufferedImage(image.getWidth(), image.getHeight(),BufferedImage.TYPE_INT_RGB); 
    for (int y = 1; y < image.getWidth()-1; y++);  
    for (int x=1; x < image.getHeight()-1; x++); 
    int rgb = image.getRGB(y, x); 
    int valR = (int) (getRed(rgb)); 
    if ((getRed(rgb) > 180) && (getGreen(rgb) > 200) && (getBlue(rgb) < 40))
      setRGB (y, x , makeRGB(255, 255, 0));
    else setRGB (y, x , makeRGB(255, 255, 255));
    }

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Compiler ça veut dire transformer le code source Java en code exécutable (appelé bytecode), sous-entendu qui s'exécute (sinon quand ça ne compile pas, on a des erreurs de compilation et on ne peut pas exécuter).

    Maintenant, indenter son code rend aussi sa lecture plus aisée.

    Attention, quand tu écris un point-virgule juste après un for, comme dans for (int y = 1; y < image.getWidth()-1; y++);, ça ferme le for. Ce qui se trouve après ne fait pas partie du for.

    Ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(int i=0;i<10; i++);
    {
       System.out.println("bonjour");
    }
    for(int i=0;i<10; i++)
    {
       System.out.println("au revoir");
    }
    affiche 1 fois "bonjour" et 10 fois "au revoir" !

    En plus, les variables déclarées dans le for sont locales au for : aucun autre code en dehors ne peut les voir et y accèder.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=0;i<10; i++);
    {
       System.out.println(i);
    }
    Ne peut pas compiler parce que i est déclaré dans le for, et, donc n'est pas visible dans le bloc après, qui ne fait pas partie du for. Donc ça ne compile pas. Tout comme ton code.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 5
    Par défaut
    Ok j'ai compris la nuance pour les ; avec les for.
    Je crois donc avoir bien compilé. Lorsque je fais vérifier la compilation de mon programme, mon programme me dit :
    Erreur de syntaxe ligne 8 :
    ('.class' expected) Il manque des accolades ou des parenthèses pour définir l'instruction
    int rgb = image.getRGB(y, x);
    ^

    Erreur de syntaxe ligne 9 :
    ('.class' expected) Il manque des accolades ou des parenthèses pour définir l'instruction
    int valR = (int) (getRed(rgb));
    Je ne sais pas solutionner ce problème, Est-ce que quelqu'un aurait la réponse?
    J'ai essayé d'intender à voir si c'est bon.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void main() {
    	load(image); //mettre le lien url de l'image
    	BufferedImage image = seuillageImage(); 
    	if (image != null) 
    		result = new BufferedImage(image.getWidth(), image.getHeight(),BufferedImage.TYPE_INT_RGB); 
    	for (int y = 1; y < image.getWidth()-1; y++)  
    	for (int x=1; x < image.getHeight()-1; x++)
    		int rgb = image.getRGB(y, x); 
    		int valR = (int) (getRed(rgb)); 
    	if ((getRed(rgb) > 180) && (getGreen(rgb) > 200) && (getBlue(rgb) < 40))
    		setRGB (y, x , makeRGB(255, 255, 0));
    	else setRGB (y, x , makeRGB(255, 255, 255));
    }
    Encore un énorme merci pour toute l'aide indispensable que vous me procurez.

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    En fait, il y a tellement d'erreurs dans ton code, que le compilateur sort la première qu'il pense détecter, mais il ne faut pas vraiment en tenir compte. Quand il y a trop d'erreurs, souvent le compilateur affiche une erreur qui n'est forcément la vraie erreur.

    1. déjà, je suppose que ta méthode main, elle se trouve dans une classe (parce que tu ne nous montres pas justement la déclaration de la classe, donc on ne peut être sûr de rien)
    2. ensuite, une variable doit toujours être déclarée pour pouvoir être utilisée. Toujours déclarée avant son utilisation dans la séquence d'instruction.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      load(image); //mettre le lien url de l'image
      	BufferedImage image = seuillageImage();
      Ici, dans ces 2 lignes, tu déclares une variable image de type BufferedImage. Mais la ligne d'avant tu fais référence à cette variable comme paramètre d'appel de la méthode load. Ce n'est pas possible de faire ça : ça ne peut pas compiler.
    3. ensuite, je suppose qu'il y a bien les imports des classes externes que tu utilises, à commencer par l'importe de java.awt.image.BufferedImage.
    4. et je suppose que les méthodes que tu invoques sont bien déclarées dans ta classe (je parle de getRed(), getBlue(), makeRGB, tout ça. Idem pour la variable result (que tu as dû mettre sous forme d'attribut, malgré qu'une variable locale aurait été plus judicieux, mais bon, il y a plus important à régler avant ça)


    Je t'ai parlé du problème du ; pour le for, mais j'ai aussi mis des exemples avec des blocs : les machins entre accolades. Ces blocs ont aussi leur importance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (int y = 1; y < image.getWidth()-1; y++)  
    for (int x=1; x < image.getHeight()-1; x++) 
    			int rgb = image.getRGB(y, x); 
    			int valR = (int) (getRed(rgb));
    ne compile pas. Parce que s'il n'y a pas de ; juste après le for, alors c'est le ; de l'instruction juste après qui ferme le for. Donc ton for (int y... est composé d'une seule instruction, le for(int x=1... et le for(int x=1;... n'est formée que d'une seule instruction, la ligne int rgb = image.getRGB(y, x);La ligne int valR = (int) (getRed(rgb)); est en dehors du for, et comme elle fait référence à la variable rgb, qui n'existe que dans le for, elle ne compile pas.
    Pour pouvoir mettre plusieurs instruction dans un for, comme dans un if d'ailleurs, il faut les mettre dans un bloc, parce que si on peut mettre une instruction dans un for, on peut aussi mettre un bloc.
    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (int y = 1; y < image.getWidth()-1; y++)  
    		for (int x=1; x < image.getHeight()-1; x++) {
    			int rgb = image.getRGB(y, x); 
    			int valR = (int) (getRed(rgb)); 
    		if ((getRed(rgb) > 180) && (getGreen(rgb) > 200) && (getBlue(rgb) < 40))
    			setRGB (y, x , makeRGB(255, 255, 0));
    		else setRGB (y, x , makeRGB(255, 255, 255));
    }
    D'ailleurs personnellement, je préfère toujours mettre des blocs, je trouve ça plus clair, et si j'ai besoin d'ajouter des instructions, je peux le faire sans penser à ajouter les { }.
    Donc j'écrirais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for (int y = 1; y < image.getWidth()-1; y++)  {
        for (int x=1; x < image.getHeight()-1; x++) {
    	int rgb = image.getRGB(y, x); 
    	int valR = (int) (getRed(rgb)); 
    	if ((getRed(rgb) > 180) && (getGreen(rgb) > 200) && (getBlue(rgb) < 40)) {
    	    setRGB (y, x , makeRGB(255, 255, 0));
            } else {
    	   getRGB (y, x , makeRGB(255, 255, 255));
            }
        }
    }
    et on voit où les choses commencent et où elles se terminent.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 5
    Par défaut
    De retour pour vous jouer de mauvais tour.
    Donc j'ai un peu avancé durant cette semaine (j'ai lu plusieurs trucs sur la programmation mais c'est pas facile ).
    Il y a ici tout le programme :
    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
    public class Filtre {
    void main() {
    	import java.awt.image.BufferedImage;
    	BufferedImage image = seuillageImage(); 
    	load(image); //mettre le lien url de l'image
    		if (image != null) 
    		result = new BufferedImage(image.getWidth(), image.getHeight(),BufferedImage.TYPE_INT_RGB); 
    	for (int y = 1; y < image.getWidth()-1; y++)  {
         for (int x=1; x < image.getHeight()-1; x++) {
    	int rgb = image.getRGB(y, x); 
    	int valR = (int) (getRed(rgb)); 
    	if ((getRed(rgb) > 180) && (getGreen(rgb) > 200) && (getBlue(rgb) < 40)) {
    	    setRGB (y, x , makeRGB(255, 255, 0));
            } else {
    	   getRGB (y, x , makeRGB(255, 255, 255));
            }
        }
    }
    }
    }
    Cependant je ne suis pas sur d'avoir saisi cette histoire de déclaration de variable alors il se peut qu'il manque des choses.
    Est ce que ce programe est déjà mieux que le précédent?

Discussions similaires

  1. programme filtre median
    Par wahidred dans le forum Images
    Réponses: 1
    Dernier message: 20/12/2010, 09h11
  2. Comment concevoir une chaîne de filtre par programme ?
    Par franck SEFIC dans le forum Bases de données
    Réponses: 2
    Dernier message: 30/11/2007, 15h21
  3. programmer un filtre after effect
    Par hipe dans le forum Développement 2D, 3D et Jeux
    Réponses: 5
    Dernier message: 17/05/2007, 20h16
  4. Programmation du filtre sur les Dates
    Par Alpha31 dans le forum Access
    Réponses: 5
    Dernier message: 26/06/2006, 09h21
  5. Programmation d'un filtre particulier sur formulaire
    Par student dans le forum Access
    Réponses: 2
    Dernier message: 24/02/2006, 12h34

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