相似图片搜索原理三(颜色直方图—c++实现)
2015-09-23 11:27
477 查看
图像的颜色直方图可以用于图像检索,适应有相同色彩,并且可以有平移、缩放、旋转不变性的图像检索,当然了这三大特点不如sift或者surf稳定性强,此外最大的局限就是如果形状内容一样,但色彩不一,结果是搜不到的。不过它在某些情况下达到较好的结果。
颜色直方图两种计算方式:
彩色图像的颜色直方图,这里可以有两种处理方式,得到的效果应该差不多。
首先第一种就是对像素的每个通道都进行划分,每个通道的最大像素值为255,可以等分8、16或者64等分,这样每个通道的范围就是0~15(以16等分为例,当然等分越小,像素值取的范围越大,越精确,但图像维数就越大,消耗时间复杂度大)。这样三通道得到图像维数就是16*16*16=4096维(从[0,0,0]一直到[15,15,15])。代码中我们使用了得到其下标操作为i+(j<<4)+(k<<8)就等于i+j*16+k*16*16。比如一个像素为[4,1,20],那么就会有hist[4+1*16+20*16*16]++;
第二种方法是单独计算每个通道像素值的个数,比如一个像素点值为[4,1,20],那么就有bhist[4] ++
4000
;ghist[1]++; rhist[20]++;这样就得到3个256维的一维向量,然后可以做叠加操作。
距离的度量
距离的度量通常有欧式距离、皮尔逊相关系数及余弦距离。但是这里百度百科上说在做直方图相似性度量时,巴氏距离效果最佳。我这里做了简单测试,发现欧式距离的确效果很差,这可能的原因比如当[5,5]与[1,1]应该相似的,但是欧式距离发现它们距离会很大。此外,这里余弦距离,测试效果也行,也是可以用的。
巴氏距离:又叫巴氏系数。用于测量两离散概率分布。它常在分类中测量类之间的可分离性。计算公式如下:
其中P, P’分别代表源与候选的图像直方图数据,对每个相同i的数据点乘积开平方以后相加得出的结果即为图像相似度值(巴氏系数因子值),范围为0到1之间。为什么是到1之间,这是数学的问题,就不追究了。当p(i)==p’(i) for all i时,结果就会为1。 p(i)与p’(i)都在0~1之间。p(i)表示为该像素值出现的次数和除以总的像素个数,就是一个概率,代码中可以看出。
代码:
计算方式一:
(1)得到颜色直方图:
?
(2)三种距离度量的代码
?
测试图片:
余弦结果:
巴氏距离结果:
其中【i-j】, i代表personi, j代表personi与person的汉明距离。并由结果可见phash对于图片的旋转肯定是无能为力的。
由结果可见,针对person6,很相似,但余弦结果不好,而巴氏距离很好,此外巴氏距离对于原图不是1,是因为计算过程中的精度丢失造成的。
计算方式二:
(1)得到颜色直方图
?
(2)三种距离度量的代码
?
余弦结果:
巴氏距离结果:
其中【i-j】, i代表personi, j代表personi与person的汉明距离。并由结果可见phash对于图片的旋转肯定是无能为力的。
颜色直方图两种计算方式:
彩色图像的颜色直方图,这里可以有两种处理方式,得到的效果应该差不多。
首先第一种就是对像素的每个通道都进行划分,每个通道的最大像素值为255,可以等分8、16或者64等分,这样每个通道的范围就是0~15(以16等分为例,当然等分越小,像素值取的范围越大,越精确,但图像维数就越大,消耗时间复杂度大)。这样三通道得到图像维数就是16*16*16=4096维(从[0,0,0]一直到[15,15,15])。代码中我们使用了得到其下标操作为i+(j<<4)+(k<<8)就等于i+j*16+k*16*16。比如一个像素为[4,1,20],那么就会有hist[4+1*16+20*16*16]++;
第二种方法是单独计算每个通道像素值的个数,比如一个像素点值为[4,1,20],那么就有bhist[4] ++
4000
;ghist[1]++; rhist[20]++;这样就得到3个256维的一维向量,然后可以做叠加操作。
距离的度量
距离的度量通常有欧式距离、皮尔逊相关系数及余弦距离。但是这里百度百科上说在做直方图相似性度量时,巴氏距离效果最佳。我这里做了简单测试,发现欧式距离的确效果很差,这可能的原因比如当[5,5]与[1,1]应该相似的,但是欧式距离发现它们距离会很大。此外,这里余弦距离,测试效果也行,也是可以用的。
巴氏距离:又叫巴氏系数。用于测量两离散概率分布。它常在分类中测量类之间的可分离性。计算公式如下:
其中P, P’分别代表源与候选的图像直方图数据,对每个相同i的数据点乘积开平方以后相加得出的结果即为图像相似度值(巴氏系数因子值),范围为0到1之间。为什么是到1之间,这是数学的问题,就不追究了。当p(i)==p’(i) for all i时,结果就会为1。 p(i)与p’(i)都在0~1之间。p(i)表示为该像素值出现的次数和除以总的像素个数,就是一个概率,代码中可以看出。
代码:
计算方式一:
(1)得到颜色直方图:
?
?
余弦结果:
巴氏距离结果:
其中【i-j】, i代表personi, j代表personi与person的汉明距离。并由结果可见phash对于图片的旋转肯定是无能为力的。
由结果可见,针对person6,很相似,但余弦结果不好,而巴氏距离很好,此外巴氏距离对于原图不是1,是因为计算过程中的精度丢失造成的。
计算方式二:
(1)得到颜色直方图
?
?
巴氏距离结果:
其中【i-j】, i代表personi, j代表personi与person的汉明距离。并由结果可见phash对于图片的旋转肯定是无能为力的。
相关文章推荐
- c语言学习笔记(4)struct和union:柔性数组存储斐波那契数列以及union判断系统大小端
- 【读书笔记:C++ primer plus 第六版 中文版】第16章 string类和标准模板库
- iOS开发之SQLite--C语言接口规范(五)——iOS开发使用SQLite实例
- 黑马程序员---C语言学习笔记之语言模块化编程概念
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
- Item 34:区分接口继承和实现继承 Effective C++笔记
- 探讨C语言中关键字volatile的含义_C
- C++设计模式——组合模式
- C语言深度学习——入门篇
- C语言实验——某年某月的天数
- FLT_MAX 和 FLT_MIN的定义
- 一种简单的c++文件操作方式
- 九九乘法表的C语言实现
- C++获取系统时间
- 【VC++】程序运行到if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)异常的解决方案
- 类的静态成员
- C/C++——strcpy函数的实现和解析
- C++ string类与scanf和printf
- c++primer plus第十三章-派生类与基类
- 【C语言的日常实践(八)】弦