我很难区分不同类型的向量和数组以及如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
答案 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
的第二个输出参数中获取路径名。