主要思路如下:
①输入三张图片
②灰度化
③归一化
④获得三个直方图分布
⑤每张图片分成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),'°']); |