Сохранить несколько изображений с разными именами в папке - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь прочитать изображение из одной папки и сохранить новые изображения в другой папке с разными именами. Мне нужны все они под разными именами, потому что они генерируются с разными значениями 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 

' ''

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Я не совсем уверен, о чем вы просите, но я чувствовал, что ваш код мог бы быть немного более автоматизированным, если вы будете больше думать о внешности и более сложных структурах (хотя я сейчас использовал только 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 заранее, но для этого требуется сохранить его в struct-array или cell-array, и я не знаю, находитесь ли вы уже так далеко;)

0 голосов
/ 04 апреля 2020

звучит как идеальное место, чтобы использовать все oop.

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 
...