Detection de contour [Résolu/Fermé]

Messages postés
35
Date d'inscription
dimanche 24 septembre 2006
Dernière intervention
17 juillet 2007
- 6 avril 2007 à 01:01 - Dernière réponse :
Messages postés
12271
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 novembre 2018
- 29 mars 2014 à 07:18
salam

j ai une image blanc et noir , je voulais faire une detection de contour et un suivi de contour .
y t il une methode simple ?
Afficher la suite 

15 réponses

Meilleure réponse
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Dernière intervention
4 mars 2013
6 avril 2007 à 09:36
3
Merci
C'est du noir et blanc uniquement ou des niveaux de gris ?


Si c'est uniquement du noir et blanc, il te suffit de détecter sur les
lignes ou les colonnes le passage du noir au blanc, et inversement
(deux petites boucles imbriquées qui parcourent ton image).


Si c'est du niveau de gris, il faut utiliser un filtre :

1 0 -1

1 0 -1

1 0 -1

Pour obtenir les contour horizontaux puis un filtre :

1 1 1

0 0 0

-1 -1 -1

Pour les contour verticaux.

Merci cs_DARKSIDIOUS 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Meilleure réponse
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
6 avril 2007 à 10:13
3
Merci
Salut:

Il y a aussi le filtre Laplacien:

0  -1  0
-1  4 -1
0  -1  0

Bon on l'a essayé sur l'image de lena et ça marche bien.


________________________________________________________________________________
A.B. : 
"Dieu nous donne des mains, mais il ne bâtit pas les ponts"

Merci Ombitious_Developper 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Meilleure réponse
Messages postés
5293
Date d'inscription
dimanche 4 mai 2003
Dernière intervention
19 novembre 2018
6 avril 2007 à 10:49
3
Merci
Salut,

les filtres proposés ci-dessus peuvent s'utiliser avec ConvolveOp

import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
//....
BufferedImage source = ...//image à filtrer
//....
float[] filter = { 0f, -1f, 0f, -1f, 4f, -1f, 0f, -1f, 0f };//filtre proposé par [auteurdetail.aspx?ID=237842 Ombitious_Developper]
//ou (Si c'est du niveau de gris, il faut utiliser un filtre)
//float[] filter = { 1f, 0f, -1f, -1f, 0f, -1f, 1f, 0f, -1f };//filtre proposé par [auteurdetail.aspx?ID=13557 DARKSIDIOUS]
//ou ( Pour obtenir les contour horizontaux puis un filtre)

//float[] filter = { 1f, 1f, 1f, 0f, 0f, 0f, -1f, -1f, -1f };//filtre proposé par [auteurdetail.aspx?ID=13557 DARKSIDIOUS]
//....
Kernel kernel = new Kernel(3, 3, filter);
ConvolveOp op = new ConvolveOp(kernel);
BufferedImage result = op.filter(source, null);
//result est représente l'image filtrée

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA

Merci Twinuts 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
6 avril 2007 à 11:05
0
Merci
Salut:

Twinuts >> Avec ConvolveOp.filtre () j'obtient toujours une exception et je ne sais pas pourquoi.


________________________________________________________________________________
A.B. : 
"Dieu nous donne des mains, mais il ne bâtit pas les ponts"
Messages postés
5293
Date d'inscription
dimanche 4 mai 2003
Dernière intervention
19 novembre 2018
6 avril 2007 à 11:45
0
Merci
Salut,

qu'elle exception ? (perso jamais eu de prob avec si ce n'est un joli OutOfMemory sur une grande image, c'est pour cela que je favorise mes filtres en JNI, C/C++ ou ASM avec du mmx/sse selon si ils sont dispo ou non ainsi je maitrise mieux la gestion du filtre et j'arrive à trouver un palliatif en cas de mémoire insufisante)

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
7 avril 2007 à 01:27
0
Merci
Salut:

J'ai une exception de type "image ne peut être convoluée"


________________________________________________________________________________
A.B. : 
"Dieu nous donne des mains, mais il ne bâtit pas les ponts"
Messages postés
35
Date d'inscription
dimanche 24 septembre 2006
Dernière intervention
17 juillet 2007
12 avril 2007 à 12:17
0
Merci
deus boucles inbriquéé donne rien
si je fais boucles sur les lignes l images sera traité horizentalement . si je fais boucles sur colonnes l images sera traité verticalments .

quoi faire donc ?
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Dernière intervention
4 mars 2013
12 avril 2007 à 12:24
0
Merci
Il faut justement combiner les deux traitements : d'abord horizontalement, puis verticalement afin d'obtenir tout les contours.
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Dernière intervention
4 mars 2013
12 avril 2007 à 12:25
0
Merci
Voir ma source par exemple :
http://www.vbfrance.com/codes/TRACER-CONTOURS-IMAGE_28385.aspx

