imwrite дает противоречивую ошибку в Matlab

Я написал код для очистки и печати нескольких изображений,

data_1=csvread(data)
for h=1:30
    im_old=imread(strcat('catches\image_generator (',int2str(h),').png'));
    im_bw=func_bw(im_old);
    im_2=func_clean_tr(im_bw);
    [im_3a,im_3b]=edge_trial(im_2);
    da=data_1{h,2};
    name=strcat('trrr\',da,'trial.png');
    imwrite(im_3b,strcat('trrr\',int2str(h),'trial.png'));
end

Есть конкретная проблема. Imwrite работает, когда параметры:

imwrite(im_3b,strcat('trrr\',int2str(h),'trial.png'));

Но это не сработает, когда я задаю параметры как:

imwrite(im_3b,strcat('trrr\',da,'trial.png'));

Я перепроверил, что da является строкой 1x1, а strcat('trrr\',da,'trial.png') также является строкой 1x1. Показанная ошибка:

Ошибка при использовании imwrite›parse_inputs (строка 510)

Должно быть указано имя файла.

Не знаю, почему imwrite обрабатывает две строки по-разному...

Edit1: мои данные_1 читаются как: 1,X55N3 2,PQZXS 3,HDDS3... Кроме того, значение da=data_1{h,2}; это X55N3


person Pranav Totala    schedule 10.02.2018    source источник
comment
Мне кажется, что MATLAB все усложнил, введя строковый объект и двойные кавычки. Обратите внимание, что одинарная и двойная кавычки — это разные вещи, и они создают объекты разных типов. Если da является строкой, вы объединяете ее с двумя массивами символов в name. Я не знаю, что это будет делать, но, вероятно, это что-то неожиданное. Вы распечатали name, чтобы посмотреть, как это выглядит?   -  person Cris Luengo    schedule 10.02.2018
comment
Может быть, name становится строкой, а imwrite ожидает массив символов?   -  person Cris Luengo    schedule 10.02.2018
comment
Спасибо, я только что прочитал ввод imread, который допускает только массив символов и никаких строк.   -  person Pranav Totala    schedule 11.02.2018


Ответы (1)


MATLAB все еще как бы переходит на новый класс string. Традиционно MATLAB всегда использовал массивы char там, где вам нужна строка. Они представили класс string в R2016b и еще не обновили все функции во всех наборах инструментов, чтобы также использовать string вместо массива char.

Я использую R2017a и вижу это при использовании imread со строкой:

>> imread("cameraman.tif");
Error using imread>parse_inputs (line 450)
The file name or URL argument must be a character vector.

Error in imread (line 322)
[filename, fmt_s, extraArgs, was_cached_fmt_used] = parse_inputs(cached_fmt, varargin{:});

Однако это работает:

>> imread(char("cameraman.tif"));

Таким образом, ваше решение состоит в том, чтобы преобразовать string в массив char:

imwrite(im_3b,char(strcat('trrr\',da,'trial.png')));

or:

imwrite(im_3b,strcat('trrr\',char(da),'trial.png'));
person Cris Luengo    schedule 11.02.2018