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 :

Detection contours filtre sobel


Sujet :

2D Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut Detection contours filtre sobel
    Bonjour,

    J'essaye d'appliquer un filtre sobel à mon image pour détecter les contours.
    Je travaille sur une image en niveau de gris et lorsque je clique sur mon bouton rien ne s'affiche dans mon label.
    Voici mon code :

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) {                                           
     
            int x1 = jLabel1.getWidth();
            int y1 = jLabel1.getHeight();
     
            int w = imgglobal.getWidth();
            int h = imgglobal.getHeight();
     
            BufferedImage imageBord = new BufferedImage(imgglobal.getWidth(),imgglobal.getHeight(), imgglobal.getType());
     
            //****************************
            int sobel_x[][] = { {-1,0,1},
                                {-2,0,2},
                                {-1,0,1}};
     
            int sobel_y[][] = {{-1,-2,-1},
                                {0,0,0},
                                {1,2,1}};
     
            int pixel_x;
            int pixel_y;
     
     
            for (int x=1; x < w-2; x++) {
                for (int y=1; y < h-2; y++) {
     
     
                    pixel_x = (sobel_x[0][0] * imgglobal.getRGB(x-1,y-1)) + (sobel_x[0][1] * imgglobal.getRGB(x,y-1)) + (sobel_x[0][2] * imgglobal.getRGB(x+1,y-1)) +
                        (sobel_x[1][0] * imgglobal.getRGB(x-1,y))   + (sobel_x[1][1] * imgglobal.getRGB(x,y))   + (sobel_x[1][2] * imgglobal.getRGB(x+1,y)) +
                        (sobel_x[2][0] * imgglobal.getRGB(x-1,y+1)) + (sobel_x[2][1] * imgglobal.getRGB(x,y+1)) + (sobel_x[2][2] * imgglobal.getRGB(x+1,y+1));
     
                    pixel_y = (sobel_y[0][0] * imgglobal.getRGB(x-1,y-1)) + (sobel_y[0][1] * imgglobal.getRGB(x,y-1)) + (sobel_y[0][2] * imgglobal.getRGB(x+1,y-1)) +
                        (sobel_y[1][0] * imgglobal.getRGB(x-1,y))   + (sobel_y[1][1] * imgglobal.getRGB(x,y))   + (sobel_y[1][2] * imgglobal.getRGB(x+1,y)) +
                        (sobel_y[2][0] * imgglobal.getRGB(x-1,y+1)) + (sobel_y[2][1] * imgglobal.getRGB(x,y+1)) + (sobel_x[2][2] * imgglobal.getRGB(x+1,y+1));
     
                    int val = (int)Math.sqrt((pixel_x * pixel_x) + (pixel_y * pixel_y));
     
                    if(val < 0)
                    {
                       val = 0;
                    }
     
                    if(val > 255)
                    {
                       val = 255;
                    }
     
                    imageBord.setRGB(x,y,val);
                }
            }
            //****************************
                    imgglobal = imageBord;
     
                    imagelabel = imgglobal.getScaledInstance(x1,y1,Image.SCALE_DEFAULT);
                    //pour recadrer mon image dans mon label
     
                    convol = new ImageIcon(imagelabel);
     
                    jLabel1.setIcon(convol);
        }
    Avez-vous une idée ? merci beaucoup

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    1. Le JLabel dans lequel tu places l'image est-il bien placé, directement ou indirectement, dans le contentPane d'une fenêtre (JFrame) ?
    2. Le problème pourrait également venir des dimensions du JLabel, puisqu'elles te servent à redimensionner l'image ? Un petit System.out.println(x1+" "+y1) juste pour être sûr...
    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
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Merci

    Oui le JLabel est bien dans le ContentPane de ma fenêtre.
    Et les dimensions sont bonnes.

    J'ai décidé d'utiliser une autre méthode :

    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
    int x1 = jLabel1.getWidth();
            int y1 = jLabel1.getHeight();
     
            BufferedImage imageX = new BufferedImage(imgglobal.getWidth(),imgglobal.getHeight(), imgglobal.getType());
            BufferedImage imageY = new BufferedImage(imgglobal2.getWidth(),imgglobal2.getHeight(), imgglobal2.getType());
            BufferedImage imageXY = new BufferedImage(imgglobal2.getWidth(),imgglobal2.getHeight(), imgglobal2.getType());
                    float[ ] masqueX = 
                    {
                            1f, 2f, 1f,
                            0f, 0f, 0f,
                            -1f, -2f, -1f
                    };
     
                    float[ ] masqueY = 
                    {
                            1f, 0f, -1f,
                            2f, 0f, -2f,
                            1f, 0f, -1f
                    };
     
                    Kernel masque1 = new Kernel(3, 3, masqueX);
                    Kernel masque2 = new Kernel(3, 3, masqueY);
                    ConvolveOp opération1 = new ConvolveOp(masque1);
                    ConvolveOp opération2 = new ConvolveOp(masque2);
                    opération1.filter(imgglobal, imageX);
                    opération2.filter(imgglobal2, imageY);
     
     
     
                    imgglobal = imageX;
                    imgglobal2 = imageY;
                    imagelabel = imgglobal.getScaledInstance(x1,y1,Image.SCALE_DEFAULT);
                    imagelabel2 = imgglobal2.getScaledInstance(x1,y1,Image.SCALE_DEFAULT);
     
                    convol = new ImageIcon(imagelabel);
                    convol2 = new ImageIcon(imagelabel2);
     
     
     
                    jLabel1.setIcon(convol);
                    //jLabel1.setIcon(convol2);
    J'obtiens alors bien deux images une avec le grandient de X une avec celui de Y.
    Nom : bordsX.PNG
