Detection de contour

Résolu
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 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 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 ?

14 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
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 38
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 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 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 38
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 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 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 38
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 Membre Dernière intervention 4 mars 2013 130
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 Membre Dernière intervention 4 mars 2013 130
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 38
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 38
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 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
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
Rejoignez-nous