Python 이미지 자동 자르기 기술
위 이미지는 다양한 장기 말들이 포함된 그림입니다. 이 이미지에서 각 말을 개별적으로 분리하기 위해 Python의 Pillow 라이브러리를 활용할 수 있습니다.
1. Pillow 라이브러리 설치
Pillow 라이브러리가 설치되어 있지 않다면, Python 3 환경에서 명령 프롬프트에 pip install pillow를 입력하여 설치할 수 있습니다.
2. 기본 접근 방식
- 시작으로, 이미지의 왼쪽 상단에 있는 검은색 '장' 말을 잘라내고 저장해 보겠습니다.
그림판을 열고 확대하며 격자선을 사용하여 이 말의 왼쪽 상단 좌표와 오른쪽 하단 좌표를 찾아야 합니다. 오른쪽 하단 좌표는 약 (50, 50)임을 알 수 있습니다. 왼쪽 상단은 (0, 0)입니다. 모든 이미지의 좌표는 왼쪽 상단을 기준으로 시작합니다.
from PIL import Image
origin_image = Image.open('chess.png') # chess.png 파일 열기
cropped_region = origin_image.crop((0, 0, 50, 50)) # 0,0은 자를 영역의 왼쪽 상단, 50,50은 오른쪽 하단
cropped_region.save('sample.png') # 잘라낸 이미지 저장
이렇게 이미지 자르기가 성공적으로 이루어졌습니다. 하지만 모든 말을 개별적으로 자르려면, 하나씩 좌표를 확인하고 프로그램의 좌표를 수정한 후 다시 실행해야 할까요? 그렇다면 그림판을 직접 사용하는 것이 더 빠를 수 있습니다. 더 나은 방법을 생각해 보면, 각 말들 사이에는 일정한 규칙성이 있음을 알 수 있습니다. 이를 바탕으로 for 루프를 사용하여 일괄적으로 자르는 방법을 시도해 볼 수 있습니다.
3. 전체 코드 구현
다시 그림판을 열어보면 패턴을 발견할 수 있습니다. 첫 번째 줄 검은색 말들의 왼쪽 상단 좌표는 (0, 0)이며, x 좌표는 50씩 증가하여 7번 반복됩니다. 따라서 (0, 0)부터 (300, 0)까지입니다. 오른쪽 하단 좌표도 동일한 방식으로 (50, 0)부터 (350, 0)까지입니다. 두 번째 줄은 (0, 50)부터 (300, 50)과 (50, 100)부터 (350, 100)입니다. 이 패턴을 이해했다면 코드 작성을 시작할 수 있습니다.
from PIL import Image
# 각 말의 이름을 저장할 리스트
black_pieces = ['general', 'advisor', 'elephant', 'horse', 'chariot', 'cannon', 'soldier']
red_pieces = ['General', 'Advisor', 'Elephant', 'Horse', 'Chariot', 'Cannon', 'Soldier']
# 원본 이미지 열기
chess_board = Image.open('./chess.png')
def batch_crop_pieces():
# 첫 번째 줄(검은색 말)과 두 번째 줄(빨간색 말)을 동시에 처리
for x_pos, black_name, red_name in zip(range(0, 350, 50), black_pieces, red_pieces):
# 첫 번째 줄 검은색 말 자르기
black_piece = chess_board.crop((x_pos, 0, x_pos+50, 50))
black_piece.save(f'./output/{black_name}.png')
# 두 번째 줄 빨간색 말 자르기
red_piece = chess_board.crop((x_pos, 50, x_pos+50, 100))
red_piece.save(f'./output/{red_name}.png')
# 함수 실행
batch_crop_pieces()
폴더를 열면 모든 자른 이미지가 저장된 것을 확인할 수 있습니다.