Python) compare two image - use Pillow

2021. 1. 30. 16:57Python

728x90
반응형

 

 

 

우선 간단하게 이미지를 비교하기 위해 제 블로그에 프로필 사진으로 해봤어요 ㅋㅋㅋ

노란색으로 하트를 그려놨으니 당연히 이미지가 다르다고 Check를 할 것이기 때문이죠

이미지를 비교하기 위해 제가 사용한 Library는 Pillow라는 것을 사용했습니다.

<사전 준비>

이미지를 비교하기 위해 Pillow를 설치를 해야 합니다.

pip install Pillow 명령어로 설치를 합니다.

그리고 또 requests 도 설치를 해야 합니다.

request가 필요한 이유는 URL로 넘어온 이미지는 Pillow에서 image.open시 오류가 나더라구요.

그래서 requests와 io를 통해서 이미지를 byte로 변환하여 image화 시키는 과정에서 필요합니다.

(닷넷 개발할 때 이미지나 파일 변환할 때 바이트로 변환해서 전송 많이 했었는데..ㅎㅎ)

어쨋든 아래 명령어로 설치를 합니다.

pip install requests

<코드 작성>

<com_img.py>

먼저 간단하게 사용하기 위해 클래스를 만들어서 작성을 했습니다.

필요한 선언문 작성해주고~

from PIL import Image, ImageChops
import io
import requests

클래스를 작성하고 비교할 이미지 경로를 처리하기 위해 받아올 파라미터 값을 받습니다

class Sunbae_Automation:
    def __init__(self, imgURL_path, imgLocal_path):
        self.__imgURL_path = imgURL_path
        self.__imgLocal_path = imgLocal_path

실질적으로 이미지 비교를 하기 위한 코드

ImageChos.difference라는 Method를 이용하여 비교를 하는데

둘 다 컨버트를 하는 건 일단 RGB화 시켜서 비교를 하려고 했습니다.

이미지와 비교를 해서 만약 다른 부분이 있다면 다른 부분에 대한 좌표 위치 값을 보여줍니다.

그래서 일단 값이 있다면 이미지는 다른 이미지라고 판단하게 작성

diff = ImageChops.difference(img1.convert('RGB'), img2.convert('RGB'))
# 다른 부분이 있는지?
if diff.convert('RGB').getbbox():
    isFlag = False
    # 다른 부분에 대한 값이 있는 경우 불일치
else:
    isFlag = True
    print(diff.convert('RGB').getbbox())

 

 


<main_stage.py>

작성한 클래스를 호출하기 위해 import 하고 비교할 이미지의 url과 경로들을 지정 합니다.

from comp_img import Sunbae_Automation

imgURL = "https://blogpfthumb-phinf.pstatic.net/MjAyMTAxMjZfODAg/MDAxNjExNjM4MTcxNzQ5.XMm4hIOEIAJurXjxx2yrv1v01VOBT_q6tutmSZOUST4g.5kuQNA_23MGs1wIy1PhWTra3ynQWpciBQwNI6uE8pAgg.PNG.tnsqo1126/profileImage.png?type=w161"
imgLocal = "D:\\MyProject\\python\\profileImage.png"

a = Sunbae_Automation(imgURL,imgLocal)

# 일치 하는가!
isflat = a.isAttendance()

if isflat == True:
    print("Match!!")
    # 일치 할 경우
else:
    print("not Match!!")
    # 불일치 할 경우

이렇게 하여 만약 이미지가 일치하거나 일치하지 않은 경우 메시지를 뿌려줍니다.

 



<전체 코드>

com_img.py

from PIL import Image, ImageChops
import io
import requests

class Sunbae_Automation:
    def __init__(self, imgURL_path, imgLocal_path):
        self.__imgURL_path = imgURL_path
        self.__imgLocal_path = imgLocal_path

    def __getImage(self,path):
        response = requests.get(path)
        image_bytes = io.BytesIO(response.content)
        imgURL = Image.open(image_bytes)
        return imgURL

    def isAttendance(self):
        isFlag = True

        img1 = self.__getImage(self.__imgURL_path)
        img2 = Image.open(self.__imgLocal_path)

        try:            
            diff = ImageChops.difference(img1.convert('RGB'), img2.convert('RGB'))
            # 다른 부분이 있는지?
            if diff.convert('RGB').getbbox():
                isFlag = False
                # 다른 부분에 대한 값이 있는 경우 불일치
            else:
                isFlag = True
                print(diff.convert('RGB').getbbox())
        except:
            isFlag = True

        return isFlag


main_stage.py

from comp_img import Sunbae_Automation

imgURL = "https://blogpfthumb-phinf.pstatic.net/MjAyMTAxMjZfODAg/MDAxNjExNjM4MTcxNzQ5.XMm4hIOEIAJurXjxx2yrv1v01VOBT_q6tutmSZOUST4g.5kuQNA_23MGs1wIy1PhWTra3ynQWpciBQwNI6uE8pAgg.PNG.tnsqo1126/profileImage.png?type=w161"
imgLocal = "D:\\MyProject\\python\\profileImage.png"

a = Sunbae_Automation(imgURL,imgLocal)

# 일치 하는가!
isflat = a.isAttendance()

if isflat == True:
    print("Match!!")
    # 일치 할 경우
else:
    print("not Match!!")
    # 불일치 할 경우

※ 이 방법이 실무에서 사용되는 방식이라거나 그런건 아니며, 개인적으로 사용하기 위해 만든 겁니당

 

 

 

728x90
반응형