前段时间,非常不幸的在wap面试中没有做出第二题,题目太简单了,我都不好意思在这里说,只是当时太紧张了,脑子有点短路,时间太短,直接滚蛋了。
不过这段时间我还同时在做多媒体应用的作业:image retrieval
这个作业的要求是,用VS2013和opencv来编写一个程序,完成对输入图片的CBIR(Content Based Image Rerivieval),作业有四个要求,给了七个输入样例,分别是dinosaur,bus,man,horse,beach,flower,building.
四个basic要求分别是:1. best matches 就是每一张样例的最匹配图片要正确,换言之,输入马,你的最匹配图片也要是马就对了,以此类推
2. retrieved images 就是每一次能匹配到的正确图片数量有提高就可以达到这个要求
3. precision 要求是每次匹配的正确数量占输出图片的百分比到达60以上,就是匹配出100张,里面要有60张以上正确的
4. recall 要求是匹配出的正确图片占应该匹配出的正确图片的百分比,最低到40个percent就能拿分,意思是数据库里有100张,你要至少找到40张
前面两个要求写了几行代码就解决了,好了,接下来,来说说后面两个的实现之路。
第一次,我看了TA师兄在tutorial上精彩的讲解,自己回来用所谓的HSV颜色直方图实践了一把,效果还不如pixel by pixel的比较,所以打算换方法,因为生平第一次涉足图像处理这个领域,所以打算先问问行家的意见,再动手,于是得到了一个
方案一:用canny算子求得轮廓,然后根据轮廓对图片进行分割区域,再对分开的区域分别做颜色直方图比较
在此,先介绍一下HSV颜色空间和RGB颜色空间的区别,相对于前者,RGB空间对于大众来说应该听说的多一点,更加容易理解一点,RGB顾名思义,就是用红、绿、蓝三种基准色构建出来的一个颜色空间,每个通道的颜色强度值从0~255,那么合在一起一共有256^3种颜色可以呈现,如下图,所以每个像素的颜色值,由三个8bit数字来存储。
以下一段话摘自百度上我觉得比较有道理的回答,说明RGB颜色空间不利于我们的image retrieval:
RGB虽然表示直接,但是R、G、B数值和色彩的三属性没有直接的联系,不能揭示色彩之间的关系。所以在进行配色设计时,RGB模型就不是那么合适了。在所有美术软件中,都可以直接设置RGB的数值。有些软件还提供了直观的"RGB三维色彩模型"来设置RGB色彩值。
HSV是指Hue(色相)、Saturation(饱和度)和Value(值)。RGB和CMY颜色模型都是面向硬件的,而HSV颜色模型是面向用户的。
以下来介绍一下HSV颜色空间:HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。
具体细节想了解可以百度之。
之前的颜色直方图匹配结果完全doesn't make sense,所以一定是有问题,因为原来opencv提供的分通道技术,会把每一种颜色都分出一个分量来记录,就算在人眼中几乎无差别的颜色,只要数据有不同,就是两种,因为不同颜色占有的波长范围会不一样,比如某一种颜色会有很多波长在人眼中是这个颜色,而另一种颜色则很很少,这就是电脑死板的地方,所以直方图的比较结果,都会差很多。到不了我们人类觉得的similarity,电脑都觉得不对。所以,要让电脑的感觉和人眼感觉一样,那么,就要手动的去分颜色了,所以我们来到了一个非常关键的point,如何分这个颜色,分多少合适。在这里首先鸣谢一下我们CITYU的CS PHD--Colin,是他指点了我一下并且让我看了一篇相关论文,在这个地方突破了天际。
肯定是有人在研究这个领域的,所以有比较合理的理论可以用,根据三个通道,把颜色分成了37个类,是人眼可以分别的37种,这样子,每一幅图等于都只有37种颜色了,这是一个非常大的优化,试想一下,如果你输入的图是马,图片如下
中间是一坨东西,颜色较深,周围都是绿色的草,这就是这幅图的颜色构成,而不是什么深深浅浅的草绿和树叶绿,渐变的毛色~!@#$%^
这样子,输出的图片将会都是类似的--草地上的马,那么就会达到我们想要的效果了,因为,世界上没有两匹一样的马,也没有两片一样的草地。
但是,如果只统计颜色的数量,显然显得有点无力,因为,颜色的分布位置会成为致命的弱点,比如原来的图中间一团黑,周围都是白,那么中间一团白周围一团黑的图片也会成为匹配到的图片,显然又不对了。
于是,又一种非常牛逼的方法来了,CAH(Color/Angle Histogram)来了,意思就是,把图片从中心出发,像切蛋糕一样切成八块,然后比较两张图片同一个角里面的颜色分布,比如:区域1的蓝色个数,区域2的红色个数,用特定的数学方法作比较,再把结果汇总,这样子,之前那种情况就会被杀的干干净净(没有这么夸张)。
但是,事实证明,只用这一个办法,结果还是不尽如人意,所以,之前的canny又被用上,当做一个因子,来计算总的similarity,效果终于达到了60个percent的recall。
理论总结到此结束,下一篇讲实现。
433



被折叠的 条评论
为什么被折叠?