Affichages : 809
Taille : 209,1 KoNom : bordsY.PNG
Affichages : 800
Taille : 215,3 Ko

    J'ai besoin maintenant de superposer ces deux images pour n'en former qu'une seule.
    Dois-je jouer avec la transparence ?

    Merci beaucoup.

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Je ne suis pas un spécialiste du traitement d'images, mais je ne pense pas que ça se résout par transparence, non.

    Je dirais plutôt une combinaison, de l'ordre de celle que tu as fait dans ton premier code (racine carrée ( x*x + y*y)) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    double[] arrayX=null, arrayY=null;
                    BufferedImage imageBord = new BufferedImage(imgglobal.getWidth(),imgglobal.getHeight(), imgglobal.getType()); 
     
            		for (int x = 0; x < imgglobal.getWidth(); ++x) {
            		    for (int y = 0; y < imgglobal.getHeight(); ++y) {
            		    	arrayX = imageX.getRaster().getPixel(x,y,arrayX);
            		    	arrayY = imageY.getRaster().getPixel(x,y,arrayY);
            		        imageBord.getRaster().setPixel(x, y, hypot(arrayX,arrayY));
            		    }
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private static double[] hypot(double[] arrayX, double[] arrayY) {
    		double[] hypot = new double[arrayX.length];
    		for(int i=0; i<hypot.length; i++) {
    			hypot[i] = Math.hypot(arrayX[i], arrayY[i]);
    		}
     		return hypot;
    	}
    Attention, la taille du tableau dépend du type d'image.
    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
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Un grand merci

    Je n'avais pas pensé à le faire avec des tableaux.
    Pour la taille du tableau pas de problème j'impose à mes images le même type tout le temps.
    Merci beaucoup.

    En cadeau ma patate avec les deux gradients (X et Y)
    Nom : XY.PNG
Affichages : 837
Taille : 295,5 Ko

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

Discussions similaires

  1. Superposition de contours de Sobel (segmentation)
    Par endoudech dans le forum OpenCV
    Réponses: 0
    Dernier message: 27/05/2009, 12h16
  2. [Débutant] conv2 filtre sobel+image.jpg
    Par Astraya dans le forum Images
    Réponses: 5
    Dernier message: 17/03/2009, 23h26
  3. faire apparaitre le contour d'une image par filtre SOBEL
    Par bilzzbenzbilz dans le forum Traitement d'images
    Réponses: 33
    Dernier message: 04/03/2009, 18h18
  4. Detection contour image bruitée
    Par picsou42 dans le forum Traitement d'images
    Réponses: 24
    Dernier message: 14/05/2008, 13h55

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