Bon c'est du vb, mais ca peut être facilement traduit en java.
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
12 avril 2007 à 18:51
0
Merci
Salut:

Le filtre Laplacien permet de bien tracer les coutours sur les discontinuités et les variations bruques des couleurs. Nous avons fait une étude mathématique entière pour démontrer les coefficients de ce filtre.


________________________________________________________________________________
A.B. : 
"Dieu nous donne des mains, mais il ne bâtit pas les ponts"
Messages postés
35
Date d'inscription
dimanche 24 septembre 2006
Dernière intervention
17 juillet 2007
2 mai 2007 à 01:49
0
Merci
salam ,

j arrive pas a trouver une methode qui consiste a construire une nouvelle  image mais dont chaque pixels a pour valeur la difference du pixel (i,j) et celle du pixel (i-1,j) .
j ai trouvé dans un livre que l image est repté en cycle donc on doit faire Img(i)(j)-Img(i-1)(j)
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
2 mai 2007 à 19:32
0
Merci
Salut:

Bon, je ne suis pas professionel en imagerie.

Un filtre associé à ce calcul (img [i][j]-img[i-1][j]) peut être écrit sous la forme de {-1, 1}

Utilises le code de Twinuts avec ce filtre.

float filter [] = {-1.0f, 1.Of};
Kernel kernel = new Kernel (2, 1, filter);

Note:
Comme je t'ai dit je ne suis pas sûr.

Bonne chance.
Messages postés
35
Date d'inscription
dimanche 24 septembre 2006
Dernière intervention
17 juillet 2007
22 juin 2007 à 07:02
0
Merci
salam , le code si dessus represente un filtre pour les images blancs et noirs . mais quand je le teste il donne pas les resultats esperés . y a t il des erreurs dans mon code

class FiltreNegatif extends RGBImageFilter {
    private int [] data ;
    private int width ;
    private int height ;
    public FiltreNegatif(Image image) {
        // POUR S'ASSURER QUE TOUTE L'IMAGE A ETAIT CHARGEE
        // PAR LA SUITE DETERMINER SES DIMENSIONS
        ImageIcon icon = new ImageIcon (image);
       
        width  = icon.getIconWidth();
        height = icon.getIconHeight();
        data   = new int [width * height];
       
        try {
            PixelGrabber pg = new PixelGrabber(image,
                    0,
                    0,
                    width,
                    height,
                    data,
                    0,
                    this.width);
            pg.grabPixels();
        } catch (InterruptedException err) {
            throw new RuntimeException("Chargement interrompu ...");
        }
    }
   
    public int filterRGB(int x, int y, int rgb)  {
        if (y == 0) {
            return rgb ;
        }
       
        if (x == 0) {
            return rgb ;
        }
       
        int yprevious = y - 1 ;
        if (yprevious < 0 ) {
            yprevious = width - 1;
        }
       
        int xprevious = x - 1 ;
        if (xprevious < 0 ) {
            xprevious = height - 1;
        }
       
        int ypreviousRGB = data[width*x + yprevious] ;
        int xpreviousRGB = data[x + xprevious*height] ;
       
        int a1 = (rgb >> 24) & 0xFF;


        int r1 = (rgb >> 16) & 0xFF;
        int g1=  (rgb >> 8)  & 0xFF;
        int b1=  rgb  & 0xFF;
       
        int r2 = (ypreviousRGB >> 16) & 0xFF;
        int g2 = (ypreviousRGB >> 8) & 0xFF ;
        int b2 =  ypreviousRGB & 0xFF;
       
        int r3 = (xpreviousRGB >> 16) & 0xFF;
        int g3 = (xpreviousRGB >> 8) & 0xFF ;
        int b3 =  xpreviousRGB & 0xFF;
       
        int r4 = r2 - r1 ;
        int g4 = g2 - g1 ;
        int b4 = b2 - b1 ;
       
        int r5 = r3 - r1 ;
        int g5 = g3 - g1 ;
        int b5 = b3 - b1 ;
       
        int r6 =(int) (Math.sqrt((r4*r4)+(r5*r5)));
        int g6 = (int)(Math.sqrt((g4*g4)+(g5*g5)));
        int b6 = (int) (Math.sqrt((b4*b4)+(b5*b5)));
       
         return   ((a1<<24)+(r6 << 16) + (g6 << 8) + b6);
       //    return   ((a1<<24)+(r5 << 16) + (g5 << 8) + b5);
    }
}
0
Merci
salam ..
Vous pouvez trouver de l'aide En utilisant OpenCV bibliothèque.
.. Il est une bibliothèque open source.
Messages postés
12271
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 novembre 2018
- 29 mars 2014 à 07:18
Bonjour, merci pour cette intervention, mais ce sujet a été marqué résolu par le demandeur, il y a 7 ans déjà.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.