Detection de contour [Résolu/Fermé]

najah01_3 35 Messages postés dimanche 24 septembre 2006Date d'inscription 17 juillet 2007 Dernière intervention - 6 avril 2007 à 01:01 - Dernière réponse : Whismeril 11411 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 avril 2018 Dernière intervention
- 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

cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 6 avril 2007 à 09:36
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 6 avril 2007 à 10:13
+3
Utile
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"
Cette réponse vous a-t-elle aidé ?  
Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscription 20 avril 2018 Dernière intervention - 6 avril 2007 à 10:49
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 6 avril 2007 à 11:05
0
Utile
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"
Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscription 20 avril 2018 Dernière intervention - 6 avril 2007 à 11:45
0
Utile
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
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 7 avril 2007 à 01:27
0
Utile
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"
najah01_3 35 Messages postés dimanche 24 septembre 2006Date d'inscription 17 juillet 2007 Dernière intervention - 12 avril 2007 à 12:17
0
Utile
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 ?
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 12 avril 2007 à 12:24
0
Utile
Il faut justement combiner les deux traitements : d'abord horizontalement, puis verticalement afin d'obtenir tout les contours.
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 12 avril 2007 à 12:25
0
Utile
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.
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 12 avril 2007 à 18:51
0
Utile
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"
najah01_3 35 Messages postés dimanche 24 septembre 2006Date d'inscription 17 juillet 2007 Dernière intervention - 2 mai 2007 à 01:49
0
Utile
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)
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 2 mai 2007 à 19:32
0
Utile
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.
najah01_3 35 Messages postés dimanche 24 septembre 2006Date d'inscription 17 juillet 2007 Dernière intervention - 22 juin 2007 à 07:02
0
Utile
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
Utile
1
salam ..
Vous pouvez trouver de l'aide En utilisant OpenCV bibliothèque.
.. Il est une bibliothèque open source.
Whismeril 11411 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 avril 2018 Dernière intervention - 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.