Radi_tech’s blog

Radiological technologist in Japan / MRI / AI / Deep learning / MATLAB / R / Python

【MATLAB】画像のResizeをparforで行う


画像のResizeをparforで行う。

parforは並列で処理を行なってくれるので、高速で作業が終わります。

手順はこんな感じ

  • フォルダの構造を得る
  • 保存用フォルダを作成する
  • for文でコードを作成
  • 最後にresiezeに関わる部分をparforに変更する


フォルダ構造はこんな感じ

resize リサイズ


・まずはメインフォルダを選択して内部構造を得ていく

main_fd = uigetdir();

[a,b,c]= fileparts(main_fd); 

sub_fd =dir(main_fd);
%remove waste files
sub_fd =sub_fd (~ismember({sub_fd.name}, {'.','..','.DS_Store','._.DS_Store','._*'}));
%covert to cell
sub_fd ={sub_fd.name};

・次に、画像を保存するフォルダを作成。どんどんデータは増えていくが、オリジナルのデータはいじらずに置いておきたい。

for x= 1:length(sub_fd)

    sub_sub_fd = dir(fullfile(main_fd,sub_fd{x}));
    %remove waste files
    sub_sub_fd =sub_sub_fd(~ismember({sub_sub_fd.name}, {'.','..','.DS_Store','._.DS_Store','._*'}));
    %covert to cell
    sub_sub_fd ={sub_sub_fd.name};

    for y= 1:length(sub_sub_fd)        
        save_fd= fullfile(a,strcat("rs_",b),sub_fd{x},sub_sub_fd{y});
        mkdir(save_fd);
    end
end
msgbox("save fd created")

・for文とparfor文を組み合わせて連続処理をする。
・parfor分にすると変数を確認できなくなるので、最後の処理を走らせるまではfor分で書くのがオススメ

parfor xx = 1:length(sub_fd)
    parfor yy = 1:length(sub_sub_fd)
        
        tmp_fd = fullfile(main_fd,sub_fd{xx},sub_sub_fd{yy});
        
        tmp_img_lst = dir(tmp_fd);
        tmp_img_lst =tmp_img_lst(~ismember({tmp_img_lst.name}, {'.','..','.DS_Store','._.DS_Store','._*'}));
        tmp_img_lst ={tmp_img_lst.name};
        
        for zz=1:length(tmp_img_lst)
            
            tmp_img_path = fullfile(tmp_fd,tmp_img_lst{zz});            
            img = imread(tmp_img_path);

           % CNN用に224*224にresizeする 
            rs_img = imresize(img,[224,224]);
            
            save_fd   = fullfile(a,strcat("rs_",b),sub_fd{xx},sub_sub_fd{yy});
            save_path = fullfile(save_fd,tmp_img_lst{zz});
            
            imwrite(rs_img,save_path);
        end        
    end
end

これでできあがり。
それぞれをライブエディターで書けばOK