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



盡量找了同一個 Frame開始連續十張,順便試了效果比較接近的相似值
其實兩種方式效果好像差不多,不過整體表現就要多嘗試了。
要比較全部的照片的話,只要稍微修改就可以了。
from skimage.measure import compare_ssim
import numpy as np
import cv2
import os
import glob
def filter(member):
img_list = glob.glob('./{0}/*.png'.format(member))
while True:
if img_list==[]:
break
img_target_path = img_list.pop()
img_target = cv2.imread(img_target_path,0)
for img_path in img_list:
img = cv2.imread(img_path,0)
s = compare_ssim(img_target, img)
if s >= 0.8:
if not os.path.isdir("./{0}/similar".format(member)):
os.system("mkdir ./{0}/similar".format(member))
print("make dir ./{0}/similar".format(member))
os.system("mv {0} ./{1}/similar".format(img_path, member))
print("move {0} to ./{1}/similar".format(img_path, member))
img_list.remove(img_path)
names = ["Nayeon", "Jeongyeon", "Momo", "Sana", "Jihyo", "Mina", "Dahyun", "Chaeyoung", "Tzuyu"]
for member in names:
filter(member)
print('Done!!')
留言
張貼留言