Page 1 sur 1

probleme de fichier TIIF trop volumineux

Publié : 19 juil. 2006, 14:33
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;
}
:? :? :?

Publié : 19 juil. 2006, 15:04
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.

Publié : 19 juil. 2006, 15:10
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.

KiBi

Publié : 19 juil. 2006, 15:45
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 ?

Publié : 19 juil. 2006, 15:48
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).

Publié : 19 juil. 2006, 15:48
par laetmo
tu veux stocker les pixels entiers ou les vals RGB(A) ?

kibi

Publié : 19 juil. 2006, 15:51
par kilibibi
mais images sont en niveaux de gris.

Publié : 05 sept. 2006, 15:43
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++