【问题标题】:Save multiple images with different name in folder在文件夹中保存多个具有不同名称的图像
【发布时间】:2020-04-05 05:16:17
【问题描述】:

我正在尝试从一个文件夹中读取图像并将新图像以不同的名称保存在不同的文件夹中。我需要它们的名称不同,因为它们是用不同的 affine2d 值生成的。例如 a1 文件夹中的图像将是 aa1,aa2,aa3,aa4,aa5.... 而 a2 文件夹中的图像将是 bb1,bb2,bb3.... 有什么办法吗?

'''

srcFiles = dir('C:\Users\mstfy\Desktop\Matlab\alex\Train1\Person1\*.jpg'); 
for i = 1 : length(srcFiles)
filename = strcat('C:\Users\mstfy\Desktop\Matlab\alex\Train1\Person1\',srcFiles(i).name);
im = imread(filename);
aform = affine2d([1 0 0; .1 1 0; 0 0 1])
bform = affine2d([1 0 0; .2 1 0; 0 0 1])
cform = affine2d([1 0 0; .3 1 0; 0 0 1])
dform = affine2d([1 0 0; .4 1 0; 0 0 1])
eform = affine2d([1 0 0; .5 1 0; 0 0 1])
fform = affine2d([1 0 0; .6 1 0; 0 0 1])
gform = affine2d([1 0 0; .7 1 0; 0 0 1])
hform = affine2d([1 0 0; .8 1 0; 0 0 1])
jform = affine2d([1 0 0; .9 1 0; 0 0 1])
a = imwarp(im,aform);
b = imwarp(im,bform);
c = imwarp(im,cform);
d = imwarp(im,dform);
e = imwarp(im,eform);
f = imwarp(im,fform);
g = imwarp(im,gform);
h = imwarp(im,hform);
j = imwarp(im,jform);
newfilename=strcat('C:\Users\mstfy\Desktop\Matlab\alex\Train1\Person1\a1\',srcFiles(i).name);
newfilename1=strcat('C:\Users\mstfy\Desktop\Matlab\alex\Train1\Person1\a2\',srcFiles(i).name);
newfilename2=strcat('C:\Users\mstfy\Desktop\Matlab\alex\Train1\Person1\a3\',srcFiles(i).name);
newfilename3=strcat('C:\Users\mstfy\Desktop\Matlab\alex\Train1\Person1\a4\',srcFiles(i).name);
newfilename4=strcat('C:\Users\mstfy\Desktop\Matlab\alex\Train1\Person1\a5\',srcFiles(i).name);
newfilename5=strcat('C:\Users\mstfy\Desktop\Matlab\alex\Train1\Person1\a6\',srcFiles(i).name);
newfilename6=strcat('C:\Users\mstfy\Desktop\Matlab\alex\Train1\Person1\a7\',srcFiles(i).name);
newfilename7=strcat('C:\Users\mstfy\Desktop\Matlab\alex\Train1\Person1\a8\',srcFiles(i).name);
newfilename8=strcat('C:\Users\mstfy\Desktop\Matlab\alex\Train1\Person1\a9\',srcFiles(i).name);
imwrite(a,newfilename,'jpg');
imwrite(b,newfilename1,'jpg');
imwrite(c,newfilename2,'jpg');
imwrite(d,newfilename3,'jpg');
imwrite(e,newfilename4,'jpg');
imwrite(f,newfilename5,'jpg');
imwrite(g,newfilename6,'jpg');
imwrite(h,newfilename7,'jpg');
imwrite(j,newfilename8,'jpg');
end 

'''

【问题讨论】:

  • 这在我看来与 Python 无关。我可能弄错了,但是如果它们是独立的,那么尝试将所有图像同时加载到内存中似乎相当浪费 - 你肯定一次做一个更好吗?
  • 对不起,这是matlab代码,我删除了python的标签
  • 我只是想节省一些时间一起做所有这些,试图找出如何用不同的名称保存这些新创建的图像。因为我有 40 个不同的人,每个人至少有 300 张图像,所以最后当我把他们放在训练中时,他们都在同一个文件夹中,所以他们不能有相同的名字。到目前为止,我只是使用以下 python 代码为每个文件创建数据和更改名称。但我不想浪费时间这样做。
  • import os # 重命名多个文件的函数 def main(): i = 0 path="C:/Users/mstfy/Desktop/Matlab/alex/affine9/" for filename in os.listdir( path): my_dest ="p" + str(i) + ".jpg" my_source =path + filename my_dest =path + my_dest # rename() function will # rename all files os.rename(my_source, my_dest) i += 1 # 驱动代码 if name == 'main': # Calling main() function main()
  • 请不要将代码放在未格式化且难以阅读的 cmets 中。通常最好编辑您的问题并确保它是最新且正确的。

