【问题标题】:Read images from folders in directory从目录中的文件夹中读取图像
【发布时间】:2014-02-07 06:31:25
【问题描述】:

1) 我有一个名为“Original_file”的原始目录,其中包含多个图像。 下面的代码用于从目录中读取这些图像,将它们转换为灰度,然后将它们写入名为“Target_File”的新目录中。

Target_File='modified_images';
mkdir(Target_File);
directory='original_images';
dnames = {directory};
cI = cell(1,1);
c{1} = dir(dnames{1});
cI{1} = cell(length(c{1}),1);
for j = 1:length(c{1}),
    cI{1}{j} = double(imread([dnames{1} '/' c{1}(j).name]))./255;
    cI{1}{j} = rgb2gray(cI{1}{j}); 
    imwrite(cI{1}{j}, fullfile(Target_File, ['image' num2str(j) '.jpg']));
  end

2)来自“Target_File”:下面的代码用于随机选择特定数量的图像并将它们放入训练文件中。

Train_images='training_file';
mkdir(Train_images);
ImageFiles = dir('Target_File');
totalNumberOfFiles = length(ImageFiles)-1;
scrambledList = randperm(totalNumberOfFiles);
numberIWantToUse = 5; % for example 5
loop_counter = 1;
  for index = scrambledList(1 :numberIWantToUse)
      baseFileName = ImageFiles(index).name
      str = fullfile('Target_File', baseFileName);
      image = imread(str);
      imwrite( image, fullfile(Train_images, ['image' num2str(index) '.jpg']));
      loop_counter = loop_counter + 1;
   end

我想问这个问题什么?

A) 如果我们认为我们的目录包含多个文件夹 (folder1, folder2, ...., foldern)。这些文件夹中的每一个都包含多个图像。那么如何在 1) 中编辑我的代码以应用相同的概念并获得一个包含相同数量文件夹但每个文件夹都包含灰度图像的新目录“Target_File”?

然后,从 A) 中创建的Target_File 中:我要选择(随机如 2)) 从 Target_File 中的每个文件夹中提取特定数量的图像并将它们放入训练文件中,并将剩余的图像放入测试文件中。对目录中的所有文件夹重复此过程。

因此,如果该目录包含 3 个文件夹,则每个文件夹都分为训练和测试文件。所以第一个文件夹分为train1和test1,第二个目录分为train2和test2,第三个目录分为train3和test3等。那么如何在2)中编辑我的代码?

任何帮助将不胜感激。

【问题讨论】:

  • 使用 imread/imwrite 复制 JPEG 会降低质量并且会变得不必要的复杂 - 只需使用 copyfile。此外,您可以直接使用 randperm(totalNumberOfFiles, numberIWantToUse) 生成训练集索引 - 无需中间列表。
  • 请您帮我编辑我在 1 和 2 中的代码,以便回答我的行为。提前致谢!

标签: matlab image-processing computer-vision


【解决方案1】:

您可以使用dir 命令获取子目录列表,然后通过调用mkdir 循环遍历该列表以依次创建每个子目录。之后,只需匹配文件路径,您就可以将从源子文件夹加载的灰度图像保存到其对应的目标文件夹中。

具体来说,D = dir('directory') 将返回一个结构,其中结构的每个元素都是存储在“目录”中的元素。如果D(i).name 对应于您的其中一个子文件夹的名称,则D(i).isdir 将为1(请注意,您需要忽略D(1:2),因为它们是文件夹导航标签...)。因此,获取您的目录内容列表,然后在 D(i).isdir 为 1 时循环调用 mkdir

我不确定我是否理解您的问题的其余部分,但如果您只需要整个图像集的随机子样本(无论它存储在哪个子文件夹中),在您制作上面的子文件夹时,您也可以将其设为次要调用 dir 到子文件夹以获取其内容列表。循环检查每个元素是否为图像,是否将其保存到图像路径名数组中。当您编译完这个主列表后,您可以从中获取一个随机子集。

【讨论】:

  • 感谢您的回答,请您将编辑后的代码写给我。提前致谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 2023-03-03
相关资源
最近更新 更多