카테고리 없음

[Python] 매크로를 위한 이미지 전처리(grayscale, pillow) - 1

대장코린이 2024. 4. 23. 14:40

안녕하세요 대장코린이입니다.

 

오늘은 파이썬 매크로 특집 3탄입니다.

저는 귀찮은 작업을 상당히 좋아하지 않기 때문에 매크로를 자주 작성하는 편인데요...

매크로를 작성하다보면 화면상에서 어떤 이벤트를 감지하거나, 특정 이미지의 위치를 찾는 등 이미지 서치를 활용할 때가 아주 많아요.

 

하지만 이미지 서치(pyautogui에서 제공하는 locateOnScreen)가 만능은 아닙니다.

사실 저는 정교한 매크로 작업에서는 이미지 서치를 사용하지 않아요.

왜냐면 pyautogui의 이미지 서치는 말그대로 화면상에서 그림 파일과 일치하는 부분을 찾아주는 것이기 때문에 만약 게임처럼 찾고자 하는 대상의 배경이 계속 달라진다거나 하는 경우에는 confidence를 조정한다 하더라도 결과가 좋지 않을 가능성이 큽니다.

메이플스토리라는 게임을 예를 들어보겠습니다(단순히 메이플 스토리를 예로 든거에요).

만약 아래 그림과 같이 맵에 많은 수의 몬스터가 존재한다고 할 때, 몬스터들끼리의 겹침, 배경문제, 대상의 모션 변화 등 이미지 서치가 적용되지 않을 가능성이 매우 높아요. 특히나 매크로는 어떤 상황이든 예외가 존재해선 안된다고 생각하기에 더더욱 정확도가 중요하다고 생각합니다.

이미지 서치 대상
이미지 서치 화면

 


1. 라이브러리 설치방법

이미지를 다루는 라이브러리에 대해서 소개를 드릴까 합니다.

바로 pillow(PIL) 입니다.

pip install pillow

from PIL import Image  #pillow

 


2. pillow(PIL)

pillow를 이용하는 방법은 매우 쉽습니다. 그래서 저는 cv2도 사용하지만 주로 pillow를 사용하는데요,

아래와 같이 Image.open()을 이용하면 됩니다.

from PIL import Image
import numpy as np

file_path =r"C:\Users\carod\python\macro\hangul\블로그\fig.png"

img = Image.open(file_path)
img.show()

arr_img = np.array(img)

 

이렇게 파일을 읽어서 img.show()로 출력해주면 아까 위의 그림이 나올거에요.

 

다들 아시겠지만, 모든 이미지든 화면이든 픽셀로 구성되어있습니다.

또 그 픽셀은 (R,G,B)의 값으로 표현하고있어요.

현재 저 이미지는 (415, 536)의 픽셀을 이루고있고, 각각의 픽셀마다 (R,G,B)가 있어 총 (415, 536, 3)의 구조를 가져요.

이는 np.array(img)를 사용하여 img를 array로 변환하여 확인이 가능합니다.

 

하지만 매크로를 작성할때 속도가 중요하지 않을 수도 있지만, 일반적으로 아주 자연스러운 모습을 보이기 위해선 속도를 줄이기 위해 연산량을 최소한으로 구현하려고 합니다.

그래서 만약 색이 중요하지 않다면, grayscale로 변환하는게 연산량에서 매우 유리하겠죠?

 

grayscale이란, 일반적으로 색을 표현할때 (R,B,G)를 이용하여 구현하는데, 이를 0~1사이의 값으로 검~흰으로 표현하는 것을 grayscale입니다. 사용 목적에 따라 자유롭게 적용하면 될 것 같아요.

 

grayscale로 변환하는 방법은 너무나도 쉽습니다.

from PIL import Image
import numpy as np

file_path =r"C:\Users\carod\python\macro\hangul\블로그\fig.png"

img = Image.open(file_path).convert('L')
arr =np.array(img)
img.show()

 

달라진점은 6번째 줄에 convert('L')이 추가 되었다는 것 뿐인데요, 여기서 'L'은 grayscale을 의미합니다.

grayscale 변환 결과

 

어때요 참 쉽죠?

이제 이렇게 읽은 이미지를 array로 변환하여 내가 찾고싶은 이미지를 찾으면 됩니다.


일단 오늘은 여기까지만 작성하도록 하겠습니다.

이후에 이 array로 변환한 이미지에서 내가 원하는 이미지의 위치를 어떻게 찾아낼 수 있는지에 대한 내용에 대해서 다뤄보겠습니다.

저 이미지에서 주황버섯의 위치를 찾아볼게요

 

감사합니다.