Импортировать двоичное изображение из matlab в программу «C» - PullRequest
1 голос
/ 23 июня 2010

У меня есть двоичное изображение в Matlab, и мне нужен двоичный массив (0 и 1) в программе на Си. Как я могу его импортировать?

Я могу сохранить двоичное изображение в Matlab как ".mat ", но я не знаю, как прочитать файл mat в C. Также я подумал, что, возможно, я смогу сохранить двоичное изображение в Matlab как" .bin ", которое читается в" C ", но опять же я не знаю, каксохранить изображение в Matlab как ".bin".

Любая помощь будет принята с благодарностью.

Ответы [ 5 ]

3 голосов
/ 23 июня 2010

Вы также можете записать свои данные в двоичный файл, который будет примерно вдвое меньше, чем текст.

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

Тогда я думаю, что вы можете прочитать это на С без проблем. Помните, MATLAB будет записывать данные по столбцам, а не по строкам - сначала 1-й столбец, затем 2-й и т. Д. Если вы хотите прочитать их в C по строкам, просто транспонируйте массив перед записью:

fwrite(fid,img','int8') %# notice ' symbol after img
2 голосов
/ 23 июня 2010
>> 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',' ')
2 голосов
/ 23 июня 2010

Прежде всего, проверьте сеть с помощью поисковой системы.Место для поиска в первую очередь, конечно, Mathworks, где вы можете найти документы, такие как this .Второй шаг, поскольку писать конвертер с нуля выглядит сложно, это поиск, если ваша потребность уже кому-то нужна.Ссылка типа this может быть полезной, но есть требования к самому MATLAB (связывание с одной из его библиотек, я полагаю, интерфейсная библиотека MAT-файла).Однако я считаю, что это проще сделать.

Следующее простое решение - использовать this с форматом, который мы знаем, что мы можем прочитать, Если входной массив имеет класслогично, imwrite предполагает, что данные являются двоичным изображением, и записывает их в файл с глубиной в 1, если формат позволяет это.Форматы BMP, PNG или TIFF принимают двоичные изображения в качестве входных массивов.

Изображения BMP несложно обрабатывать с помощью пользовательских процедур;для изображений PNG вы можете использовать библиотеку png, а для TIFF я не помню, но вы можете искать или выбирать другие варианты.

Здесь объясняются другие способы сохранения данных;простой ascii-файл также может быть легко проанализирован с помощью пользовательских подпрограмм C.

0 голосов
/ 25 июня 2010

На некоторых платформах (например, Windows) вы должны указывать «двоичный» при открытии файла, в противном случае считываемые / записываемые байты могут интерпретироваться как специальные символы и могут не читаться / записываться в файл, как ожидалось:

FILE* fin,fout;
...
fin = fopen("file1.bin", "rb"); // the 'b' indicates "binary"   
fout = fopen("file1.bin", "wb"); // the 'b' indicates "binary"
0 голосов
/ 23 июня 2010

Если вам нужно экспортировать данные массива из Matlab и импортировать их в программу на C, одним из простых вариантов (при условии, что массив не гигантский) является использование простого текстового файла, как в промежуточном файле. Из Matlab запишите массив в виде строк в текстовый файл, каждый элемент которого будет разделяться запятой (например, 1,0,0,1,0,1,1,etc). Сохраните это как обычный текстовый файл ASCII. Теперь вы можете открыть файл в C с помощью fopen, прочитать символ за раз с помощью fgetc и восстановить массив.

Например, часть C может выглядеть так:

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...