llk同学通过爬虫对某个关键词爬百度图片网页,对其中的图片进行保存,转换为.bmp格式文件,图像大小调整为200*150像素,以此建立数据库。
我使用MFC设计应用程序,在其中加入彩色直方图图像检索功能,在llk同学建立的数据库里进行图像检索,最后按照相似度进行排序展现。
爬虫获取图像如果要编写能够通过输入的关键词自动在网络中搜索相关图片的程序比较复杂,这里用Python编写一个相对简单的爬虫程序,它自动加载百度的图片搜索页面,从中提取图片链接,并下载图片。在python的标准库中有urllib可以向网站发送HTTP请求并接收网页文件,但是用它得到的百度网页不包含我们想要的图片链接,因为百度中很多网页元素是根据脚本动态生成的,urllib直接获取的文件包含了这些脚本的代码信息却没有加载它们。这里用了一个Python的第三方库Selenium,它不但可以驱动浏览器动态加载页面,而且可以执行我们编写的Javascript脚本。通过Javascript可以实现网页的下拉刷新和翻页,从而搜索更多图片。
百度搜图页面默认是采用“瀑布流版本”,页面滑动到底端才继续加载,每次只能从头开始,也不太好控制搜索的图片数量,所以选择了传统的翻页版本。翻页其实就是向另一个页面的链接跳转,页面链接之间的差别就在于HTTP的GET方法传递的参数不同。每次页面跳转后插入一个等待时间,保证页面加载完成就能获取页面找出图片链接。
网页中的图片链接很有规律,不需要解析整个网页,只需要用正则表达式查找就能定位链接。图片下载相对简单,urllib就已经包含了这个功能。
直接下载的图片数据量大,图片格式也比较混乱,有的图片格式甚至和后缀名不一致。建立数据库时用Python的PIL库将图片转换成统一的个式并缩小尺寸。
使用平台:VS2015+MFC
语言:C语言
VS: Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括Microsoft
Windows、Windows Mobile、Windows
CE、.NET Framework、.NET Compact
Framework和Microsoft Silverlight 及Windows Phone。
MFC: 微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
点击“选择带检索图像”按钮,即可选择图片文件进行打开并在“待检索图像”窗口显示出来。
目前只支持.bmp格式的图片。(你可以选择用opencv万事大吉)
点击“选择数据库路径”按钮,进行数据库路径选择。
选择后会弹窗确认选择的目录以及此目录下(包含子文件夹)检索到多少张图片。
目前支持100张以内的检索。
点击直方图检索按钮,开始对数据库内的图片进行逐张计算,最后选取相似度最高的九张图片依次展现在检索结果栏。
这次图像检索用的是彩色直方图进行检索,经过探索,最终发现这个应用程序有以下两个用途:
第二, 为人像找风格对应的风景照,譬如
魔幻奇妙,捉摸不定
这个还是不错的,可能会有市场,毕竟大家都喜欢从宇宙中找一找属于自己特征的那一点东西来满足自己。
上次实验对于彩色直方图,我采用的是对RGB三个通道分别计算直方图。直方图均衡化的效果是这样的
猛一看是挺好看,仔细想想就觉得不太对劲,看灰度图均衡化后变得更清晰了,挺好,但是看这彩色的,基调都变了,不太正常。上网搜了搜,明白了具体原因——
Histogram equalization is a non-linear
process. Channel splitting and equalizing each channel separately is not the
proper way for equalization of contrast. Equalization involves Intensity values
of the image not the color components. So for a simple RGB color image, HE should not be applied individually on each channel.
Rather, it should be applied such that intensity values are equalized without
disturbing the color balance of the image. So, the first step is to convert the
color space of the image from RGB into one of the color space which separates intensity values from color components. Some of these are:
HSV/HLS YUV YCbCr
Convert the image from RGB to one of the above mentioned color spaces. YCbCr is preferred as it is designed for digital images.Perform HE of the intensity plane Y. Convert the image back to RGB.
颜色直方图是在许多图像检索系统中被广泛采用的颜色特征。它所描述的是不同色彩在整幅图像中所占的比例,而并不关心每种色彩所处的空间位置,即无法描述图像中的对象或物体。颜色直方图特别适于描述那些难以进行自动分割的图像。
当然,颜色直方图可以是基于不同的颜色空间和坐标系。最常用的颜色空间是RGB颜色空间,原因在于大部分的数字图像都是用这种颜色空间表达的。然而,RGB空间结构并不符合人们对颜色相似性的主观判断。因此,有人提出了基于HSV空间、Luv空间和Lab空间的颜色直方图,因为它们更接近于人们对颜色的主观认识。其中HSV空间是直方图最常用的颜色空间。它的三个分量分别代表色彩(Hue)、饱和度(Saturation)和值(Value)。
于是这次的图像检索用了HSV彩色直方图进行检索。
RGB转换为HSV格式后,进行计算直方图,然后通过计算直方图的距离来判断相似度,最后对相似度进行排序。
这次的作业,大部分时间还是花在了MFC上,对图像检索没有加入其他算法,有点舍本逐末了。
期间遇到很多问题都是MFC的问题,尤其是CString这块,又在unicode环境下,确实费了不少功夫。
课上听老师讲的一个公司对人图像捕获后进行爬虫感觉很酷,其实最初是想做一个人脸检索的,所以界面加了人脸检测人脸识别,后来发现确实有点难度,时间也不太够用。本来是打算调用OpenCV进行面部识别,结果遇到了下面这个错误
我安装的是3.4.1版本,只支持64位,而这次MFC是32位,改为64位又会出问题,所以到今天人脸识别也还是搁浅了。
这一次实验,最开始听到这个内容的时候感觉难以置信,觉得不可能完成,真的去做了做发现其实也不是特别困难(至少搭建雏形还是可以的),难在如何用更好更恰当的图像检索方式进行图像检索吧。
最开始用自己写的这个应用程序检索人脸,效果不是特别的好,心里特别着急,心想这图片那么大的信息量怎么就用不上呢。以后还是好好学学图像处理,不辜负图片的信息量吧。