본문 바로가기

#WarGame/Python Challenge

Python Challenge # LV.16 (ImageChops)

반응형

출처) http://www.pythonchallenge.com/index.php

 

The Python Challenge

What people have said about us: "These sorts of things are in my opinion the best way to learn a language.", brberg at Media Cloisters "It's the best web site of the year so far.", Andy Todd at halfcooked "Addictive way to learn the ins and outs of Python.

www.pythonchallenge.com

 

 

www.pythonchallenge.com/pc/return/mozart.html

[그림1. LV16 문제]

 

  • 파이썬 챌린지 레벨16 문제!
  • 이번문제는 픽셀관련된 문제인 것 같다.
  • 이미지를 자세히 보면 핑크색 픽셀이 연달아 나온다.
  • 한줄씩 출력했을 때 연달아 나온 숫자를 찾아볼면 될 것 같다.

 

[그림2. 픽셀 값 출력]

 

  • 높이가 1인 지점에서 한줄만 뽑아보았는데 rgb 형태는 아닌 것 같지만 같은 숫자로 나오는 걸 볼 수 있다.
  • 195가 반복되고 있으니 핑크색이 나오는지 이미지 사이즈에 맞게 출력해보았다.
  • 이미지 모듈인 Image.frombytes( mode , size , data)는 픽셀 데이터에서 이미지 메모리를 복사하여 값에 맞는 이미지를 나타내어 준다.

 

[그림3. 픽셀값195]
[그림4. 픽셀값195 출력]

 

  • 195가 핑크색이 맞았다. 문제에서 주어진 그림 픽셀 중 195만 뽑아서 모으면 글자가 있을 줄 알았지만 그렇게 푸는 건 아니였다. 
  • 풀이를 참고하니 핑크색을 왼쪽으로 행이동으로 시켜 길게 내리면 된다고 한다...

 

from PIL import Image, ImageChops

image = Image.open("D:/Python Challenge/mozart.gif")

for y in range(image.size[1]):
    box = 0, y, image.size[0], y + 1  
    ## crop(box) box is a 4-tuple defining the left, upper, right, and lower pixel coordinate.
    
    row = image.crop(box)  ##현재 이미지에서 박스 영역의 복사본 반환
    row_byte = row.tobytes()  ### tobytes()- numpy배열에서 byte형태로 변환해주는 함수
    
    offset=row_byte.index(195)
    row=ImageChops.offset(row,-offset)   ##ImageChops.offset- 지정된 거리에 의해 데이터가 오프셋된 이미지의 복사본을 반환
    
    image.paste(row, box)
    
image.show()   

ImageChops.offset (image, xoffset, yoffset)

xoffset : 수평 거리
yoffset : 생략하면 수직 거리이며 두 거리가 동일하게 설정

 

  • offset을 음수로 두어야 핑크색 픽셀이 왼쪽으로 이동하게 된다.
  • 코드를 실행해보면 다음과 같은 이미지가 나온다.

 

[그림5. 최종 결과]

 

 

 

반응형