代码改变世界

haartraining前将统一图片尺寸方法

2013-04-03 15:29  freecloudinsky  阅读(468)  评论(0编辑  收藏  举报

  最近在做大学的毕业设计,课题是基于Gentle Adaboost算法的人脸检测研究,用到OpenCV的haartraining.exe进行训练,得到一个xml模型的分类器。只是打算进行简单的人脸数据训练,而是在网上下载了yale大学的人脸数据库,由耶鲁大学计算视觉与控制中心创建,包含15位志愿者的165张图片,包含光照,表情和姿态。下载网址为:http://cvc.yale.edu/projects/yalefaces/yalefaces.html。如果感觉不好下载,直接去网上搜,很多,CSDN里也有。

  图片如下:

  

  Yale大学人脸数据都是bmp格式的,80*80(我用的是100*100)像素大小。由于这次的haartraining只是为了学会其过程,再加上这个算法训练的时间非常长,图片不到1000就需要的时间都是以天为单位。我缩放的目的是将这些人脸样本添加到正样本集,我正样本集用的MIT的正样本,只有2700多一点,感觉不够,所以添加正样本。此外,打算减小图片的尺寸,将100*100的图片统一到尺寸20*20像素大小。

  (这里插2个小知识:1. 理解图片尺寸的概念。比如说图片的尺寸为80*80代表的是图片的大小为80*80,并不是指分辨率,而是说的是80*80像素,即宽度为80个像素,长度也为80个像素。因为一个像素宽在一个显示器件上已经确定了。因此当一副图片被放大时,它的尺寸像素就可能改变,比如变成了100*100像素,因为放大的时候它的长和宽变了。但是其分辨率在放大时并没有变化。另外像素和长度cm的对应关系也得看图形的分辨率,比如通常所说的说1cm=28像素是指在72像素/平方英寸的时候。所以一般所说的数码相机的像素过高的话其实对显示器显示图片清晰度没有太大帮助,像素高只是可以打印出来更大更清晰的照片。

  2. 在window下如果一副图片,比如说是bmp格式的。我只需把后缀名改为其他的比如jpg。然后右键查看其属性时竟然是jpg格式,并且也能打开,难道真的就是jpg格式的吗?肯定不是,比较bmp和改后的jpg就会发现两者的大小是一样的。最后用matlab命令的imfinfo来查看图片的信息,也还是bmp格式的。说明上面单独改后缀名是一种误导,以后做图像处理的时候一定要小心。)

  接下来所要进行的操作就是把这165张图片的尺寸缩小到20*20像素了,当然这里有一个笨方法,就是用图片查看软件(比如说ACDsee)一张一张转换。不过要是图片成千上万那就麻烦了。所以打算自己写一个小程序来完成这些批处理工作,图片的缩放就用matlab中现有的函数了。写这个小程序的主要目的是练习对文件名(字符串)的操作,因为以前一直对这些东西没概念,今天练习了下,收获还是有的。

   刚刚在上图可以看出,人脸数据库的命名比如s1.bmp表示的是第一个人的第一张人脸图,最后调整后的名字改为s1.bmp。

   首先在工程文件目录下,建立yale和yale_small_size文件夹,并把165张人脸数据图片拷贝到yale文件夹中。最后通过程序生成的小尺寸图全部放在yale_small_size文件夹中。如下所示:

  程序源代码:

%%%%%%%%%%%%%%%%%%%%%%缩放的小程序 将100*100缩放为20*20%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc;
clear all;
str='C:\Users\Administrator\Desktop\matlab\yale\s';
for i=1:165
    str1=num2str(i);                  %将数字转为字符串
    ff=imread(strcat(str,str1,'.bmp'));          %读图
    ff1=imresize(ff,0.2,'bilinear');            %缩放
    imwrite(ff1,strcat('C:\Users\Administrator\Desktop\matlab\yale_small_size\s',str1,'.bmp'),'bmp');  %保存到文件夹
end

转换后的结果:

很简单的一个小程序,只是为了归一化图片尺寸方便一点,其实本想用vc写的,出了点问题(字符串),所以先做一个简单的matlab版本的。

 转载于:http://www.cnblogs.com/tornadomeet/archive/2012/03/27/2420088.html