본문 바로가기

WarGame/PythonChallenge

python challenge 07 :: Image(PIL)

파이썬 챌리지 07은 다음과 같습니다.



소스코드에는 smarty라는 문자와  이미지 파일 외에는 어떠한 힌트도 없습니다.


평소 파워포인트나 디자인을 좀 하신분들은 가운데 색상표를 보고 RGB를 떠올릴 수도 있을 것 같습니다.


그림판을 통해서 그림을 자세히 보도록 하겠습니다.



이미지의 가로, 세로 크기는 629 x 95이며 왼쪽 빨간색 사각형 부분(2, 47 pix)을 그림판의 스포이드로 RGB 값을 보니 RGB 모두 115 값으로 되어 있고 위치는 대략 세로 크기의 가운데 쯤 위치해 있는 것 같습니다.


이제 파이썬의 이미지 라이브러리 PIL에 대해 설명하겠습니다.

  • PIL(Python Imaging Library) : 파이썬을 이용해서 이미지 프로세싱을 할 수 있게 도와주는 라이브러리

(정식 라이브러리는 아니고 서드 파티 라이브러리 인 것 같습니다.)


※ PIL은 3.x 버전은 지원하지 않으므로 3.x버전에서는 Pillow라는 라이브러리를 사용해야 합니다. (사용 방법은 동일)

그러나 본인의 환경에서는 설치가 되지 않아, 이번 실습은 2.7 버전에서 진행하겠습니다.



(대소문자 주의)

  • Image.open() : 이미지 객체 생성
  • size : 이미지 크기 반환 (가로, 세로)
  • getpixel((가로, 세로)) : 가로 x  세로 pixel에 해당하는 RGBA 값 반환 

그림판에서 보았던 0 x 47 pix의 RGB 값을 보니 115로 동일한 것을 확인할 수 있습니다.



이제, 반복문을 통해서 이미지 가운데에 있는 회색 띠의 RGB 값들을 출력해 보겠습니다.

1
2
3
4
5
6
7
import Image
img = Image.open("oxygen.png")        # 이미지 객체 생성
 
w, h = img.size                     # 가로, 세로 크기 반환
 
for i in range(0, w):
    print img.getpixel((i, 47))        # 가로는 0~끝까지 / 세로는 절반크기인 47로 고정
cs


실행 결과 첫번째 색상은 6번씩 반복, 나머지는 7번씩 반복되는 것을 보실 수 있습니다. 실제 이미지에서도 제일 첫번째 색상이 약간 작은 것을 확인할 수 있습니다.




7칸씩 건너띄면서 RGB 값을 받아오면서 해당 값을 Ascii 문자로 변환하면 아래와 같은 결과가 나옵니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
import Image
 
img = Image.open("oxygen.png")
 
w, h = img.size
result = ""
 
for i in range(0, w, 7):
    rgb = img.getpixel((i, 47))
    if rgb[0== rgb[1== rgb[2]:
        result += chr(rgb[0])
 
print result
cs



뒤쪽에 숫자를 Ascii코드로 변환시키면 정답이 나올 것 같습니다.



최종 문제풀이는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import Image, re
 
img = Image.open("oxygen.png")        # 이미지 객체 생성
 
w, h = img.size                     # 가로, 세로 크기 반환
result = ""
 
for i in range(0, w, 7):            # 0부터 가로 크기만큼 7칸씩 건너띄어서
    rgb = img.getpixel((i, 47))        # (가로, 세로)에 해당하는 RBGA 값 반환
    if rgb[0== rgb[1== rgb[2]:    # R, G, B 값이 동일하면
        result += chr(rgb[0])        # 문자로 반환
 
digit = re.findall("\d+", result)    # result 문자열에 숫자를 찾아서 리스트로 반환
 
for i in range(0len(digit)):        # 리스트에 있는 각각의 숫자를
    int_digit = int(digit[i])        # int형으로 변환    
    print chr(int_digit),            # 다시 문자로 반환
cs


[결과]





'WarGame > PythonChallenge' 카테고리의 다른 글

Python Challenge 09 :: turtle  (0) 2015.10.31
Python Challenge 08 :: bz2  (0) 2015.10.31
Python Challenge 06 :: zipfile  (0) 2015.10.26
Python Challenge 05 :: pickle  (0) 2015.10.23
Python Challenge 04 :: urlparse  (0) 2015.10.22