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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/diligent_321/article/details/60955588

  最近在写深度学习算法方案的时候,需要在方案书附录中对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部分图像的可视化效果。

猜你喜欢

转载自blog.csdn.net/diligent_321/article/details/60955588
今日推荐