标签: image matlab image-processing


【解决方案1】:

我不太确定您的要求是什么,但我觉得,如果您在外观和更复杂的结构上考虑更多,您的代码可能会更加自动化(尽管我现在只使用 3D 矩阵;))

% build a 3D matrix to store all transformation matrices
Mat = cat(3,[1 0 0; .1 1 0; 0 0 1],...
            [1 0 0; .2 1 0; 0 0 1],...
            [1 0 0; .3 1 0; 0 0 1],...
            [1 0 0; .4 1 0; 0 0 1],...
            [1 0 0; .5 1 0; 0 0 1],...
            [1 0 0; .6 1 0; 0 0 1],...
            [1 0 0; .7 1 0; 0 0 1],...
            [1 0 0; .8 1 0; 0 0 1],...
            [1 0 0; .9 1 0; 0 0 1]);
srcFiles = dir('C:\Users\mstfy\Desktop\Matlab\alex\Train1\Person1\*.jpg'); 
for i = 1:length(srcFiles)
    % load file (use fullfile() + the path from the list to make this
    % generic for every platform)
    path2img = fullfile(srcFiles(i).folder,srcFiles(i).name);
    % read image
    img = imread(path2img);
    for j = 1:size(Mat,3)
        % transform image
        form = affine2d(Mat(:,:,j));
        img_trf = imwarp(img,form);

        %% save image
        % folder name
        fldrNm = num2str(j,'a%d');
        path2fldr = fullfile(srcFiles(i).folder,fldrNm);
        % create new folder if it does not exist yet
        if i == 1 && exist(path2fldr,'dir') ~=7
            mkdir(path2fldr)
        end

        path2save = fullfile(path2fldrsrcFiles(i).name);
        % store new image
        imwrite(img_trf,path2save,'jpg');
    end
end 

事实上,如果你的转换矩阵遵循这种模式,你甚至可以自动生成它:

% allocate memory
NumMat = 100;
Mat = NaN(3,3,NumMat);
for i = 1:NumMat
   Mat(:,:,i) = [1 0 0; i/10 1 0; 0 0 1];
end

如果你想节省最少的时间,你可以提前到affine2d,但这需要将它保存到结构数组或单元数组,我不知道你是否已经到这一步了;)

【讨论】:

    【解决方案2】:

    听起来是使用循环的完美场所。

    rootdir='C:\Users\mstfy\Desktop\Matlab\alex\Train1\Person1';
    srcFiles = dir([rootdir filesep '*.jpg']); 
    for i = 1 : length(srcFiles)
        filename = [rootdir filesep srcFiles(i).name];
        im = imread(filename);
        for j=1:9
            xform = affine2d([1 0 0; .1*j 1 0; 0 0 1]);
            newim = imwarp(im,xform);
            newfilename= [rootdir filesep sprintf('a%d',j) filesep srcFiles(i).name];
            imwrite(newim,newfilename,'jpg');
        end
    end 
    

    【讨论】:

    • 非常感谢您的回答,我也想用不同的名称保存这些图像。例如,在 a1 文件夹中,我想将图像保存为 aa1.jpg、aa2.jpg.... 等,而对于 a2 文件夹,我想保存 a2.jpg、ab2.jpg... 我该怎么做?
    • 您可以在创建新文件名时在我的脚本中使用sprint('aa%d.jpg',j) 替换srcFiles(i).name,即该行应为newfilename= [rootdir filesep sprintf('a%d',j) filesep sprint('aa%d.jpg',j)];
    猜你喜欢
    • 2022-06-27
    • 2016-02-04
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 2021-09-11
    相关资源
    最近更新 更多