[인공지능] 이미지가 비슷한지 비교하기

2018. 5. 31. 11:08Python-이론/python-인공지능2

이미지 비슷한 정도 비교하기



이번강의에서는 두개의 이미지를 비교하여 얼마나 비슷한지 html코드로 나타내는 기능을 만들어 보겠다. 우선 이사이트에 들어가서 이미지를 다운받길 바랍니다.


이미지 다운받기

import cv2
import numpy as np
import os, re

search_dir = "../images/101"
cache_dir = "../images/cache_avash"

if not os.path.exists(cache_dir):
    os.mkdir(cache_dir)


def average_hash(fname):
    fname2 = fname[len(search_dir):] # ../images/101이 다음값 부터를 fname2에 넣는다. ex)/chair/image_0016.jpg"
    cache_file = cache_dir + "/" + fname2.replace('/', '_')+ ".csv"
    if not os.path.exists(cache_file):
        img = cv2.imread(fname, cv2.IMREAD_GRAYSCALE) #사진을 그레이색으로 변경
        img = cv2.resize(img, None, fx=16 / img.shape[1], fy=16 / img.shape[0], interpolation=cv2.INTER_AREA) #16*16으로 resize
        value = img[:]
        avg = value.mean()
        px = 1 * (value > avg) #*각픽셀의 값이 avg보다 크면 반환
        np.savetxt(cache_file, px, fmt="%.0f", delimiter=",")
    else:
        px = np.loadtxt(cache_file, delimiter=",")
    return px


def hamming_dist(a, b):
    dist = (a != b).sum() #이차원 배열 a, b가 서로 다른 픽셀값의 합을 반환
    return dist


def enum_all_files(path):
    for root, dirs, files in os.walk(path+"/"): #root -> files ->
        for f in files:
            fname = os.path.join(root+"/", f)
            if re.search(r'\.(jpg|jpeg|png)$', fname): #정규 표현식으로 이미지 확장자 찾아서 파일 네임 반환
                yield fname #return 처럼 값을 반환은 하지만 함수가 종료되지 않는다. 


def find_image(fname, rate):
    src = average_hash(fname) #base가 되는 이미지의 픽셀값을 미리 구해놓는다.
    for fname in enum_all_files(search_dir):
        dst = average_hash(fname)
        diff_r = hamming_dist(src, dst) / 256 #이미지가 16*16이라서 256을 나누어 준다. 
        if diff_r < rate: #두 이미지의 차이가 몇퍼센트가 되느냐에 따라 다르게 나타낸다. 
            yield (diff_r, fname)


srcfile = search_dir + "/chair/image_0016.jpg"
html = ""

sim = list(find_image(srcfile, 0.25))
#html 코드 생성
sim = sorted(sim, key=lambda x: x[0]) #퍼센테이지 오름차순으로 정렬
for r, f in sim:
    print(r, ">", f)
    s = '

[차이:' + str(r) + '-' + \ os.path.basename(f) + ']

' + \ '

' + \ '

' html += s html = """

원래 이미지

{1} """.format(srcfile, html) with open("./avhash-search-output.html", "w", encoding="utf-8") as f: f.write(html)




이미지를 보면 차이가 25퍼센트 미만인 이미지를 html 코드로 보여주고 있다.