Detection de contour

Résolu/Fermé
najah01_3
Messages postés
35
Date d'inscription
dimanche 24 septembre 2006
Statut
Membre
Dernière intervention
17 juillet 2007
- 6 avril 2007 à 01:01
Whismeril
Messages postés
17349
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
29 mai 2022
- 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 ?
A voir également:

14 réponses

cs_DARKSIDIOUS
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
131
6 avril 2007 à 09:36
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.
3
Ombitious_Developper
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
6 avril 2007 à 10:13
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"
3
Twinuts
Messages postés
5372
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
24 mai 2022
111
6 avril 2007 à 10:49
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
3
Ombitious_Developper
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
6 avril 2007 à 11:05
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"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Twinuts
Messages postés
5372
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
24 mai 2022
111
6 avril 2007 à 11:45
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
0
Ombitious_Developper
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
7 avril 2007 à 01:27
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"
0
najah01_3
Messages postés
35
Date d'inscription
dimanche 24 septembre 2006
Statut
Membre
Dernière intervention
17 juillet 2007

12 avril 2007 à 12:17
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 ?
0
cs_DARKSIDIOUS
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
131
12 avril 2007 à 12:24
Il faut justement combiner les deux traitements : d'abord horizontalement, puis verticalement afin d'obtenir tout les contours.
0
cs_DARKSIDIOUS
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
131
12 avril 2007 à 12:25
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.
0
Ombitious_Developper
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
12 avril 2007 à 18:51
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"
0
najah01_3
Messages postés
35
Date d'inscription
dimanche 24 septembre 2006
Statut
Membre
Dernière intervention
17 juillet 2007

2 mai 2007 à 01:49
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)
0
Ombitious_Developper
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
2 mai 2007 à 19:32
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.
0
najah01_3
Messages postés
35
Date d'inscription
dimanche 24 septembre 2006
Statut
Membre
Dernière intervention
17 juillet 2007

22 juin 2007 à 07:02
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
salam ..
Vous pouvez trouver de l'aide En utilisant OpenCV bibliothèque.
.. Il est une bibliothèque open source.
0
Whismeril
Messages postés
17349
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
29 mai 2022
596
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à.
0