matlab显示文件夹下的多副图像

来源:互联网 发布:实时人口迁徙大数据 编辑:程序博客网 时间:2024/05/01 11:45

  最近在写深度学习算法方案的时候,需要在方案书附录中对imagenet数据集可视化,但imagenet数据集中的图像大小并不完全相同,经过一番努力,显示效果才达到导师的要求,故这里把我实现过程中的小问题记录下来,方便以后参考。
  在写机器学习方面的paper时,通常需要可视化数据集。比如人脸数据集,通常每一个子文件夹下包含了一类人脸图像(这些人脸图像的大小可以各不相同、文件的命名可以没有任何规律),可视化图像的行数表示人脸图像的类别数,列数表示每一类人脸图像个数。可能大家首先想到的是matlab中的subplot函数,该函数虽然能够将多幅图像显示成M×N的格式,但相邻图像之间的间隔比较大,不符合论文的一般要求。为了解决这个问题,我写了下面的一段matlab函数,其基本思想是先定义待显示图像的属性,比如单幅图像尺寸归一化后的大小、图像的行数和列数、相邻图像的间隔,然后获取当前路径下的所有子文件夹名称,最后依次读取各个子文件夹下的图像,尺寸归一化后填充到初始化矩阵中。整个程序如下,

clc,clear;%图像参数设置height_per_img = 100; width_per_img = 100;img_num_y = 8; img_num_x = 10;distance = 5;%参数设置完成final_img = zeros(height_per_img*img_num_y+distance*(img_num_y-1), width_per_img*img_num_x+distance*(img_num_x-1), 3);final_img = uint8(final_img);p = genpath('C:\Users\HP\Desktop\图像重组');% 获得文件夹data下所有子文件的路径,这些路径存在字符串p中,以';'分割  length_p = size(p,2);%字符串p的长度 path = {};%建立一个单元数组,数组的每个单元中包含一个目录  temp = [];  for i = 1:length_p %寻找分割符';',一旦找到,则将路径temp写入path数组中      if p(i) ~= ';'          temp = [temp p(i)];      else           temp = [temp '\']; %在路径的最后加入 '\'          path = [path ; temp];          temp = [];      end  end     %至此获得data文件夹及其所有子文件夹(及子文件夹的子文件夹)的路径,存于数组path中。  %下面是逐一文件夹中读取图像  file_num = size(path,1);% 子文件夹的个数  for i = 1:file_num    file_path =  path{i}; % 图像文件夹路径      img_path_list = dir(strcat(file_path,'*.jpg'));      img_num = length(img_path_list); %该文件夹中图像数量      if img_num > 0          for j = 1:img_num              image_name = img_path_list(j).name;% 图像名              image =  imread(strcat(file_path,image_name));  %image是要处理的图像            fprintf('%d %d %s\n',i,j,strcat(file_path,image_name));% 显示正在处理的路径和图像名              image=imresize(image,[height_per_img, width_per_img]);%将图像放缩到[100,100]                        line_index =ceil(j/img_num_x); %求解行号            column_index = mod(j, img_num_x); %求解列号            if(column_index==0) column_index=img_num_x; end %最后一列的情况特殊处理              final_img( (line_index-1)*(height_per_img+distance)+1 : (line_index-1)*(height_per_img+distance)+height_per_img, ...                       (column_index-1)*(width_per_img+distance)+1 : (column_index-1)*(width_per_img+distance)+width_per_img, :)=image;        end      end  end  imshow(final_img, [0, 255])

经验小结

  (1)matlab中定义的矩阵是动态矩阵,就是说在初始化矩阵的大小后,后面赋值的时候索引“越界”也是可以的,此时相当于对矩阵的大小进行了延拓,这一点和c语言是不同的!比如下面的例子,

a=[1, 2; 3, 4]
a =
1 2
3 4
a(3, :)=[5, 6]
a =
1 2
3 4
5 6

  (2)matlab显示图像的方法有多种,但在一些对图像分辨率要求比较高的场合,比如写的paper中,我们需要注意了。下面我们对比了三种图像显示的方法的效果,(a)先imshow然后copy figure;(b)先imshow然后另存为tif格式的文件;(c)直接将matlab矩阵写入到tif格式的文件中(使用imwrite函数)。因为csdn不支持tif无损格式图像文件的上传,但我观察到它们的图像大小分别为627KB、0.99MB、2.27MB,显然(c)方法的显示效果最好。最后,这里贴一张imagenet部分图像的可视化效果。

0 0
原创粉丝点击