compter les pixels non blancs dans une image au format de votre choix

compter les pixels non blancs dans une image au format de votre choix - Divers - Programmation

Marsh Posté le 30-07-2003 à 14:59:25    

voila le pb en gros :  
 
Je cherche à calculer la surface projetée sur un plan donné("ombre portée" ) d'une structure modélisée sous CATIA V5, pour différents point de vue de cette structure.
 
Comme j'ai environ 1200 points de vue à traiter, tout doit être automatisé (macros).
Pb, les différentes fonctions de CATIA ne me permettent pas de faire ce que je veux automatiquement.
 
Mon idée pour y parvenir consiste en plusieurs étapes:
 
1)choisir un point de vue donné
2)exporter une vue du modèle (fond blanc-noir-etc possible) dans un format au choix : bmp, jpeg, png, tiff,...
3)Compter le nombre de pixel non blancs dans cette image, ou faire "nb_pixel_total - nb_pixel_blancs"
4)calculer la surface équivalente en fonction du nb de pixel obtenu en 3)
 
Je vous passe les détails pour les étapes 1), 2) et 4).
 
Ce qui m'interresse c'est l'étape 3) : compter les pixels non blancs d'une image ==> avec le moyen que vous voulez (une appli existante ou une petite routine faite maison...)
 
et si possible pouvoir automatiser le traitement d'un "lot" d'images.
 
