一文教你搞懂图像相似度

  • 2020 年 1 月 13 日
  • 筆記

小编在浏览论坛的时候,发现网友糖心疼分享的一份用易语言编写的基于三原色原理来做图片相似识别的程序,下载使用后发现效果还不错,因此决定将他写的程序改编成matlab版。

众所周知,RGB模式图像由3个颜色通道组成,即红色通道(Red)、绿色通道(Green)和蓝色通道(Blue),每个通道均采用8位颜色信息表征,每种颜色的取值范围是0~255,这三个通道组合可产生1670万多种颜色。

基本原理:对于两张主体内容相似的图片而言,其所用的颜色数量基本上是相近的。而对于两张主体内容完全不同的图像,其所用颜色数量一般情况下都存在着较大差异。因此将RGB图像各通道对应的256个颜色值数量作为相应图像特征编码。考虑到相近颜色肉眼无法甄别的因素,引入颜色值数量容差的概念,即在同一个通道下,两张图像在某个颜色值处的颜色值数量差,不大于设定颜色数差值,则认为颜色相同,否则认为不相同,而这个设定颜色数差值即为颜色值数量容差。设定容差值后, 根据容差值对原图和测试图各个通道相应的颜色值数量进行做差,若在容差范围内,则对应通道的相同颜色数量加1,统计完成后将三个通道相同颜色数量累加与256*3个颜色数相除,其比值作为两张图片的相似度。

不难发现,若两张图像越相似,图像越接近1,反之,越接近0。该算法具有抗图像旋转、抗颜色干扰等优点。下面就一起来看看matlab版的吧。

clc;clear;  % 读取原始图  S = imread('1.bmp');  % 提取图库中对应标号图片  num = 18;  T = imread([pwd,'img',num2str(num),'.jpg']);  % 分离原始图和测试图的RGB值  sR = getRGBCount(S(:,:,1));  sG = getRGBCount(S(:,:,2));  sB = getRGBCount(S(:,:,3));  tR = getRGBCount(T(:,:,1));  tG = getRGBCount(T(:,:,2));  tB = getRGBCount(T(:,:,3));    % 设置色元容差  epsv = 100;  % 初始化各通道颜色相同数  rs = 0;  gs = 0;  bs = 0;  % 循环统计各通道颜色相同数  for k = 1:256      % 满足容差条件则颜色相同数加一      if abs(sR(k)-tR(k)) <= epsv         rs = rs + 1;      end      if abs(sG(k)-tG(k)) <= epsv         gs = gs + 1;      end      if abs(sB(k)-tB(k)) <= epsv         bs = bs + 1;      end  end  ss = rs + gs + bs;  xsd = 100*ss/(256*3);  disp(['相似度为:',num2str(xsd),'%']);

主体内容完全不同的图像相似度

主体经旋转后的图像相似度

怎么样?效果还不错吧!需要完整程序图片库的小伙伴请在matlab爱好者公众号中回复“相似度”获取。欢迎大家在推文下方留言讨论!

互动专区

公众号中回复“微信”加入微信群;回复“qq”加入QQ群;回复“共享”加入原创代码共享QQ群;回复“投稿”赚取零花钱;回复“下载”免费下载CSDN等平台资源;每日回复“签到”即可参与签到,连续签到有神秘大奖;回复“福利”即可了解公众号的福利锦集!特别说明:公众号已开启人工智能机器人功能,有问题欢迎加群讨论!

特别鸣谢:感谢网友糖心疼分享的图片以及相关参考资料

参考资料:

[1] https://bbs.125.la/thread-14501684-1-1.html

[2] https://blog.csdn.net/sinat_37967865/article/details/92840400

文中图片:糖心疼分享

封面图片:由 user1469083764 在Pixabay上发布

如需转载,请在公众号中回复“转载”获取授权,未经授权擅自搬运抄袭的,必将追究其责任!