반응형

유사하거나 중복 사진을 찾아주는 파이썬 예제 코드입니다. 

 

아래 링크에 있는 코드를 수정하여 사용했습니다. 

https://github.com/cw-somil/Duplicate-Remover



2022. 11. 16  최초작성



from PIL import Image
import imagehash
import cv2
import os
import numpy as np


class DuplicateRemover:

    def __init__(self, hash_size = 256, similarity= 80):
        self.hash_size = hash_size
        self.similarity = similarity
   
    def get_hash(self, filename):
        img = cv2.imread(filename)
        img = img[:,:,:3] # discard alpha channel
        img = Image.fromarray(img)

        temp_hash_TF = imagehash.average_hash(img, self.hash_size).hash
        return [filename, temp_hash_TF]
   
       
    def find_duplicates1(self, dirname, filename):
       
        fnames = os.listdir(dirname)

        print("Finding Duplicates Now!\n")

        threshold = 1 - self.similarity/100
        diff_limit = int(threshold*(self.hash_size**2))
        print('diff_limit', diff_limit)

        list_item = []

        for image in fnames:
            f = os.path.join(dirname,image)
            item = self.get_hash(f)
            list_item.append(item)

        new_item = self.get_hash(filename)

        found = None
        for item in list_item:
     
            diff = np.count_nonzero( item[1] != new_item[1])
            if diff <= diff_limit:
                found = [item, diff]
                break
               
        if found != None:
            print("Duplicate {} \nfound for Image {}!  {}\n".format(found[0][0], new_item[0], found[1]))


    def find_duplicates2(self, dirname):
       
        fnames = os.listdir(dirname)

        list_item = []
        list_duplicate = []

        print("Finding Duplicates Now!\n")

        threshold = 1 - self.similarity/100
        diff_limit = int(threshold*(self.hash_size**2))
        print('diff_limit', diff_limit)

        for image in fnames:
           
            f = os.path.join(dirname,image)
            new_item = self.get_hash(f)

            found= None
            for item in list_item:
               
                diff = np.count_nonzero(item[1] != new_item[1])
                if diff <= diff_limit:
                    found = [item, diff]
                    break
                   
            if found != None:
                print("Duplicate {} \nfound for Image {}! {}\n".format(found[0][0], new_item[0], found[1]))
                list_duplicate.append(found)
            else:
                list_item.append(new_item)


dr = DuplicateRemover(similarity=85)



# dirname1 경로에 filename1과 유사한 사진이 있는지 체크합니다.
dirname1 = "./test copy"
filename1 = './test copy/rabbit1.jpg'

dr.find_duplicates1(dirname1, filename1)
print('-'*80)



# dirname2 경로에 유사한 사진이 있는지 체크합니다.
dirname2 = "./test"

dr.find_duplicates2(dirname2)





반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts