matlab余弦距离计算相似度

该博客介绍了一种通过计算余弦相似度来比较三张图片相似度的方法。首先,输入三张图片并进行灰度化、归一化处理,然后获取每张图片的直方图分布,并将其分为64个区。接着,计算每个区的频数向量,使用余弦相似度计算两两之间的相似度。结果显示img1和img2的相似度最高,余弦值为0.94204,余弦夹角为19.6029°。MATLAB代码展示了整个过程。
摘要由CSDN通过智能技术生成

主要思路如下:

①输入三张图片

②灰度化

③归一化

④获得三个直方图分布

⑤每张图片分成64个区,三张图片得到三个向量

⑤三个向量,两两之间计算余弦相似度

三张图片

结果:

(图1)

图1自左至右分别是img1、img2、img3的直方图。

(图2)

图2表示img1和img2的余弦相似度,余弦值为0.94204,余弦夹角为19.6029°

(图3)

图3表示img1和img3的余弦相似度,余弦值为0.79062,余弦夹角为37.7561°

(图4)

图4表示img2和img3的余弦相似度,余弦值为0.8748,余弦夹角为28.9781°

综上,根据计算可得,图二中两张图片的余弦值最高,余弦夹角最小,意味着图二中两个图片的向量方向相同、线段重合的相似度最高,故img1和img2的相似度最高。

MATLAB语言代码如下:

%%输入图像

img1=imread('DAV-Task1-1.bmp');

img2=imread('DAV-Task1-2.bmp');

img3=imread('DAV-Task1-3.bmp');

%%灰度化

t1=rgb2gray(img1);

t2=rgb2gray(img2);

t3=rgb2gray(img3);

%%获得直方图分布

[a1,b1]=size(t1);

t1=round(t1);

t2=round(t2);

t3=round(t3);

e1=zeros(1,256);

e2=zeros(1,256);

e3=zeros(1,256);

for i=1:a1

    for j=1:b1

        m1=t1(i,j)+1;

        m2=t2(i,j)+1;

        m3=t3(i,j)+1;

        e1(m1)=e1(m1)+1;

        e2(m2)=e2(m2)+1;

        e3(m3)=e3(m3)+1;

    end

end

figure;

imhist(uint8(t1));

figure;

imhist(uint8(t2));

figure;

imhist(uint8(t3));

%%将直方图分为64个区

m1=zeros(1,64);

m2=zeros(1,64);

m3=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);

    m3(1,i+1)=e3(4*i+1)+e3(4*i+2)+e3(4*i+3)+e3(4*i+4);

end

%%计算余弦相似度

A=sqrt(sum(sum(m1.^2)));

B=sqrt(sum(sum(m2.^2)));

C=sqrt(sum(sum(m3.^2)));

D=sum(sum(m1.*m2));

E=sum(sum(m1.*m3));

F=sum(sum(m2.*m3));

cos1=D/(A*B);%%计算余弦值

cos2=E/(A*C);

cos3=F/(B*C);

cos4=acos(cos1);%%弧度

cos5=acos(cos2);

cos6=acos(cos3);

v1=cos4*180/pi;%%换算成角度

v2=cos5*180/pi;

v3=cos6*180/pi;

figure;

imshow(uint8([t1,t2]));

title(['余弦值为:',num2str(cos1),'       ','余弦夹角为:',num2str(v1),'°']);

figure;

imshow(uint8([t1,t3]));

title(['余弦值为:',num2str(cos2),'       ','余弦夹角为:',num2str(v2),'°']);

figure;

imshow(uint8([t2,t3]));

title(['余弦值为:',num2str(cos3),'       ','余弦夹角为:',num2str(v3),'°']);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值