본문 바로가기
목차
Python

Pillow에서 Image 객체의 주요 attribute.

by ds31x 2025. 7. 15.
728x90
반응형

Pillow(PIL)의 Image 객체는 Pillow 라이브러리에서 이미지 처리의 핵심이 되는 클래스임.

베개 아님.


이는 이미지를 추상화 하며, 다음과 같은 주요 속성들을 가지고 있음:


기본 정보 속성

size

  • 이미지의 크기를 (width, height) 튜플로 반환.
print(image.size)  # (800, 600)

width, height

  • 이미지의 너비와 높이를 각각 int 로 반환.
    print(image.width)   # 800
    print(image.height)  # 600


mode

  • 이미지의 색상 모드를 문자열로 반환.
  • 주요 모드로는 'RGB', 'RGBA', 'L'(그레이스케일), 'P'(팔레트), '1'(1비트) 등이 있음.
print(image.mode)  # 'RGB'

 

color mode는 color model 또는 color space와 비슷한 것으로 생각해도 큰 문제 없음.

 


format

  • 이미지 파일의 원본 파일 포맷을 반환
  • JPEG, PNG, GIF 등의 문자열
  • 참고로, 메모리에서 생성된 이미지의 경우 None.
print(image.format)  # 'JPEG'

메타데이터 속성

info

  • 이미지의 메타데이터를 dict 객체로 저장하고 있는 attribute.
  • EXIF 데이터, DPI 정보 등이 포함될 수 있음.
print(image.info)  # {'dpi': (72, 72), 'exif': b'...'}

EXIF는 "Exchangeable Image File Format"의 줄임말임.
디지털 카메라나 스마트폰에서 촬영한 사진 파일에
촬영 날짜, 카메라 설정(셔터 속도, 조리개, ISO 등),
GPS 위치 정보 등의 메타데이터를 저장하는 표준 포맷을 가리킴.


filename

  • 이미지가 파일에서 로드된 경우 파일명.
  • 문자열임.
print(image.filename)  # '/path/to/image.jpg'

색상 관련 속성

palette

  • 팔레트 모드('P') 이미지의 경우 색상 팔레트 정보를 반환.
# 이미지를 팔레트 모드로 변환
palette_image = image.convert('P')
print(f"팔레트 모드: {palette_image.mode}")

if palette_image.palette:
    # 팔레트 정보 가져오기
    palette_data = palette_image.palette.getdata()
    print(f"팔레트 모드: {palette_data[0]}")  # 'RGB' 또는 'RGBA'

    # 팔레트 색상 데이터 (처음 10개 색상만)
    palette_colors = palette_image.palette.getdata()[1][:30]  # RGB이므로 3개씩
    print("팔레트의 처음 10개 색상:")
    for i in range(0, 30, 3):
        r, g, b = palette_colors[i:i+3]
        print(f"색상 {i//3 + 1}: RGB({r}, {g}, {b})")

참고: 팔레트 모드('P')란?

  • 이미지에서 사용되는 색상을 최대 256개의 색상표(팔레트)로 제한하여
  • 각 픽셀이 색상값 대신 팔레트의 인덱스 번호를 저장하는 방식.
  • 이 방법은 메모리 사용량과 파일 크기를 크게 줄일 수 있어서 GIF 이미지나 웹용 이미지에서 주로 사용됨.
  • 예를 들어 RGB 모드에서는 각 픽셀이 3바이트(24비트)를 사용하지만, 팔레트 모드에서는 1바이트(8비트)만 사용하여 색상을 표현함.

getcolors()

  • 이미지에서 사용된 색상과 각 색상의 픽셀 수를 반환.
# RGB 이미지의 색상 분석 (최대 256개 색상까지)
colors = image.getcolors(maxcolors=256)
if colors:
    print(f"발견된 색상 수: {len(colors)}")
    # 가장 많이 사용된 색상 상위 5개
    colors_sorted = sorted(colors, key=lambda x: x[0], reverse=True)
    for i, (count, color) in enumerate(colors_sorted[:5]):
        print(f"색상 {i+1}: RGB{color} - {count}개 픽셀")
else:
    print("색상이 너무 많습니다 (256개 초과)")

기타 유용한 속성

readonly

  • 이미지가 읽기 전용인지 여부를 나타내는 boolean.

pyaccess

  • 픽셀 접근을 위한 PixelAccess 타입의 내부 객체.
  • .load() 메서드에 의해 반환됨 (권장).
from PIL import Image

image = Image.new('RGB', (10, 10), 'white')

# 둘 다 동일한 객체를 반환
pixels1 = image.load()
pixels2 = image.pyaccess

print(f"load() 타입: {type(pixels1)}")
print(f"pyaccess 타입: {type(pixels2)}")
print(f"동일한 객체인가? {pixels1 is pixels2}")  # True

# 하지만 load()를 사용하는 것이 권장됨

 

픽셀단위 접근 방법은 다음을 참고:
https://ds31x.tistory.com/465#2.-load-%EB%A9%94%EC%84%9C%EB%93%9C

 

Pillow 사용법 - Basic 01

Pillow 라이브러리의 기본적인 사용법을 다룬다. 2024.06.03 - [Python] - [Python] PIL, Pillow, OpenCV, and Scikit-image [Python] PIL, Pillow, OpenCV, and Scikit-imagePIL, Pillow, OpenCV, and Scikit-imagePython에서 이미지를 다룰 때

ds31x.tistory.com

 

728x90