2010-06-23 7 views
1

J'ai une image binaire dans Matlab, et j'ai besoin du tableau binaire (0 et 1) dans un programme C, Comment puis-je l'importer?Importer une image binaire de matlab dans un programme "C"

Je peux enregistrer l'image binaire dans Matlab comme ".mat" mais je ne sais pas comment lire le fichier mat en C. Aussi je pensais que je pourrais peut-être enregistrer l'image binaire dans Matlab comme ".bin" qui est lisible dans "C" mais encore une fois je ne sais pas comment enregistrer une image dans matlab comme ".bin".

Toute aide serait grandement appréciée.

Répondre

3

Vous pouvez également écrire vos données dans un fichier binaire, qui sera environ deux fois plus petit que le texte.

img=rand(10)>.5; %# an array from @Amro's answer 
fid = fopen('test.bin','w'); 
fwrite(fid,img,'int8') 
fclose(fid); 

Ensuite, je crois que vous pouvez le lire en C sans problèmes. Rappelez-vous que MATLAB écrira des données par colonnes et non par rangées - première colonne, puis deuxième, etc.Si vous voulez lire en C par des lignes, transposer simplement le tableau avant d'écrire:

fwrite(fid,img','int8') %# notice ' symbol after img 
2

Tout d'abord, vérifiez le réseau à l'aide d'un moteur de recherche. Le lieu de recherche en premier est bien sûr Mathworks, où vous pouvez trouver des documents comme this. La deuxième étape, car il semble compliqué d'écrire de zéro un convertisseur, est de chercher si votre besoin est déjà quelqu'un d'autre. Un lien comme this pourrait être utile, mais il y a les exigences d'un MATLAB lui-même (lien avec l'une de ses bibliothèques, la bibliothèque d'interface de fichier MAT, je suppose). Je crois que c'est cependant la chose la plus simple à faire. La solution suivante simple est d'utiliser this avec un format que nous savons pouvoir lire, Si le tableau d'entrée est de classe logique, imwrite suppose que les données sont une image binaire et l'écrit dans le fichier avec une profondeur de bit de 1, si le format le permet. Les formats BMP, PNG ou TIFF acceptent les images binaires en tant que tableaux d'entrée.

Les images BMP ne sont pas difficiles à gérer par les routines personnalisées; pour les images PNG, vous pouvez utiliser la bibliothèque png, et pour le TIFF, je ne me souviens pas, mais vous pouvez rechercher ou choisir les autres options.

Here d'autres moyens d'enregistrer des données sont expliqués; Un fichier Ascii peut également être facilement analysé par des routines C personnalisées.

2
>> img=rand(10)>.5 
img = 
    1  0  1  1  0  0  1  1  0  0 
    1  1  0  0  0  1  0  0  1  0 
    0  1  1  0  1  1  1  1  1  1 
    1  0  1  0  1  0  1  0  1  1 
    1  1  1  0  0  0  1  1  1  1 
    0  0  1  1  0  0  1  0  0  0 
    0  0  1  1  0  1  1  0  1  1 
    1  1  0  0  1  0  0  0  1  0 
    1  1  1  1  1  1  0  1  0  0 
    1  1  0  0  1  0  0  0  1  0 

>> dlmwrite('file.dat', img, 'delimiter',' ') 
0

Si vous avez besoin d'exporter des données du tableau de Matlab et l'importer dans un programme C, une option facile (en supposant que le tableau n'est pas gigantesque) est d'utiliser un fichier texte brut comme dans intermédiaire. À partir de Matlab, écrivez le tableau en tant que chaînes dans un fichier texte avec chaque élément séparé par une virgule (par exemple, 1,0,0,1,0,1,1,etc). Enregistrez-le en tant que fichier texte ASCII normal. Maintenant, vous pouvez ouvrir le fichier en C avec fopen, lire un caractère à la fois avec fgetc et reconstruire le tableau.

Par exemple, la partie C pourrait ressembler à:

FILE* fp; 
char inp[3]; 
int array[PLENTY_OF_ROOM], index=0; 
fp = fopen("exported_data.txt", "r"); 
while (fgets(inp, 3, fp) != NULL) { 
    if ((inp[0] == '0' || inp[0] == '1') && inp[1] == ',') 
     array[index++] = inp[0] - '0'; 
    else { 
     fprintf(stderr, "Error: bad format\n"); 
     exit(1); 
    } 
} 
+0

le code que j'ai posté des œuvres pour un vecteur de ligne, mais il devrait être assez facile à adapter pour une matrice 2D (il suffit d'ajouter le soutien pour la détection et la gestion des caractères de nouvelle ligne qui apparaîtraient entre les lignes). – bta

0

Sur certaines plates-formes (comme Windows), vous devez spécifier lors de l'ouverture du fichier « binaire », sinon lecture/octets écrits peuvent être interprétés comme des caractères spéciaux et ne peut pas être lu/écrit dans le fichier comme prévu:

FILE* fin,fout; 
... 
fin = fopen("file1.bin", "rb"); // the 'b' indicates "binary" 
fout = fopen("file1.bin", "wb"); // the 'b' indicates "binary" 
Questions connexes