在MatLab中,如何从单元格数组创建字符向量?

时间:2017-07-28 16:15:34

标签: arrays matlab vector imread

我很难区分不同类型的向量和数组以及如string,cellstr,char等命令。我的代码在另一个网络上,但基本上,我得到一个错误,说我的imread语句中的参数必须是一个字符向量。这个参数是一个1x30的文件名数组,是一个单元格数组,因为我使用了iscell命令并且它返回了1.我已经尝试了上面列出的命令的几个组合,并且已经阅读了我能做的一切,但无法确定如何更改将1x30单元格数组转换为字符向量,以便imread语句起作用。文件名从文件夹(使用uigetfile)读入,如757-01.bmp,757-02.bmp ... 757-30.bmp。我想我需要把它们变成'757-01.bmp','757-02.bmp'...'757-30.bmp'并且可能变成30x1矢量副1x30?或许对于代码将在下一次遇到的for循环无关紧要?谢谢你的帮助......

[imagefiles,file_path]=uigetfile({'*.jpeg;*.jpg;*.bmp;*.tif;*.tiff;*.png;*.gif','Image Files (JPEG, BMP, TIFF, PNG and GIF)'},'Select Images','multiselect','on');
imagefiles = cellstr(imagefiles);
imagefiles = sort(imagefiles);
nfiles = length(imagefiles);

r = inputdlg('At what pixel row do you want to start the cropping?        .','Row');
r = str2num(r{l});

c = inputdlg('At what pixel column do you want to start the cropping (Must be > 0)?        .','Column');
c = str2num(c{l});

h = inputdlg('How many pixel rows do you want to include in the crop?        .','Height');
h = str2num(h{l});

w = inputdlg('How many pixel columns do you want to include in the crop?        .','Width');
w = str2num(w{l});

factor = inputdlg('By what real number factor do you want to enlarge the cropped image?        .','Factor');
factor = str2num(factor{l});

outdimR = h * factor;
outdimC = w * factor;

for loop=l:nfiles
    filename = imagefiles(loop);
    [mybmp, map] = imread(filename);
    myimage = ind2rgb(mybmp,map);
    crop = myimage(r:r+h-1, c:c+w-1, :);
    imwrite(crop, sprintf('crop757-%03i.bmp',loop));
end

1 个答案:

答案 0 :(得分:0)

关于你原来的问题:

  

在MatLab中,如何从单元格数组创建字符向量?

您可以使用单元格访问器操作数({})从@ cell-voight指出的单元格中获取字符串,或者在您的语句周围包裹char()(我将根据Ben的建议)。

关于您的后续问题:

  

在imread说文件“757-01.bmp”不存在时出错。在imagefiles数组中,30个值中的第一个是757-01.bmp(没有引号),但我不知道MatLab是否在文件名周围加上引号意味着它是否在数组中查找带引号的值。

听起来您的文件位于另一个目录中,而不是您运行代码的目录。

使用fullfile创建完整文件名以使用文件的绝对路径而不是相对路径(这里不起作用)。

假设您的文件位于路径~/bpfreefly/images/

然后您可以像这样更改代码:

imgPath = '~/bpfreefly/images/'
for loop=l:nfiles
    filename = fullfile(imgPath,imagefiles{loop});
    [mybmp, map] = imread(filename);
    myimage = ind2rgb(mybmp,map);
    crop = myimage(r:r+h-1, c:c+w-1, :);
    imwrite(crop, sprintf('crop757-%03i.bmp',loop));
 end

顺便说一下,你可以从uigetfile的第二个输出参数中获取路径名。