[ 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之間,數字越大相似度越高。 

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

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

以上十張圖像是之前被 PhotoHash保留的,去除 distance小於2。
盡量找了同一個 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!!')

留言