简单图像比对方法——巴氏系数 余弦相似度

图像相似度的研究在目标跟踪,图像匹配,图像拼接等领域占有重要的地位。图像的相似性一直是图像处理的热门方向之一,不仅有广泛的前途,而且有重大的研究意义。图像相似度至今没有一个统一的概念。每个领域都有自己的定义,图像的相似性一般是基于图像的全局特征来判断两幅图像的相似度,图像特征点匹配和提取是图像处理研究领域的基础课程,也是机器视觉的关键技术之一,广泛应用于虚拟现实,视频压缩,图像复原,图像数据库检索等技术中,具有广泛的应用前景及社会经济价值。因此,特征点的提取和匹配越来越得到研究人员的关注。

本文显示利用直方图相似度算法与巴氏系数对图像进行比对并输出比对结果,以后文章中,也有对Harris角点检测,SIFT进行详细描述

(直方图相似性)

图像中的像素灰度包含了图像的许多信息,最常见的是颜色直方图[[25],使用距离度量公式计算直方图的相似性,进而可以求出两幅图像的相似度。虽这种算法方便简单,但是该算法降低了图像的像素级,计算结果存在误差。它是把彩色图像转换成了灰度图像,然后计算图像的相似度。下面介绍利用颜色直方图判断图像相似性。颜色直方图是用来表示图像颜色的分布状况和图像中每种颜色的数量所占的比例大小,它与每种颜色所在的位置没有关系。在计算图像的颜色直方图时,需要把颜色降低颜色的等级(每个等级为直方图的一个bin条),然后统计出图像中的颜色落在每个等级上的像素个数,这样就可以获得图像的颜色直方图。

                                            简单图像比对方法——巴氏系数 余弦相似度

                                           图一 左为图像一的直方图结果 右为图片二的直方图结果

对于上述的两幅图像,可以看出他们的直方图颜色分布基本一致。在求出两幅原图像的颜色直方图后,需要先对颜色直方图进行归一化处理,再用距离度量方法来求出两幅图像的相似度,颜色直方图中各个bin条的个数是通过计算图像中颜色的个数而来的,它代表了图像的颜色特征,也可以表达出图像颜色分布情况。

(余弦相似度)

余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。这结果是与向量的长度无关的,仅仅与向量的指向方向相关。余弦相似度通常用于正空间,因此给出的值为0到1之间。

    对于两个向量,我们可以把它们想象成空间中的两条线段,都是从原点([0, 0, ...])出发,指向不同的方向。两条线段之间形成一个夹角,如果夹角为0度,意味着方向相同、线段重合;如果夹角为90度,意味着形成直角,方向完全不相似;如果夹角为180度,意味着方向正好相反。因此,我们可以通过夹角的大小,来判断向量的相似程度。夹角越小,就代表越相似。以二维空间为例,a和b两个向量,我们要计算它们的夹角θ。余弦定理求得。假定a向量是[x1, y1],b向量是[x2, y2],数学家已经证明,余弦的这种计算方法对n维向量也成立。假定A和B是两个n维向量,A是 [A1, A2, ..., An] ,B是 [B1, B2, ..., Bn] ,则A与B的夹角θ的余弦等于

                        简单图像比对方法——巴氏系数 余弦相似度

 

使用这个公式,我们就可以得到,句子A与句子B的夹角的余弦。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。得到两个向量的夹角之后,我们就可以通过角度的大小来判别它们的相似程度。至此,我们就完成了两幅图像的相似度计算,因此,可以通过此算法来寻找相似的图像。 

                                 简单图像比对方法——巴氏系数 余弦相似度

 

                                                           图二  余弦值为一代表两个图完全相同

                                                     余弦值在0~1之间,趋于1说明图像越相似。

具有旋转不变性,图像无论怎么旋转,计算出来的直方图都是一样的,然后通过度量方法能够很容易的得出图像的相似度数。这种方法计算简单,而且很容易实现,但是该方法也有一定的不足之处,直方图就是对图像像素的压缩,这样会存在不准确性,有时会存在不同的图像但是直方图很相似,图像颜色的微小变化,都会造成很大的误差。这种算法虽然简单但不是很完善,所以单靠这种算法并不能准确的判断图像相似度。基于图像像素灰度的相似度算法还有其他算法,像利用巴实系数来计算图像之间的相似度等等。

2.2.2巴氏系数

巴氏系数全称为巴塔恰里雅(Bhattacharyya coefficient) 系数,是向量相似度匹配中(如:用于衡量参考模版与候选模版的颜色概率分布的相似度或者说相关性测量)最常用的算法,巴氏系数计算,计算公式如下:

                     简单图像比对方法——巴氏系数 余弦相似度

其中P, P’分别代表源与候选的图像直方图数据,对每个相同i的数据点乘积开平方以后相加得出的结果即为图像相似度值(巴氏系数因子值),范围为0到1之间。越接近0,证明图像越相似.

                                                简单图像比对方法——巴氏系数 余弦相似度

                                                        图四 为巴氏系数判断图像结果

参考代码:

function v=tineyesearch_hist(~,~)
picture1=imread('JMU.jpg');
picture2=imread('JMU.jpg');
t1=picture1;
t2=picture2;
[a1,b1]=size(t1);
%t2=imresize(t2,[a1 b1],'bicubic');
t1=round(t1);
t2=round(t2);
e1=zeros(1,256);
e2=zeros(1,256);
for i=1:a1
    for j=1:b1
        m1=t1(i,j)+1;
        m2=t2(i,j)+1;
        e1(m1)=e1(m1)+1;
        e2(m2)=e2(m2)+1;
    end
end
figure;
imhist(uint8(t1));
figure;
imhist(uint8(t2));
%将直方图分为64个区
m1=zeros(1,64);
m2=zeros(1,64);
for i=0:63
    m1(1,i+1)=e1(4*i+1)+e1(4*i+2)+e1(4*i+3)+e1(4*i+4);
    m2(1,i+1)=e2(4*i+1)+e2(4*i+2)+e2(4*i+3)+e2(4*i+4);
end
%计算余弦相似度
A=sqrt(sum(sum(m1.^2)));
B=sqrt(sum(sum(m2.^2)));
C=sum(sum(m1.*m2));
cos1=C/(A*B);
cos2=acos(cos1);%hu
v=cos2*180/pi;%jiao
figure;
imshow(uint8([t1,t2]));
title(['余弦值为:',num2str(cos1),'       ','余弦夹角为:',num2str(v),'°']);
%巴氏系数;
I=rgb2gray(picture1);
J=rgb2gray(picture2);
[Count1,~]=imhist(I);
[Count2,~]=imhist(J);
Sum1=sum(Count1);
Sum2=sum(Count2);
Sumup=sqrt(Count1.*Count2);
SumDown=sqrt(Sum1*Sum2);
Sumup=sum(Sumup);
HistDist=1-sqrt(1-Sumup/SumDown);
if HistDist< 0.5
   fprintf("不是一个图片");
else
    fprintf("是一个图片");
end