skeleton 코드

[python] 이미지 유사도 체크 코드

DanGEE 2023. 3. 24. 15:59

두 개의 폴더 비교하여 중복 있을 경우 리스팅

1) opencv 사용 (structural similarity -- opencv-python 은 c++을 python으로 감싼거라서 속도는 거의 비슷 ) 

2) structural similarity -- 갱장히 느림. multiprocessing 으로 속도 상향 . (core 수 최대로 잡음 유의) 

3) 이중 for문 사용,  이전 인덱스는 비교하지 않음 ( 이미 비교 됬으니까 ) 

 

4) 멀티프로세싱시에 파일에 쓰는게 안되서 일단은 그냥 출력하고 그거 긁어다가 사용...
출력 저장 왜 안되능가? 

 

from skimage.metrics import structural_similarity
import cv2
import numpy as np
import os
from tqdm import tqdm
import shutil
import multiprocessing

#path1='./RGB_001/images/'
#path2='./RGB_002/images/'

path1='./total/'
path2='./006/images/'
flist1=os.listdir(path1)
flist2=os.listdir(path2)

flist1.sort()
flist2.sort()

h=108
w=192

def process_file(f2_idx):
    f2 = flist2[f2_idx]
    #print(f2)
    second_gray = cv2.imread(path2+f2, cv2.IMREAD_GRAYSCALE)
    second_gray = cv2.resize(second_gray, dsize=(w, h))
    #cnt=0
    for f1 in flist1[f2_idx:]:
        first_gray = cv2.imread(path1+f1, cv2.IMREAD_GRAYSCALE)
        first_gray = cv2.resize(first_gray, dsize=(w, h))
        score, diff = structural_similarity(first_gray, second_gray, full=True)
        #if cnt>20:
        #    break
        #cnt+=1
        if score * 100 > 50:
            if f2 != f1:
                #print("  score:", "{:.3f}%".format(score * 100), "i2", f2, "i1", f1, file=samelist)
                #samelist.write(f"  score: {score * 100}, i2: {f2} i1: {f1}\n")
                print("  score:", score, "i1,i2 : ", f1, f2)
    else:
        print("no file")



if __name__ == '__main__':
    pool = multiprocessing.Pool()
    for _ in tqdm(pool.imap_unordered(process_file, range(len(flist2))), total=len(flist2)):
        pass
    pool.close()
    pool.join()
    #samelist.close()
    print("done")

 

 

 

 

두개의 이미지 유사도 검사하기 

 

from skimage.metrics import structural_similarity
import cv2
import numpy as np
import os
import sys


#f1=sys.argv[1]
#f2=sys.argv[2]
#f1=sys.argv[1]
#f2=sys.argv[2]
#f2="/mnt/myhdd/ir/"+sys.argv[2]
#f2="./006/images/"+sys.argv[2]
f1="./total/"+sys.argv[1]
f2="./total/"+sys.argv[2]


#f1=sys.argv[1]
#f2=sys.argv[2]
#f1='2.jpg'
#f2='3.jpg'
#flist1=os.listdir(path1)
#flist2=os.listdir(path2)

first = cv2.imread(f1)
second = cv2.imread(f2)
# Convert images to grayscale
first_gray = cv2.cvtColor(first, cv2.COLOR_BGR2GRAY)
second_gray = cv2.cvtColor(second, cv2.COLOR_BGR2GRAY)
#img_sub=cv2.subtract(first_gray, second_gray)
score, diff = structural_similarity(first_gray, second_gray, full=True)
#retval, imgbi =cv2.threshold(img_sub, 50, 255, cv2.THRESH_BINARY)
#cntpix = np.sum(imgbi == 0)
h, w= first_gray.shape
#print(float(cntpix)*100/(w*h))
print(score*100)
cv2.imwrite('img1.jpg',first)
cv2.imwrite('img2.jpg',second)