Broccoli's House

#5-(2) 게임 이미지 크기 조절 및 흑백 처리 본문

공부/캡스톤 디자인

#5-(2) 게임 이미지 크기 조절 및 흑백 처리

김콜리 2018. 3. 9. 23:48

5회차 - (2) 파이썬을 이용한 이미지 크기 조절 및 흑백 처리



  • 이미지 크기 조절
 - 파이썬의 라이브러리 PIL의 ImageGrab.grab() 함수를 사용해서 스크린 이미지를 추출하면, 모니터의 해상도를 그대로 따르는 이미지가 추출된다. 현재 모니터의 해상도가 (1920X1080) 이므로, 이미지를 가공하기 위해 픽셀마다 어떠한 연산을 가하려면 너무 많은 계산량과 그에 따른 많은 시간이 소요된다. 따라서 이미지의 크기를 줄일 필요가 있다. 

 - 이미지 크기 조절에는 이미지 관련 라이브러리인 OpenCV의 resize 함수를 사용한다. resize 함수를 사용하기 위해서는 스크린 이미지를 추출한 다음 배열로 변경해주어야 한다. 또한 줄이고자 하는 이미지의 크기와 크기를 변경할 때의 보간 방식(interpolation)을 선택해야 한다. (1920X1080)의 비율을 맞추기 위해 (960X540)으로 이미지 크기를 줄이인다. OpenCV resize 함수의 보간 방식에는 이미지 크기를 줄일 때 사용되는 cv2.INTER_AREA, 이미지 크기를 키울 때 사용하는 cv2.INTER_CUBIC, cv2.INTER_LINEAR 방식이 있다. 지금은 이미지 크기를 줄이므로 cv2.INTER_AREA 보간 방식을 사용한다.



  • 이미지 흑백 처리
 - 이미지 크기 조절을 완료하고 이미지의 형태(shape)를 출력해보면, (960, 540, 3)이라는 3차원 배열 형태를 출력한다. 이 형태는 RGB 즉, Red, Green, Blue 이 세가지 색상 각각이 (960X540) 크기의 픽셀 밝기 값을 지녔다는 것을 나타낸다. 이미지 크기 조절한 이유와 마찬가지로, 이대로 이미지 픽셀 값에 대하여 연산을 수행할 경우 계산량이 너무 많아져서 연산 속도가 느려진다. 따라서 컬러 이미지를 흑백 이미지로 바꾸는 처리가 필요하다.

 - 이미지의 흑백 처리에는 PIL의 Image 라이브러리 중에서도 convert()라는 함수를 사용한다. 이미지를 픽셀 값의 배열로 처리하는 OpenCV와는 다르게 PIL의 Image 라이브러리는 이미지 자체를 처리하기 때문에 크기 조절이 완료된 픽셀 값의 배열을 다시 이미지로 바꿀 필요가 있다. Image 라이브러리의 fromarray() 함수를 사용하여 배열을 다시 이미지로 바꾸고, 거기다 convert() 함수를 적용한다. convert() 함수의 괄호 내에는 이미지를 변경하는 모드를 적는데, 'RGB' (컬러), 'CMYK', 'L' (8비트 흑백), '1' (1비트 흑백)이 있다. 8비트(256단계 명암) 흑백 이미지로의 변경을 위해 'L'을 괄호 내에 적어준다.


import numpy as np # 배열 라이브러리
from PIL import ImageGrab # 스크린 캡처 라이브러리
from PIL import Image # 이미지 처리 라이브러리
import cv2 # OpenCV, 이미지 처리 라이브러리

while(True) : # 무한 반복
screen = np.array(ImageGrab.grab()) # 스크린을 캡쳐하여 이미지를 배열로 바꾸어 변수에 저장
img_resize = cv2.resize(screen, (960,540), interpolation = cv2.INTER_AREA) # 이미지의 배열 크기를 줄이는 처리
img = Image.fromarray(img_resize).convert('L') # 배열을 이미지로 변경, RGB 컬러에서 8비트 흑백으로 이미지 변경
pixel_array = np.array(img) # 이미지를 픽셀 값의 배열로 전환
cv2.imshow('window', screen) # window라는 이름의 창을 생성하고, 그 곳에 이미지를 연속으로 출력

if cv2.waitKey(0) & 0xFF == ord('x'): # 키보드에서 'x'를 누르면 window창 종료 및 반복문 종료
cv2.destroyAllWindows()
break



Comments