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

C Discussion :

Problème ouverture image .raw pour seuillage


Sujet :

C

  1. #1
    Futur Membre du Club Avatar de Blackbelt_29
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 19
    Points : 9
    Points
    9
    Par défaut Problème ouverture image .raw pour seuillage
    Bonjour,

    Tout d'abord merci de lire ce message je sais que c'est mal de poser des questions sans se présenter mais là j'ai vraiment besoin d'aide !

    J'ai suis actuellement sur un projet où il faut que je seuil une image en format .raw et le réécrive dans ce format-là.
    Le fichier Raw est une acquisition constituée de plusieurs images (dans mon cas 238) et c'est le problème.
    Ma question est comment je peux faire pour dans une boucle ouvrir chaque image séparément, faire un seuillage et l'enregister dans un fichier Raw qui aura les mêmes caractéristiques que mon image initiale tout ça en C tout ça avec la fonction fopen.

    Ps : Quand j'affiche l'header (fichier en .mhd) voilà ce qu'il me donne "Dim Sise 512 512 138". C'est donc un ensemble de 238 images chacun de 512 par 512 pixels que j'arrive très bien à visualiser avec imageJ.
    Merci encore pour vos futures réponses ou aide

    Cordialement


    Voici le code que j'ai fait pour l'instant (il fonctionne avec une image raw n'ayant que 1 image)

    Code pour ouvrir l'image :
    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
    void LireImageRAW(unsigned char** imageRaw, int height, int width)
    {
    	FILE * fic_image;
    	int i, j;
    	fic_image = fopen("/home/elric/Documents/Images patient/Bernicot.raw","rb");
     
    	if (fic_image == NULL)
    	{
    		printf("Erreur a l'ouverture de l'image\n");
    		exit(0);
    	}
    	else
    		printf("Image ouverte avec succes\n");
    	for(i=0;i<height;i++)
    		for(j=0;j<width;j++)
    			fread(&imageRaw[i][j],1,1,fic_image);
     
    	fclose(fic_image);
    }
    Le code pour écrire le fichier raw
    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
    void EcrireImageRAW(unsigned char** imageRaw, int height, int width)
    {
     
    	FILE * fic_image;
    	int i, j;
     
    	fic_image = fopen("/home/elric/Documents/test image-ouverture/Bernicot+seuil.raw","wb");
     
    	if (fic_image == NULL)
    	{
    		printf("Erreur a la creation de l'image ...\n");
    		exit(0);
    	}
    	else
    		printf("Image cree avec succes ...\n");
    	for(i=0;i<height;i++)
    		for(j=0;j<width;j++)
    			fwrite(&imageRaw[i][j],1,1,fic_image);
     
    	fclose(fic_image);
    }
    Le code pour le seuillage
    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
    void SeuilImageRAW(unsigned char** imageRaw, int height, int width, int seuil)
    {
    	int i, j;
    	for(i=0;i<height;i++){
    		for(j=0;j<width;j++)
    		{
    			if (imageRaw[i][j] < seuil)
    				imageRaw[i][j] = 0;
    			else
    				imageRaw[i][j] = 255;
    		}
    	}
    	printf("i vaut %d",i);
    	printf("j vaut %d\n",j);
    }
    et enfin le main

    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
         int height,width;
         height=width=512;
        unsigned char ** imageRaw;
        int seuil;
     
        imageRaw = allocation(height,width);
     
        if (imageRaw != NULL)
        {
            LireImageRAW(imageRaw,height,width);
     
            printf("Seuil a appliquer : \n");
            scanf("%d",&seuil);
     
            SeuilImageRAW(imageRaw,height,width,seuil);
            EcrireImageRAW(imageRaw,height,width);
            desallocation(imageRaw,height);
        }
        else
        {
            printf("Erreur lors de l'allocation memoire! Sortie du programme.\n");
            return 1;
        }

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Cela fait un bout de temps que je n'ai pas fait de traitement d'image, peux-tu nous rappeler les caractéristiques de ton format d'entrée (en-tête, structure...). Les 238 images sont dans le même fichier, j'ai bien compris ?

    À ta place je commencerais par définir une structure représentant une image pour faciliter les manipulations. Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct image {
        unsigned char* data;
        int w, h;
    };

  3. #3
    Futur Membre du Club Avatar de Blackbelt_29
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Les 238 images sont dans le même fichier, j'ai bien compris ?
    oui ils sont tous dans le même fichier .raw.

    À ta place je commencerais par définir une structure représentant une image pour faciliter les manipulations. Quelque chose comme
    En fait les informations du fichier sont dans un fichier en .mhd que je peux ouvrir dans l'éditeur de texte :
    si je l'ouvre voici ce qu'il me donne :

    ObjectType = Image
    NDims = 3
    BinaryData = True
    BinaryDataByteOrderMSB = False
    CompressedData = False
    TransformMatrix = 1 0 0 0 1 0 0 0 1
    Offset = -193.607422 -378.607422 29.500000
    CenterOfRotation = 0 0 0
    ElementSpacing = 0.785156 0.785156 1.500000
    DimSize = 512 512 238
    AnatomicalOrientation = ???
    ElementType = MET_FLOAT
    ElementDataFile = ThoraxPhantom.raw

    Du coup j'ai créer un fonction permettant de lire les informations présentes dans DimSize que je mets dans les variable (height,width et nbImage) . Mais je n'arrive pas à voir comment faire la boucle for qui va parcourir image par image et faire le seuillage sur chacune des images séparément puis les enregistres.

    Après quelques recherches pensez vous qu'il serait possible d'utiliser la fonction fread pour lire dimension par dimension de cette façon la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
    ptr − tabelau de 512*512
    size − 32 bits reel=
    nmemb − nombre qui variera de 1 au nombre maximum d'image (238)
    stream − dans mon cas le fic_image

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Ok, ce que je ferais perso :
    • création d'une structure telle que je l'ai décrite ci-avant, ajout d'un champ pour stocker la taille d'une image (au choix soit le nombre d'images dans le buffer, soit la taille d'une seule matrice, soit le format de pixel qui définit également sa taille) ;
    • lecture des informations d'en-tête depuis ton fichier texte ;
    • lecture du fichier RAW (d'une seule traite, dans un seul buffer) ;
    • calcul de la taille d'une image et vérification que la quantité de données lues correspond à l'en-tête ;
    • création d'une autre instance de notre structure pour stocker l'image de sortie ;
    • traitement d'image ;
    • enregistrement de l'image finale sur disque.


    Avec une struct comme celle de mon précédent message et en connaissant imageSize la taille en octets d'une seule image, tu accèdes à la matrice de l'image i via &data[i * imageSize]. Il ne te reste qu'à y ajouter l'offset du pixel désiré.

Discussions similaires

  1. Problème ouverture image
    Par Trio OS dans le forum Cpcdos
    Réponses: 10
    Dernier message: 15/02/2016, 14h25
  2. Problème ouverture image prise par l'appareil photo
    Par maxwel56 dans le forum Android
    Réponses: 0
    Dernier message: 12/05/2011, 18h12
  3. Site image raw pour visualisation 3D
    Par AuraHxC dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 23/04/2010, 16h10
  4. [ImageMagick] Problème dans le code pour redimensionner une image
    Par pierrot10 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 08/06/2007, 14h06
  5. [image] Méthodes pour faire un seuillage Bin. de qualité
    Par Rafoo dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/10/2005, 14h08

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