전공 공부/데이터 분석

유사한 이미지 삭제하기

상솜공방 2024. 2. 2. 13:19

폴더에 너무 유사한 이미지가 많다면, 이를 삭제

import os
import PIL
import json
import glob
import numpy as np
from PIL import Image
import cv2, numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc

def similar_image_deletion(dir_path: str, index: int):
    dir_path = dir_path

    #img_dirs = [이미지 디렉토리 전부 저장]
    img_dirs = []
    for path in os.listdir(dir_path):
        img_dir = os.path.join(dir_path, path)
        img_dirs.append(img_dir)

    #imgs_dict = {이미지 디렉토리: 이미지 파일}
    imgs_dict = {}
    for img_dir in img_dirs:
        # 한글 경로의 이미지를 불러오기 위해 암호화
        img_array = np.fromfile(img_dir, np.uint8)
        img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
        imgs_dict[img_dir] = img

    #hists = [각 이미지에 대한 히스토그램]
    hists = []
    for i, img_dir in enumerate(imgs_dict):
        #---① 각 이미지를 HSV로 변환
        hsv = cv2.cvtColor(imgs_dict[img_dir], cv2.COLOR_BGR2HSV)
        #---② H,S 채널에 대한 히스토그램 계산
        hist = cv2.calcHist([hsv], [0,1], None, [180,256], [0,180,0, 256])
        #---③ 0~1로 정규화
        cv2.normalize(hist, hist, 0, 1, cv2.NORM_MINMAX)
        hists.append(hist)

    query = hists[index]
    methods = {'CORREL' :cv2.HISTCMP_CORREL,
               'CHISQR':cv2.HISTCMP_CHISQR, 
               'INTERSECT':cv2.HISTCMP_INTERSECT,
               'BHATTACHARYYA':cv2.HISTCMP_BHATTACHARYYA}
    
    similar_img_dir = []
    different_img_dir = []
    
    for i, (hist, img_dict) in enumerate(zip(hists, imgs_dict)):
        ret = cv2.compareHist(query, hist, 3)
        if ret < 0.1:
            continue
        elif ret < 0.3:
            similar_img_dir.append(img_dict)
        else:
            different_img_dir.append(img_dict)

    for i, img_dir in enumerate(similar_img_dir):
        plt.rc('font', family='Malgun Gothic') # 한글 폰트가 나오게
        plt.figure(figsize=(1,1))
        plt.title(img_dir)
        #temp_img = cv2.imread(img_dir)
        img_array = np.fromfile(img_dir, np.uint8)
        img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
        plt.imshow(img)
        plt.show()
        
    print("Number of removed images: {}".format(len(similar_img_dir)))
    
    for img_dir in similar_img_dir:
        print(img_dir)
        os.remove(img_dir)
    print("")
    
    dir_path = "./classes_02/어선 10톤 이하"
index = 0
num_of_files = len(os.listdir(dir_path))

while num_of_files > index:
    print("Number of updated folder: {}".format(num_of_files))
    print("Index: {}".format(index))
    similar_image_deletion(dir_path, index)
    index += 1
    num_of_files = len(os.listdir(dir_path))

'전공 공부 > 데이터 분석' 카테고리의 다른 글

파이토치 기초  (0) 2024.02.03
이미지 시각화 함수  (0) 2024.02.03
다양한 파일을 읽어와 이미지 분류하기  (0) 2024.02.02