图像处理大型科普——图像直方图
偶尔跟在浙大读研的湖大一姐谈起轮廓识别,她正在做一个能把衣服分类成不同款式的应用,衣服平摊好,然后用手机一扫,马上就能告诉你这是T-SHIRT还是裙子,什么?你敢说这玩意鸡肋?T-SHIRT和裙子当然容易分别,但那些
莲蓬裙、连衣裙、连体裙、半截裙、背带裙、连体裤、热裤、短裤、超短裤、齐X裤、打底裤、靴裤、吊带裤你真的分得清楚么?
分不清的先去一旁罚歌一首
继续说正事
学姐大概是这么做的,先灰度,然后获取高频分量,然后根据高频分量二值化,然后获取轮廓的点集,然后通过直方图跟数据库里的预设模型数据做相似度匹配,最后匹配度高的是结果。
慢着,直方图能做匹配??
话刚码完,学姐刷的一下甩我一篇英文论文:“一起看看?”(论文的链接甩这:Shape-context.pdf)
在度娘、谷神以及有道哥的帮助下大致理解了文中的意思,也让我对直方图这个概念有了更深的认识
对于刚刚接触matlab图像处理的来说,一谈起直方图马上就想到了用imhist()绘制图像的直方图
又或者是用histeq()均衡直方图,让图片对比度更加高,甚至去除图片中的白噪(之前也写过一篇去除雾霾白噪的:MATLAB图像处理:一分钟去除图片中的雾霾)
尽管matlab中的直方图有很多现成的应用,但千万别把直方图的定义限制在这几个函数里了,难不成人家Word\Excel里的直方图就不是直方图了么?
联想到各种报表、文案中的直方图,我觉得我们之所以使用直方图,主要是希望能有分类统计的功能,
对于图像处理中的直方图,对像素进行分类统计是我们最常使用的一种方式
于是得到灰度值的直方图:
关于这张图,也是有很多地方可以用的到的
比如说我们可以利用图像的细长峰值判断图像的主要信息集中在哪个灰度上,
利用图像两峰之间的面积判断背景色在哪个灰度上,
也可以用峰谷判断噪点所在的灰度,
同样可以利用该图中的灰度期望给出一个理想的二值化分界值。
甚至在手绘(最近有点迷上painter手绘。。。)中决定绘画中的主色调,背景色,和高亮点所对应的色彩范围,大大减少配色的难度。
倘若把这个直方图量化开来,变成一个size = 256的[gray_value ,count_num]形式的矩阵,完全可以把它当做这张图片特有的指纹,一个256维的向量,无论这张图片旋转多少角度,这个向量都不会改变,是的,终于绕回来了,任意一张图片都可以对应这样的一个向量,并且维度都是256哦,至于向量,管他多少维的,都是一条直线,那么两条直线的相似度不就是直线的夹角咯,(此处不贴公式,想一探究竟的请自行百度“n维向量的夹角”)哈哈,这不就完美的解决了图片旋转前后的匹配的问题么~~
做事要严谨,我一开始的确以为这就是直方图的匹配方式的,不过仔细一想,256维的向量角度。。。。。这计算量,这精确度,还得经受环境光源的影响,这么苛刻的匹配环境用在识别衣服款式上,几乎是得不到回报的
回到上文中提到的论文中,还得怪我们对直方图的认识太肤浅狭隘,我们一直都在灰度值的直方图中打转转,用统计的思想去碰概率,然而直方图不仅是统计,还可以分类,不仅是灰度值的直方图,也可以是别的什么的直方图啊。
前方高能,集中注意
这里特别提到的,是用于分类 轮廓点集 的一种直方图:
a和b是两张图的轮廓点集,c是一个坐标系,把一个圆按照离圆心的距离、和正北的角度两个指标分成60个块(角度分成12类区域,距离分成5类区域,12*5=60),然后遍历点集的每一个点,以当前遍历的点为C坐标的圆心,把其他点按60个区域划分,变成一个size = 60的素组,保存着每个块中的轮廓点数量,现在每个点都对应了一个关于其他点的直方图,就像d、e、f三张图一样,60个小方块,点的数量越多,颜色越深。
最后一步,比较a、b两两点间的相似度,获取匹配度最高的那个点与之对应,最终得运行结果就像图g中一样,无论图像旋转,缩放,还是光源的角度强弱,都不会对结果造成有效影响,最大程度上保证了匹配的精度。
这是一个很好的例子,来说明直方图在分类上的特别能力,我觉得在之后的应用中, 我们也可以通过制定分类指标的方式,把抽象的数据通过直方图分成大类,再进行简单的统计运算,最大化的发挥直方图在图相处理领域分类统计的作用。
希望大家通过这篇博文可以对身边的事物有更多奇葩的使用想法和理解方式,老是用别人的东西也没意思噻,反正这老外的思维我是服了