Повреждение данных при передаче Numpy ndarray в функцию Matlab с использованием Matlab Engine - PullRequest
2 голосов
/ 20 апреля 2020

У меня есть функция в Matlab, я хочу вызвать изображение в градациях серого, которое я загрузил в Python как 2-й снимок. Для этого я решил использовать Matlab Engine для Python.

После этого ответа Я решил использовать функцию savemat () Сципи, а затем упаковал свой ndarray в словарь как показано в этом ответе . Затем на стороне Matlab я читаю этот файл с помощью fopen ().

Где-то в этом процессе первые 50 ячеек первого ряда изображения повреждаются.

Python код:

self.eng = matlab.engine.start_matlab()
savemat(out_file_python, {'image_data': image})
FILTERED_IMAGE = self.eng.SARBM3D_Python_Helper(out_file_matlab, L, width, height)

Код Matlab:

    function IMG_FILTERED = SARBM3D_Python_Helper(path, L, width, height)
    %SARBM3D_filter Takes an image path, loads the image and applies
    %    SARBM3D filter.
    %   Detailed explanation goes here
    [fp, msg] = fopen(path,'rb'); 
    assert(fp>=3,msg)
    IMG = fread(fp,[width height],'float')'; 
    fclose(fp);

    tic;
    IMG_FILTERED = SARBM3D_v10(IMG,L);
    toc,

    end

Это работает, изображение сохраняется Python, затем загружается Matlab. Проблема в том, что первые 50 ячеек первой строки изображения, считанные Matlab, заполнены номерами мусора:

5.97010568981204e-07    167969504   2.04630902945563e+23    1.94329244039050e-19    7.14394306433430e+31    4.68937780150775e+27    7.54651052656269e+31    3.86486210083297e+30    7.21283771132713e+22    1.85015188025444e+28    6.34833865368594e+28    2.39079247928242e+29    6.48021303284452e-10    0.000698821619153023    1.73404984593617e-07    6.48018139148832e-10    1.72892204528396e-41    0   0   0   0   0   0   0   0   0   0   0   0   0   210767872   1.96181785005474e-44    4.65006882401547e-40    8.40779078594890e-45    1.12103877145985e-44    9.80908925027372e-45    0   7.00649232162409e-45    1.12103877145985e-44    4.03573957725547e-43    4.03573957725547e-43    1.40129846432482e-45    1.40129846432482e-44    1.06455071979708e+24    2.63295721825752e+20    3.49595940879755e-41    0   9.80908925027372e-45    4.64917199299831e-40

Затем после этих 50 записей мусора данные изображения нормальные.

Моя теория заключается в том, что где-то возникает проблема между сериализацией и десериализацией, и некоторые метаданные считываются как часть изображения. Нужно ли открывать словарь 'image_data' в Matlab?

1 Ответ

1 голос
/ 20 апреля 2020

Попробуйте загрузить ваш файл как mat объект в Matlab вместо fopen. Он также сохранит исходную форму массива.

fp = load(path); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...