[ Scikit-image ] 利用 SSIM篩選相似度過高的圖像



之前有提到過利用 Hamming distance對兩張照片進行相似度的比對, "利用PhotoHash篩選相似度過高的圖像"。
最近發現另一個相似度的方法,這個方法叫做 SSIM(Structural Similarity Index),有興趣的可以維基一下。
好在 Scikit-image裡已經提供它的算法,參數的部份可以參考這裡
  1. from skimage.measure import compare_ssim
  2. import numpy as np
  3. import cv2
  4. import os
  5. import glob
  6.  
  7. def filter(member):
  8. img_list = glob.glob('./{0}/*.png'.format(member))
  9. img_list.sort(key=lambda num: int(num.split('/')[-1].split('.')[0]))
  10.  
  11. for img in img_list:
  12. img_path = img
  13. next_img = cv2.imread(img_path,0)
  14. if 'img_target' in locals():
  15. s = compare_ssim(img_target, next_img)
  16. if s >= 0.8:
  17. if not os.path.isdir("./{0}/similar".format(member)):
  18. os.system("mkdir ./{0}/similar".format(member))
  19. print("make dir ./{0}/similar".format(member))
  20. os.system("mv {0} ./{1}/similar".format(img_path, member))
  21. print("move {0} to ./{1}/similar".format(img_path, member))
  22. continue
  23. img_target = next_img
  24.  
  25. names = ["Nayeon", "Jeongyeon", "Momo", "Sana", "Jihyo", "Mina", "Dahyun", "Chaeyoung", "Tzuyu"]
  26.  
  27. for member in names:
  28. filter(member)
  29.  
  30. print('Done!!')
辨識的結構跟上一章沒有差太多,一樣是按照順序比較,只有改變辨識的方法。
先利用 OpenCV讀取圖像並轉為 Grayscale,透過 compare_ssim方法計算相似度。
compare_ssim計算出來的值會在 -1~1之間,數字越大相似度越高。 

以上十張圖像都是被 SSIM篩選出來的,不是同一張喔。

以上十張圖像是被 SSIM保留的,去除相似值0.9以上的。

以上十張圖像是之前被 PhotoHash保留的,去除 distance小於2。
盡量找了同一個 Frame開始連續十張,順便試了效果比較接近的相似值
其實兩種方式效果好像差不多,不過整體表現就要多嘗試了。

要比較全部的照片的話,只要稍微修改就可以了。
  1. from skimage.measure import compare_ssim
  2. import numpy as np
  3. import cv2
  4. import os
  5. import glob
  6.  
  7. def filter(member):
  8. img_list = glob.glob('./{0}/*.png'.format(member))
  9. while True:
  10. if img_list==[]:
  11. break
  12. img_target_path = img_list.pop()
  13. img_target = cv2.imread(img_target_path,0)
  14. for img_path in img_list:
  15. img = cv2.imread(img_path,0)
  16. s = compare_ssim(img_target, img)
  17. if s >= 0.8:
  18. if not os.path.isdir("./{0}/similar".format(member)):
  19. os.system("mkdir ./{0}/similar".format(member))
  20. print("make dir ./{0}/similar".format(member))
  21. os.system("mv {0} ./{1}/similar".format(img_path, member))
  22. print("move {0} to ./{1}/similar".format(img_path, member))
  23. img_list.remove(img_path)
  24.  
  25. names = ["Nayeon", "Jeongyeon", "Momo", "Sana", "Jihyo", "Mina", "Dahyun", "Chaeyoung", "Tzuyu"]
  26.  
  27. for member in names:
  28. filter(member)
  29.  
  30. print('Done!!')

留言