voilà. Un grand merci à celui qui aura la moindre petite idée ou conseil (à part "Abandonne!!)).
 
à vos cerveaux...
 
 
 


---------------
Shérida(n)² 19-148
Reply

Marsh Posté le 30-07-2003 à 14:59:25   

Reply

Marsh Posté le 30-07-2003 à 15:00:45    

message aux modérateurs : fausse alerte c'est moi qui ai appuyé sur le lien "prevenir les modérateurs"  :D


---------------
Shérida(n)² 19-148
Reply

Marsh Posté le 30-07-2003 à 15:00:53    

Citation :

Ce qui m'interresse c'est l'étape 3) : compter les pixels non blancs d'une image ==> avec le moyen que vous voulez (une appli existante ou une petite routine faite maison...)


 
quand tu dis non blanc, tu penses non blanc, ou "pas completement blanc, mais un peu quand meme" ?

Reply

Marsh Posté le 30-07-2003 à 15:01:22    

Sheridann a écrit :

message aux modérateurs : fausse alerte c'est moi qui ai appuyé sur le lien "prevenir les modérateurs"  :D  


 
C t pour faire au moins une vue, c'est ca ? :D

Reply

Marsh Posté le 30-07-2003 à 15:01:43    

le bmp est simple à lire, bien qu'il existe encore plus simple (ppm, etc)
 
ça devrait te poser problème de faire un petit programme pour compter les pixels.
 
la structure d'une image bmp http://www.daubnet.com/formats/BMP.html

Reply

Marsh Posté le 30-07-2003 à 15:03:08    

Sheridann a écrit :

message aux modérateurs : fausse alerte c'est moi qui ai appuyé sur le lien "prevenir les modérateurs"  :D  

merde, j'ai cru à un mec maso... t'es sur de pas en vouloir un peu?

Reply

Marsh Posté le 30-07-2003 à 15:06:19    

Qatia avec un Q ?  [:alphat]


Message édité par Taz le 30-07-2003 à 15:11:19
Reply

Marsh Posté le 30-07-2003 à 15:09:32    

chrisbk a écrit :

Citation :

Ce qui m'interresse c'est l'étape 3) : compter les pixels non blancs d'une image ==> avec le moyen que vous voulez (une appli existante ou une petite routine faite maison...)


 
quand tu dis non blanc, tu penses non blanc, ou "pas completement blanc, mais un peu quand meme" ?


 
ben comme je vais certainement devoir passer sur photoshop pour faire une macro de "recradrage", s'il le faut j'en profite pour faire un coup de "baguette magique" (si tu connais pas photoshop ==> c'est pour sélectionner les pixels qui ont a peu prés la même couleur) avec un tolérance pas trop serrée, puis je peint tout ça en blanc-blanc-complètement_blanc.


---------------
Shérida(n)² 19-148
Reply

Marsh Posté le 30-07-2003 à 15:11:23    

En quel langage tu veux faire ca ?

Reply

Marsh Posté le 30-07-2003 à 15:29:33    

Par exemple si tu prends le format BMP 24 bits non compressés ça devrait être super simple à condition d'avoir un peu de place sur ton disque car la taille de l'image est importante : (x*y*3)+54+(m*x) ou m est un nombre entre 1 et 3 pour que la longueur des lignes soit un multiple de 4.
 
Pour compter les pixels blanc (0xFFFFFF) il suffit d'ouvrir le fichier, de sauter les 54 premiers octets et de faire 'pixel_blanc++) chaque fois que tu as trois octets consécutifs à 255 ! (Avec quelques améliorations (pour se positionner correctement lors d'une nouvelle ligne ça devrait être bon).
 
C'est super facile à faire !

Reply

Marsh Posté le 30-07-2003 à 15:29:33   

Reply

Marsh Posté le 30-07-2003 à 15:36:11    

Voilà le programme écrit rapidment et salement !
 
unsigned char  tampon[50000];
int            largeur=0;
int            hauteur=0;
int            taille=0; /* Longueur d'une ligne (dans le fichier) */
int            nb_pixels=0;
int            nb_pixels_blancs=0;
int            i=0;
 
 
fichier=fopen(nom_du_fichier,"rt" );
if (fichier == (FILE*)NULL) return ERREUR;
if (fgets(tampon, 54, fichier) == NULL) return ERREUR;
largeur=(((((tampon[21] << 8) + tampon[20]) << 8) + tampon[19]) << 8) + tampon[18];
hauteur=(((((tampon[25] << 8) + tampon[24]) << 8) + tampon[23]) << 8) + tampon[22];
nb_pixels=largeur*hauteur;
taille=largeur*3;
if ( (taille % 4) != 0 ) taille+=4-(taille%4);
while (fgets(tampon, taille, fichier) != NULL)
 {
  for (i=0;i<largeur;i++)
   {
    if ( (tampon[i*3] == 255) && (tampon[(i*3)+1] == 255) && (tampon[(i*3)+2] == 255) ) (tampon[i*3] == 255)++;
   }
 }
fprintf(stdout, "nb_pixels_blancs = %d (%.2f).\n", ((double)nb_pixels_blancs/(double)nb_pixels)*100.00);
fprintf(stdout, "nb_pixels        = %d.\n", nb_pixels);

Reply

Marsh Posté le 30-07-2003 à 15:39:08    

mauvaise idée le tampon surtout de cette forme. soit pas de tampon, soit un tampon de ligne, soit tout le fichier en mémoire
 
en plus 500000 c'est meme pas divisible par 3, tu peux toujours courir

Reply

Marsh Posté le 30-07-2003 à 15:58:59    

Sheridann a écrit :

message aux modérateurs : fausse alerte c'est moi qui ai appuyé sur le lien "prevenir les modérateurs"  :D  


ListOfBoulaÿ add: Sheridann
A+,


Message édité par gilou le 30-07-2003 à 15:59:27

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 30-07-2003 à 16:03:19    

gilou a écrit :


ListOfBoulaÿ add: Sheridann
A+,


Faut par réveiller un ours qui hiberne c'est çà ?
 
gilou, tu sais que c'est l'été depuis un bout de temps maintenant :sarcastic:


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 30-07-2003 à 16:06:59    

Mara's dad a écrit :


Faut par réveiller un ours qui hiberne c'est çà ?
 
gilou, tu sais que c'est l'été depuis un bout de temps maintenant :sarcastic:  


Justement, en ete, je fais la fete et je modere moins :whistle:  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 30-07-2003 à 16:21:52    

Taz a écrit :

mauvaise idée le tampon surtout de cette forme. soit pas de tampon, soit un tampon de ligne, soit tout le fichier en mémoire
 
en plus 500000 c'est meme pas divisible par 3, tu peux toujours courir


comme je l'ai dis c'est fait très salement !
Mais de toute façon je ne lis pas 50000 octets à chaque fois !
Le première fois je 54 octets (entête du fichier bmp) et ensuite je lis ligne par ligne.
 
Donc ça ne me dérange pas et je ne voulais pas faire une allocation mémoire en fonction de la taille des lignes !

Reply

Marsh Posté le 30-07-2003 à 16:24:45    

ben en fait je connais les "bases" de la programmation et de l'algorythmique mais je n'ai pas bcq programmé sous VB, C++ etc
 
je compte importer le fichier bmp en texte dans une cellule d'un tableau Excell et compter le nb de caractères correspondant à la couleur que je recherche. (je sais c un peu bourrin et certainement moins perfommant qu'avec une vraie routine mais bon...)
 
tu connais une commande qui permet de faire ça sous excell ?


---------------
Shérida(n)² 19-148
Reply

Marsh Posté le 30-07-2003 à 16:26:12    

gilou a écrit :


ListOfBoulaÿ add: Sheridann
A+,


 
 :ange:  :sleep:  :heink:  :na:


---------------
Shérida(n)² 19-148
Reply

Marsh Posté le 30-07-2003 à 16:26:54    

ça va être la mort d'importer ça d'en excel! tu imagines qu'une image 100*100 fait déjà 100000 cellules?

Reply

Marsh Posté le 30-07-2003 à 16:33:23    

Taz a écrit :

ça va être la mort d'importer ça d'en excel! tu imagines qu'une image 100*100 fait déjà 100000 cellules?


 
ben non justement, comme il n'y a pas de séparateurs entre les différents pixels ça fait pas 100000 cellules de 1 pixel mais 1 cellule de 100000 caractères... ==> je suis pas franchement convaincu que ça change grand chose au pb mais bon :D  
 
merci quand-même de t'intéresser à mon pb.


---------------
Shérida(n)² 19-148
Reply

Marsh Posté le 30-07-2003 à 16:36:14    

franchement, si tes images sont simples, toutes au même format (genre bmp, 24 bits) c'est pas tres compliqué d'ecrire un programme pour faire ça. tu vas beaucoup t'embeter avec excel quie st pas fait pour ça, et ça va etre extrement lent

Reply

Marsh Posté le 30-07-2003 à 16:37:27    

Sheridann a écrit :


 
ben non justement, comme il n'y a pas de séparateurs entre les différents pixels ça fait pas 100000 cellules de 1 pixel mais 1 cellule de 100000 caractères... ==> je suis pas franchement convaincu que ça change grand chose au pb mais bon :D  
 
merci quand-même de t'intéresser à mon pb.


Et tu es sur qu'excel peut faire rentrer 100000 caractères dans une cellule? :heink:

Reply

Marsh Posté le 30-07-2003 à 16:43:23    

c clair kil risque de ne pas apprécier a plaisanterie ==> faudrait vraiment que je n'y mette à apprendre VB ou C++ :D


---------------
Shérida(n)² 19-148
Reply

Marsh Posté le 30-07-2003 à 16:47:11    

Sheridann a écrit :

c clair kil risque de ne pas apprécier a plaisanterie ==> faudrait vraiment que je n'y mette à apprendre VB ou C++ :D


En C/C++ ce serait assez vite fait je pense... [:skeye]  
Et si tu peux exporter en ppm encore plus!

Reply

Marsh Posté le 30-07-2003 à 16:48:41    

+1 pour le ppm

Reply

Marsh Posté le 30-07-2003 à 16:50:20    

Taz a écrit :

franchement, si tes images sont simples, toutes au même format (genre bmp, 24 bits) c'est pas tres compliqué d'ecrire un programme pour faire ça. tu vas beaucoup t'embeter avec excel quie st pas fait pour ça, et ça va etre extrement lent


 
comme je t'ai dit, je connais la programmation procédurale "classique" et je sais éditer et modifier des macros en "orienté objet" crées "automatiquemement" sous VB (dans Excell, Access).
 
Mais je ne pratique pas assez pour faire mon code moi-même sous VB ou C++ donc je ne connais pas les Propriètés et Méthodes vers lequelles pointer.
mais bon je vais voir ce que je peux faire en cha=erchant un peu.
 
Merci à tous...


---------------
Shérida(n)² 19-148
Reply

Marsh Posté le 30-07-2003 à 16:53:16    

Sheridann a écrit :


 
comme je t'ai dit, je connais la programmation procédurale "classique" et je sais éditer et modifier des macros en "orienté objet" crées "automatiquemement" sous VB (dans Excell, Access).
 
Mais je ne pratique pas assez pour faire mon code moi-même sous VB ou C++ donc je ne connais pas les Propriètés et Méthodes vers lequelles pointer.
mais bon je vais voir ce que je peux faire en cha=erchant un peu.
 
Merci à tous...


Bah en C/C++ ouvrir un fichier et en lire le contenu est très très simple...
D'ailleurs ca doit être facile de trouver des exemples de code pour lire du ppm, y compris dans le forum!

Reply

Marsh Posté le 30-07-2003 à 17:01:49    

pas con, je vais chercher


---------------
Shérida(n)² 19-148
Reply

Marsh Posté le 30-07-2003 à 17:05:16    

une classe C++ faites pour je sais plus qui
 
 

Code :
  1. #include <iostream>
  2. #include <sstream>
  3. #include <fstream>
  4. #include <string>
  5. #include <algorithm>
  6. #include <iterator>
  7. #include <vector>
  8. #include <stdexcept>
  9. using namespace std;
  10. struct PGMImage
  11. {
  12.   unsigned width;
  13.   unsigned height;
  14.   unsigned maxvalue;
  15.   unsigned char *pt;
  16.   class BadFile
  17.     : public exception
  18.   {};
  19.   ~PGMImage()
  20.   {
  21.     delete[] pt;
  22.   }
  23.   PGMImage(const char * name)
  24.     : width(0),
  25.       height(0),
  26.       maxvalue(0),
  27.       pt(0)
  28.   {
  29.     ifstream file(name, ios::binary);
  30.     if(file.fail())
  31.       {
  32. throw BadFile();
  33.       }
  34.     string line;
  35.     // 1ere ligne
  36.     getline(file, line);
  37.     bool binary = true;
  38.     if(line=="P5" )
  39.       {
  40. binary=true;
  41.       }
  42.     else if(line=="P2" )
  43.       {
  44. binary=false;
  45.       }
  46.     else
  47.       {
  48. throw BadFile();
  49.       }
  50.     // on saut le commentaire eventuel
  51.     getline(file, line);
  52.     if(line[0]=='#')
  53.       {
  54. getline(file, line);
  55.       }
  56.     // on obtient les dimensions
  57.     istringstream is(line);
  58.     is >> this->width >> this->height;
  59.     // la valeur max
  60.     file >> this->maxvalue;
  61.     // on lis les données
  62.     this->pt=new unsigned char [this->width*this->height];
  63.     if (binary)
  64.       {
  65. //We need to read a binary PGM file
  66. file.read(reinterpret_cast<char *>(this->pt), this->width * this->height);
  67.       }
  68.     else
  69.       {
  70. //We need to read in an ASCII file   
  71. copy(istream_iterator<unsigned>(file),
  72.      istream_iterator<unsigned>(),
  73.      this->pt);
  74.       }
  75.   }
  76. };
  77. int main()
  78. {
  79.   PGMImage i("macoch.pgm" );
  80.   // cout << i.width << ' ' << i.height << ' ' << i.maxvalue << "\n\n\n";
  81.   cout.write(reinterpret_cast<char *>(i.pt), i.width * i.height);
  82. }

Reply

Marsh Posté le 30-07-2003 à 17:11:54    

Taz a écrit :

une classe C++ faites pour je sais plus qui
 
 [cpp]#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <algorithm>
#include <iterator>
#include <vector>
#include <stdexcept>
...
 
...
 


 
ouaip c bien ce que je disais : fo vraiment que je me mette au C++
 
merci bcq mais là je ne suis plus.
 
si t'as le même genre de truc en VB je suis preneur, mais te prendspas trop la tête quand-même...
 
merci encore


---------------
Shérida(n)² 19-148
Reply

Marsh Posté le 30-07-2003 à 17:17:56    

you don't know me....

Reply

Marsh Posté le 30-07-2003 à 17:22:18    

Sheridann a écrit :


ouaip c bien ce que je disais : fo vraiment que je me mette au C++
 
merci bcq mais là je ne suis plus.


T'inquiètes pas c'est normal...Taz c'est un intégriste C++ [:ddr555]  
En cherchant un brin tu trouveras surement du code plus proche de ce que tu connais...


Message édité par skeye le 30-07-2003 à 17:22:29
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed