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

Java Discussion :

Gros problème traitement d'image satellite de très grande taille


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2012
    Messages : 25
    Points : 18
    Points
    18
    Par défaut Gros problème traitement d'image satellite de très grande taille
    bonjour à tous, je viens à vous car je suis actuellement stagiaire dans un centre de recherche et je développe un logiciel qui affiche les images satellite, malheureusement je n'arrive pas à afficher les images très haute résolution. L'erreur pour moi viens principalement de ma boucle for mais je ne vois qu'est ce que ça peut être. Excusez moi si ce n'est pas assez clair( j'ai commencé il y a deux semaine)

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    //w largeur de l'image, h heuteur de l'image, filename nom du fichier 
    RAWimage(String filename, int w, int h){
     
    	try{
     
    		if (w < 6000 && h < 6000){
    		fis = new FileInputStream(filename);
     
    		datarray = new byte[w*h];
     
    		fis.read(datarray);
     
    		bufdatabyte = new DataBufferByte(datarray,w*h);
     
    		initLUT();
     
    		icm = new IndexColorModel(8,256,lut[0],lut[1],lut[2]);
     
    		sm = new BandedSampleModel(DataBuffer.TYPE_BYTE,w,h,1);
     
    		point = new Point(0,0);
     
    		raster = Raster.createWritableRaster(sm,bufdatabyte,point);
     
    		bufimage = new BufferedImage(w,h,BufferedImage.TYPE_BYTE_INDEXED,icm);
     
    		bufimage.setData(raster);
     
    		planim= new RenderedImageAdapter(bufimage);
    		}
    		else
                    // MON PROBLEME EST ICI pour les image dont la résolution est supérieur a 6000*6000
    		{
    			int step,
    			k=0,
    			H= w/2,
    			L= h/5;
    			fis = new FileInputStream(filename);
                            // on crée un tableau 2 dimensions d'octet qui va enregistrer les octet necessaire pour afficher l'image 
     
    			dataTab = new byte[H][L];
     
     // on crée un tableau 1 dimension qui va enregister une ligne d'octet de la taille de la largeur d'une ligne de l'image
     
    			byte []tabPxl = new byte[L];
     
     
     
    			for(int i = 0; i <H-1 ;i++)
    			{	
    						// on lit une premiere ligne d'octet
    						fis.read(tabPxl);
                                                   // on insere un octet ou pixel sur 4 afin de réduire l'image 
    						for(step = 0; step<L-1;step+=4){
                                                           // on gère les débordement de tableau
    							if(step == L-1){
    								dataTab[i][L-1]= tabPxl[L-1];
    							}
    							else
     
    							{// on insère les octet dans le tableau 2 dimensions
    								dataTab[i][k]= tabPxl[step];
    								k++;
                                                              // si la ligne est terminé on ré-initialise l'indice de parcours de la ligne du tableau 2 dimensions
    								if(k == L-1){
    									k =0;
    								}
     
    							}
     
    						}
                                                    // on saute 3 ligne d'octet afin d'avoir 1 pixel sur 3 en hauteur aussi
    						for(int j = 0; j<2; j++){
    							fis.read(tabPxl);
    						}
     
    			}
    			// on insere notre tableau dans un buffer de byte
    			bufdatabyte = new DataBufferByte(dataTab,L*H);
     
    			initLUT();
     
    			icm = new IndexColorModel(8,256,lut[0],lut[1],lut[2]);
     
    			sm = new BandedSampleModel(DataBuffer.TYPE_BYTE,L,H,1);
     
    			point = new Point(0,0);
     
    			raster = Raster.createWritableRaster(sm,bufdatabyte,point);
     
    			bufimage = new BufferedImage(L,H,BufferedImage.TYPE_BYTE_INDEXED,icm);
     
    			bufimage.setData(raster);
     
    			planim= new RenderedImageAdapter(bufimage);
     
    		}

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Tu n'aurais pas d'erreur dans ta console genre un "out of memory" ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2012
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Tu n'aurais pas d'erreur dans ta console genre un "out of memory" ?
    non par contre j'ai l'erreur :

    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2957
    at java.awt.image.DataBufferByte.getElem(Unknown Source)
    at java.awt.image.BandedSampleModel.getPixels(Unknown Source)
    at java.awt.image.Raster.getPixels(Unknown Source)
    at java.awt.image.BufferedImage.setData(Unknown Source)
    at packages.rawimage.RAWimage.<init>(RAWimage.java:110)
    at packages.rawimage.RAWimage.create(RAWimage.java:130)
    at packages.rawimage.ReadImage.getImage(ReadImage.java:51)
    at packages.ihm_image.VisuTite.ChangeImage(VisuTite.java:475)
    at packages.ihm_image.VisuTite.ouvrirImageCLA(VisuTite.java:867)
    at packages.ihm_image.VisuTite$MenuItemActionListener.actionPerformed(VisuTite.java:536)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.AbstractButton.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par magid31 Voir le message
    non par contre j'ai l'erreur :

    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2957
    Ben cela signifie tout simplement que tu as une erreur dans ton algorythme, puisque tu vas récupérer un élément à un index inexistant...


    Au passage tu ne libères pas le flux que tu ouvres, et tu sembles tout conserver dans des attributs d'instances. Cela ne me semble pas très propre



    a++

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2012
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    for(int i = 0; i <H-1 ;i++)
    			{	
    						// on lit une premiere ligne d'octet
    						fis.read(tabPxl);
                                                   // on insere un octet ou pixel sur 4 afin de réduire l'image 
    						for(step = 0; step<L-1;step+=4){
                                                           // on gère les débordement de tableau
    							if(step == L-1){
    								dataTab[i][L-1]= tabPxl[L-1];
    							}
    							else
     
    							{// on insère les octet dans le tableau 2 dimensions
    								dataTab[i][k]= tabPxl[step];
    								k++;
                                                              // si la ligne est terminé on ré-initialise l'indice de parcours de la ligne du tableau 2 dimensions
    								if(k == L-1){
    									k =0;
    								}
     
    							}
     
    						}
                                                    // on saute 3 ligne d'octet afin d'avoir 1 pixel sur 3 en hauteur aussi
    						for(int j = 0; j<2; j++){
    							fis.read(tabPxl);
    						}
    Merci, justement vous pensez qu'il faudrait modifier quoi dans cette boucle parce qu'a vrai dire sa fait pas mal de temps que j'y suis et j'ai essayé vraiment beaucoup de solutions.

  6. #6
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par magid31 Voir le message
    Merci, justement vous pensez qu'il faudrait modifier quoi dans cette boucle parce qu'a vrai dire sa fait pas mal de temps que j'y suis et j'ai essayé vraiment beaucoup de solutions.
    Bah déja, je te conseillerais de dire quelle est est la ligne correspondant au fichier RAWimage.java ligne 110. Ca nous evitera de chercher le probleme et ca t'aidera peut etre à voir l'erreur

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2012
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    double reducteur = 2.5;
    			int
    			// hauteur de l'image ( nombre de ligne) réduite
    			H= (int) (h/reducteur),
    			//largeur de l'image (nombre de colonne)réduite
    			L= (int) (w/reducteur);
    			//récupération du fichier en fonction de son nom
    			fis = new FileInputStream(filename);
    			// création d'un tableau de taille largeur * hauteur réduites
    			dataTab = new byte[H*L];
    			// création d'un tableau de taille résolution original/résolution réduite
    			// afin de lire le fichier par paquet d'octet
    			byte []tabPxl = new byte[(h*w)/(H*L)];
     
    						// lecture du premier paquet d'octet
    						fis.read(tabPxl);
    						//boucle de remplissage du tableau qui contient les octets pour
    						// l'image réduite
    						for(int j = 0; j<dataTab.length;j++){
     
    								dataTab[j]=tabPxl[tabPxl.length -1];
    								fis.read(tabPxl);
     
    						}
    			// buffer de byte dans lequel on enregistre notre tableau d'octet 
    			bufdatabyte = new DataBufferByte(dataTab,L*H);
    			// initialisation des couleur de classifications de l'image
    			initLUT();
     
    			icm = new IndexColorModel(8,256,lut[0],lut[1],lut[2]);
     
    			sm = new BandedSampleModel(DataBuffer.TYPE_BYTE,L,H,1);
     
    			point = new Point(0,0);
     
    			raster = Raster.createWritableRaster(sm,bufdatabyte,point);
     
    			bufimage = new BufferedImage(L,H,BufferedImage.TYPE_BYTE_INDEXED,icm);
     
    			bufimage.setData(raster);
     
    			planim= new RenderedImageAdapter(bufimage);
     
    		}
    Donc voila le nouveau code que j'ai réalisé, dans celui la mon image s'affiche mais le problème est qu'au lieu de m'afficher l'image dans la résolution voulu, le programme m'affiche plusieurs fois l'image à la suite( cf piece jointe, ligne rouge ). De plus l'image met 2 min à charger( sachant que c'est une image de 399mo, 14788*27635).
    Et le pire dans tous ça c'est que l'erreur doit être quelque chose de stupide mais je n'arrive pas à la voir, donc j'aurai vraiment besoin d'aide svp !!!
    Images attachées Images attachées  

  8. #8
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Pour moi, dans ce cas, il y à 2 possibilités :

    - Soit ton image générée n'est pas bonne (duplication des données).
    - Soit ton affichage répète l'image passée en paramétré (je parierai dessus sans lire le code précédent).

    Donc essaye de sauver l'image dans un fichier (bmp, png, jpg peut importe) et de regarder si elle semble correcte et la tu seras fixé sur le problème.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2012
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    La première option est juste car quand je sauvegarde l'image, celle-ci ne ressemble plus à grand chose tout les pixels sont mélangés... bref encore des problèmes, par contre je voudrais savoir si il n'y a pas des classe en java qui me permettrai de traiter ces images très haute résolution ?

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2012
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    j'ai enfin trouvé la solution, je la poste pour ceux qui auront les mêmes soucis que moi à l'avenir concernant la réduction d'image à partir d'un FileInputStream pour des images allant jusqu'à pratiquement 15000*30000 pixels

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    /*redimensionnement d'une image en fonction de sa largeur et sa hauteur original qui vont etre réduite
     * a partir du chemin d'accès representé par une chaine nomImg et d'un coefficient de réduction*/
    public static BufferedImage contractImage(int largeur, int hauteur, String nomImg,double reducteur) {
     
        try {
        	/* on récupère le  chiffre des unités de la largeur 
        	 * afin de définir le coefficient de réduction le plus
        	 * approprié pour un meilleur rendu de l'image */ 
        	switch(largeur%10){
     
    		case 0 : reducteur=5;
    		break;
    		case 5 : reducteur=5;
    		break;
    		case 9 : reducteur=3;
    		break;
    		case 3 : reducteur=3;
    		}
    		int i =0,
    		//hauteur de l'image ( nombre de ligne) réduite
    		H=(int)(hauteur/(reducteur)),
    		//largeur de l'image (nombre de colonne)réduite
    		L=(int)(largeur/(reducteur))
    		;
    		//récupération du fichier en fonction de son chemin d'accès
    		FileInputStream file = new FileInputStream(nomImg);
     
    		//creation d'un tableau de byte qui va permettre la lecture d'une ligne de l'image
    		// de la taille de la largeur
    		byte []tabPxl = new byte[largeur];
    		//création d'un tableau de byte  de taille résolution réduite
    		// qui va enregistrer les octets notre image réduite
    		dataTab = new byte[H*L];
     
     
    					/* lecture du premier paquet d'octet qui représente une ligne 
    					 de l'image car Java considère un fichier comme un flux continu d'octet*/
    					file.read(tabPxl);
    					//boucle de remplissage du tableau qui contient les octets pour
    					// l'image réduite
    					for(int j = 0; j<dataTab.length ;j++){
    						    // on récupère le pixel
    							dataTab[j]=tabPxl[i];
    							// on incrémente i qui va nous permettre de sauter 1 pixel sur le reducteur
    							// par exemple ici 1 pixel sur 5 en largeur
    							i+=reducteur;
    							// quand i atteint la taille d'une ligne de pixel on le réinitialise
    							// puis on lit un nombre de ligne equivalent au réducteur afin de 
    							// récupérer un 1 pixel sur 5 en hauteur aussi
    							if(i >= largeur){
    								i=0;
    								for(int x=0;x<=reducteur-1;x++){
    									file.read(tabPxl);
    								}
    							}
     
    					}
    					// on ferme le flux 
    					file.close();
     
    		// buffer de byte dans lequel on enregistre notre tableau d'octet 
    		bufdatabyte = new DataBufferByte(dataTab,H*L);
    		// on supprime les donnée du tableau afin de pouvoir réouvrir plusieurs images
    		dataTab =null;
    		// initialisation des couleur de classifications de l'image
    		initLUT();
    		// instanciation du modèle de couleur
    		icm = new IndexColorModel(8,256,lut[0],lut[1],lut[2]);
    		// création du modèle
    		sm = new BandedSampleModel(DataBuffer.TYPE_BYTE,L,H,1);
    		// initialisation du point d'originie
    		point = new Point(0,0);
    		// création du raster qui contient notre image
    		raster = Raster.createWritableRaster(sm,bufdatabyte,point);
    		//instanciation du bufferedImage
    		bufdata = new BufferedImage(L,H,BufferedImage.TYPE_BYTE_INDEXED,icm);
    		// insertion de l'image dans un  bufferedImage
    		bufdata.setData(raster);
    		} catch (IOException e) {
            e.printStackTrace();
        }
     
        return bufdata;
    }
    De plus en ce qui concerne les coefficients de réduction il faut savoir que tous les cas ne sont pas encore définis car je n'ai pas eu le temps de tous testé, il y aura forcement des modulo de largeur qui se termineront par 8,4,2,7... A vous de les définir !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème traitement d'image
    Par tex50 dans le forum Images
    Réponses: 3
    Dernier message: 29/11/2011, 10h20
  2. traitement d'image de très grande taille
    Par issane dans le forum Images
    Réponses: 4
    Dernier message: 03/06/2010, 07h50
  3. toolbox traitement d'images satellites
    Par jyjeanphi dans le forum Images
    Réponses: 1
    Dernier message: 02/04/2009, 18h10
  4. [Upload] GROS problème UPLOAD d'image !
    Par skarapace dans le forum Langage
    Réponses: 3
    Dernier message: 20/11/2006, 11h44
  5. problème de conversion de très très grande taille !
    Par Conficius dans le forum Langage
    Réponses: 2
    Dernier message: 05/11/2005, 22h14

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