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

Langage Java Discussion :

Analyse d'une image


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 14
    Par défaut Analyse d'une image
    Bonjour, je développe un système distribué:

    un client envoit un fichier .pov à un dispatcher
    le dispatcher le découpe et l'envoit à de worker
    le worker génère une colonne du rendu3D avec povray et renvoient l'image.

    En fait pour le moment ma découpe est fixe, je fais XColonnes et chaque worker recoit une nouvelle colonne à générer une fois qu'il à fini la colonne précédente.

    En fait, je pensais lancer la génération du fichier pov sur le dispatcher en plus petite résolution genre 120 par 60 avec une option qui me sort un histogramme d'utillisation du cpu qui représente l'image total à généré, il est toujours en gris
    et là ou les zones sont plus foncées sur l'histogramme, c'est là ou le CPU a travaillé plus.
    On voit clairement que si je fais plusieurs colonne que parfois il n'y a pas de raison vu que les contour de l'image sont tout clair.
    Un exemple ici
    http://new.math.uiuc.edu/im2006/prue/pix/menger.jpg


    En fait je me demandais comment je pouvais faire pour analyser en quelques sorte l'image en gris clair en petit pour savoir comment découper l'image?

    Je pensais à fixer un certain niveau de gris (int) une fois ce niveau passé couper en X...

    Si vous pouviez m'éclairer... ou si vous avez des idées,

    Merci

    Piki

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 14
    Par défaut
    En fait mon idée se serait prendre des tranche de largeur 10 par exemple
    et de hauteur = hauteur de l'image (ainsi c'est des colonnes)

    Calculer les niveau de gris foncé dans cette tranche, si c'est trop clair, ca voudrait dire que c'est trop facile pour n'assigner que ca à un worker, on regarde donc si on peut ajouter la tranche suivante à celle là et ainsi de suite, jusqu'à ce que ca dépasse un certain seuil,


    C'est possible? ou pas ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 14
    Par défaut
    Eventuellement est ce que c'est envisageable de mettre de pixel dans un tableau?

    Si plus la couleur est foncée plus la valeur est haute,
    je peux faire des tranche de d'image qui ont somme de colonne inférieure à un certain poids?

  4. #4
    Membre expérimenté Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Par défaut
    Bonsoir piki, ou bonjour

    Et oui c'est une très bonne idée d'analyser les pixels. Ca peut éviter d'envoyer des colonnes qui sont tous de la même couleur.

    Pour récupérer les pixels d'une image utilse la Class PixelGrabber();
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int pixels [] = new int[imageSize.width * imageSize.height];
    PixelGrabber pgrabber = new PixelGrabber(image, 0, 0, imageSize.width, imageSize.height, 	pixels, 0,  imageSize.width);
    pgrabber.grabPixels();
    // tu fais les modifications nécessaires aux pixels
    // puis tu peux contruire un BufferedImage:
    imageContainer.buffimage = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_INDEXED) ;
    imageContainer.buffimage.setRGB(0, 0, iw, ih, pixels, 0, iw);

    Attention de ne pas abuser ! Ca prend beaucoup de ressource ex:
    une image 4000 * 3000 pixels = un tableau de 12000000 Integer * 4 octets par integer = 48000000 octet = 45MB ! en mémoire . Le JVM réserve par défaut 64 MB par application. Au delà, une OutOfMemoryError exception est levée. Faut prévoir d'augmenter cette valeur si besoin est...

    Remarque qu'il est un peu difficile de travailler avec un tableau d'UNE SEULE DIMENSION de pixels ( int pixels [] ). On a plustôt l'habitude de travailler avec des images en 2 dimension soit width, height. Donc les pixels sont insérés dans le tableau de gauche à droite. Pour créer un tel tableau on doit fournir au PixelGrabber un scansize (c'est le dernier paramètre) cela correspond généralement à la largeur de l'image.

    pour obtenir la valeur d'un pixel avec la position (X, y):
    int pix = pixels[scansize * y + x];

    Maintenant, ta la couleur d'un pixel verison Interger tu ne peux pas vraiment les comparer entre eux (sauf les couleur identique). ex:
    int grisPale;
    int grisFonce = grisPale + 1; // ERREUR !!
    grisFonce peu être n'importe quoi même rose
    La raison c'est qu'il y a quatre informations dans une couleur integer:
    Red, green, blue et Alpha (transparence de l'image). Comme il y a 4 octets par Integer ca donne un type byte par info. Chaque information est "bit-shifted" dans le même Integer. Pourquoi faire simple quand on faire compliqué ! Donc les infos sont stocké sur 32 bits de la facon suivante:

    AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB
    1111111110000000000000000000000000
    0000000001111111100000000000000000
    etc..

    voici un code pour obtenir chacune des info dans un tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public static int [] getARGB(int color){
    			int result [] = new int[4];
    			result[0] = ((color >>24 ) & 0xFF); 	// alpha
    			result[1] = ((color >>16 ) & 0xFF); 	// red
    			result[2] = ((color >>8 ) & 0xFF);	// green
    			result[3] = (color & 0xFF);			// blue
    			return result;
    		}

Discussions similaires

  1. Réponses: 9
    Dernier message: 10/10/2012, 11h38
  2. Analyse d'une image
    Par thierrybatlle dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 11/07/2012, 14h57
  3. analyse spectrale d'une image
    Par tweety22 dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 20/04/2009, 11h03
  4. [Turbo Pascal] Peut-on utiliser GetPixel pour analyser une image sans l'afficher ?
    Par _Hope_ dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 01/01/2009, 22h07
  5. analyse d'une image
    Par floopi51 dans le forum Traitement d'images
    Réponses: 34
    Dernier message: 09/12/2008, 11h44

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