probleme de fichier TIIF trop volumineux

Forum sur les autres logiciels de dessin 2D sous Linux.
kilibibi
P'tit timide
P'tit timide
Messages : 3
Inscription : 19 juil. 2006, 14:30

probleme de fichier TIIF trop volumineux

Message par kilibibi »

Bonjour
J'ai un gros probleme: je doit lire un fichier tiff qui contient une image satellite soit 450 mo (20600x20600 pixels)
J'ai essayé un premier programme mais ca ne marche pas le fichier est trop gros . ce programme lit bien les petits fichiers tiff mais la j'ai aucun resultat

Je veux juste pouvoir reccuperer les valeurs des pixels de l'image et les mettre dans un vecteur ou une matrice. Si quelq'un a une idée ??

Code : Tout sélectionner

#include<stdlib.h>
#include<iostream>
#include<string.h>
#include "Matrice.h"
#include"..\tiff-3.8.2\libtiff\tiffio.h"
using namespace std;

int main()
{
   char *nom="OR.tif";
   uint32 w,h;
   TIFF *image;
   tsize_t stripSize;
   unsigned long imageOffset, result;
   int stripMax, stripCount;
   unsigned char *buffer;
   double *dest;
   unsigned long  MemoireTaille;
   uint32 i,n=1;

   // Open the TIFF image
   image = TIFFOpen(nom, "r");

   //Donne largeur et hauteur de l'image
   TIFFGetField(image, TIFFTAG_IMAGEWIDTH, &w);
   TIFFGetField(image, TIFFTAG_IMAGELENGTH, &h);

   stripSize = TIFFStripSize (image);
   stripMax = TIFFNumberOfStrips (image);
   imageOffset = 0;
   
   MemoireTaille = stripMax * stripSize;
   unsigned long t = MemoireTaille*sizeof(unsigned char);
   buffer = new unsigned char[t];
   for (stripCount = 0; stripCount < stripMax; stripCount++)
   {
      result = TIFFReadRawStrip (image, stripCount, buffer + imageOffset, stripSize);
      imageOffset += result;
   }
   unsigned long t2= MemoireTaille*sizeof(double);
   

             dest = new double[t2];
      
   for(i=0;i<MemoireTaille;i++)
      dest[i]=(double)buffer[i];



   TIFFClose(image);
   free(buffer);



   cout<<"nombre de colonnes: "<<h<<endl;
   cout<<"nombre de lignes: "<<w<<endl;
   system("pause");
return 0;
}
:? :? :?

KiBi
Que quelqu'un le fasse taire!
Que quelqu'un le fasse taire!
Messages : 901
Inscription : 27 déc. 2004, 01:57
Localisation : Brest, Dijon
Contact :

Message par KiBi »

Salut et bienvenue chez nous,

« (20600x20600 pixels) », comme tu dis, ça fait 450 Mo. Et pour adresser tant de mémoire d'un coup, ça fait vraiment énorme. Pour quel type d'opérations as-tu besoin de récupérer les valeurs des pixels sous forme de matrice ? En fonction du type, tu dois pouvoir travailler par carreau dans ton image, par exemple 100x100, ce qui ne pose normalement aucun problème au niveau de la mémoire à réserver. @ bientôt.

laetmo
Moulin à paroles
Moulin à paroles
Messages : 464
Inscription : 07 sept. 2005, 18:18
Localisation : marseille

Message par laetmo »

Code : Tout sélectionner

   unsigned long t = MemoireTaille*sizeof(unsigned char);
   buffer = new unsigned char[t];
   for (stripCount = 0; stripCount < stripMax; stripCount++)
   {
      result = TIFFReadRawStrip (image, stripCount, buffer + imageOffset, stripSize);
      imageOffset += result;
   }
   unsigned long t2= MemoireTaille*sizeof(double);
   dest = new double[t2];
     
   for(i=0;i<MemoireTaille;i++)
      dest[i]=(double)buffer[i];


