一文教你搞懂影像相似度

  • 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上發布

如需轉載,請在公眾號中回復「轉載」獲取授權,未經授權擅自搬運抄襲的,必將追究其責任!