Python을 활용한 이미지 자동 자르기 기술

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()

폴더를 열면 모든 자른 이미지가 저장된 것을 확인할 수 있습니다.

태그: python pillow image-processing automation

6월 13일 23:34에 게시됨