OMG...

déjà aussi bien

Code : Tout sélectionner

unsigned long t = MemoireTaille*sizeof(unsigned char);
   buffer = new unsigned char[t];

que

Code : Tout sélectionner

unsigned long t2= MemoireTaille*sizeof(double);
   dest = new double[t2];

sont faux;
c'est:

Code : Tout sélectionner

 
buffer = new unsigned char[MemoireTaille];

et

Code : Tout sélectionner

 
dest = new double[MemoireTaille];


Ensuite.

Code : Tout sélectionner

for(i=0;i<MemoireTaille;i++)
      dest[i]=(double)buffer[i];

la conversion ne se fait pas toute seule...
le unsigned char est codé sur 8 octets: de 0x00 à 0xFF
tu as 3 à 4 valeurs unsigned char à chaque pixel. (rouge vert bleu eventuellement alpha)
ca te donne un double qui les regroupe.

ca fait aussi qu'au début peut étre que c'etait
buffer = new unsigned char[MemoireTaille*3 ou 4];

donc tu dois revoir les specs du tiff et tout le tralala avec google.
[i]-Merci de modifier le titre de votre sujet en y ajoutant [b][Résolu][/b] ou [b][Terminé] [/b]lorsque vous avez la réponse à vos questions.
-Le langage SMS est fortement [b]réprouvé[/b] et sera durement [b]réprimé[/b][/i]

kilibibi
P'tit timide
P'tit timide
Messages : 3
Inscription : 19 juil. 2006, 14:30

KiBi

Message par kilibibi »

merci d'avoir répondu..
en fait je fait du traitement d'image j'ai deja fait un premier programme sous MATLAB qui marche effectivement avec des découpe de tuile dans l'image. seulement le but est de detourer des lacs dans les images avec les contours actifs ce qui utilise toutes les opérations matrice vecteurs... pour certain lacs (fleuves) il prenne toute l'image et dans beaucoup de cas il m'est plus avantageux de travailler sur toute l'image. Sinon beaucoup de cas seront intraitable enfin pas en 6 mois en tout cas

je dois maintenant recoder mon programme en c++ ou c mais je dois commencer par lire une image satellite et la ca bugggggg!!
MATLAB arrive a stocker l'image dans une matrice. ca devrait pouvoir se faire en c++ non ?

KiBi
Que quelqu'un le fasse taire!
Que quelqu'un le fasse taire!
Messages : 901
Inscription : 27 déc. 2004, 01:57
Localisation : Brest, Dijon
Contact :

Message par KiBi »

MATLAB doit travailler à coup de cache, en fonction des données sur lesquelles tu travailles. C'est implémentable en C ou C++, mais ça demande un peu de travail (parce qu'allouer 450 Mo d'un coup, c'est assez irréaliste).

laetmo
Moulin à paroles
Moulin à paroles
Messages : 464
Inscription : 07 sept. 2005, 18:18
Localisation : marseille

Message par laetmo »

tu veux stocker les pixels entiers ou les vals RGB(A) ?
[i]-Merci de modifier le titre de votre sujet en y ajoutant [b][Résolu][/b] ou [b][Terminé] [/b]lorsque vous avez la réponse à vos questions.
-Le langage SMS est fortement [b]réprouvé[/b] et sera durement [b]réprimé[/b][/i]

kilibibi
P'tit timide
P'tit timide
Messages : 3
Inscription : 19 juil. 2006, 14:30

kibi

Message par kilibibi »

mais images sont en niveaux de gris.

bolbol71
Nouveau venu
Nouveau venu
Messages : 1
Inscription : 05 sept. 2006, 15:09
Contact :

Message par bolbol71 »

moi j'ai essayé matlab mais le probleme avec lu c'est qu'il ne gere pas la memoire, un 450 mo c'est trop gros pour lui , je conseille plutot c++
[url=http://www.liste-des-annuaires.com]liste annuaires[/url]

Répondre