CNN 기초(image의 기본/12.14)

minnim·2023년 12월 14일

📷 Image의 기본

◾ pixel

image를 구성하는 가장 작은 단위

  • 흔히 pixel의 개수를 해상도라고 함
  • 하나의 pixel은 기본적으로 3개의 값으로 구성 + 투명도(alpha)
    • image는 pixel의 집합
    • 모든 image(컬러, 흑백)는 기본적으로 3차원 데이터
    • (높이, 너비)로 표현
  • (높이, 너비) ➡ (행,열)


💻 코드 구현

◾ image를 pixel로 표현

image를 pixel로 구현할 때 많이 사용하는 모듈

  • matplotlib
  • Pillow

image 불러오기 및 확인

# image를 pixel로 표현
# 가장 대표적인 module이 matplotlib library
# Pillow라는 module도 많이 이용

# 모듈 임포트
import numpy as np
from PIL import Image   # Pillow library를 사용해 image를 pixel data, 즉 ndarray로 쉽게 변환 가능
import matplotlib.pyplot as plt

# image 불러오기
img = Image.open('/content/drive/MyDrive/AI_school_ML/image/justice.jpg')

# image 확인
plt.imshow(img)
plt.show()  # 이미지 좌표계 출력 확인!

pixel data 추출

image 객체를 ndarray로 변환

# image 객체를 ndarray로 변환!
# image는 pixel의 집합이예요! 각 pixel은 3개의 값으로 구성
# 따라서 모든 image(컬러, 흑백)는 기본적으로 3차원 데이터

pixel = np.array(img) 
print(pixel.shape)  # (426, 640, 3) == (높이, 너비, 차원) == (행, 열, 차원)

pixel data로 image 수정

image 자르기

.crop(): 튜플 형태로 좌표 지정 (left, top, right, bottom)
left : 상자의 왼쪽 가장자리의 x 좌표
top : 상자의 윗부분 가장자리의 y 좌표
right : 상자의 오른쪽 가장자리의 x 좌표
bottom : 상자의 아래부분 가장자리의 y 좌표

# image 자르기
crop_img = img.crop((30, 100, 150, 300))    # 튜플 형식으로 좌표를 지정해줘야 함
plt.imshow(crop_img)
plt.show()

image 사이즈 조정

.resize() : 튜플형태로 조정할 크기 지정

# image 사이즈 조정
resize_img = img.resize((100,100))
plt.imshow(resize_img)
plt.show()

image 회전

.rotate() : 회전각 지정

# 이미지 회전
rotate_img = img.rotate(180)  # 180도 회전
plt.imshow(rotate_img)
plt.show()


◾ 흑백 image

image 불러오기 및 pixel data 추출 과정은 동일

# 모듈 임포트
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

# 이미지 불러오기 및 확인
color_img = Image.open('/content/drive/MyDrive/AI_school_ML/image/fruits.jpg')
plt.imshow(img)
plt.show()

# 이미지 pixel 정보를 3차원 ndarray로 추출
color_pixel = np.array(color_img)
plt.imshow(color_pixel)  # 픽셀 데이터도 그림이 잘 나타남을 확인
plt.show()

컬러 image 흑백 처리

반복문을 사용해 각 pixel의 RGB 값의 평균을 구해서 RGB값을 평균값으로 각각 세팅
픽셀데이터.shape ➡ (높이, 너비, 차원) 출력

# 흑백처리!
print(color_pixel.shape)  # (426, 640, 3)  == (높이, 너비, 차원)

# color_pixel의 복사본을 만들어 gray_pixel에 저장(원본 image 변경X)
gray_pixel = color_pixel.copy()  

# 흑백처리 반복문
# 각 pixel의 RGB 값의 평균을 구해서 RGB값을 평균값으로 각각 세팅

for y in range(gray_pixel.shape[0]):   # (426, 640, 3)에서 426 / 즉, 이미지의 높이에 대한 반복문
    for x in range(gray_pixel.shape[1]):   # (426, 640, 3)에서 640 / 즉, 이미지의 너비에 대한 반복문
        gray_pixel[y,x] = int(np.mean(gray_pixel[y,x]))  # 현재 픽셀의 RGB 값을 해당 픽셀 RGB 값의 평균으로 설정

plt.imshow(gray_pixel)
plt.show()

💡 3차원 흑백 이미지를 2차원으로 표현

흑백이미지는 2차원으로도 표현 가능

  • gray_pixel[:, :, 0] ➡ 3차원 이미지인 gray_pixel에서 높이 전부(:), 너비 전부(:), 차원은 R값만 가져오기
# 이번에는 3차원 흑백 이미지를 2차원으로 표현 
# 3차원 이미지인 gray_pixel[높이,너비, 차원(RGB의 3차원)]에서
gray_2d_pixel = gray_pixel[:, :, 0]   #  높이는 전부(:), 너비도 전부(:), 차원은 R값만 가져오기

# 2차원 흑백 이미지를 그릴 때에는 cmap을 gray로 설정해야 함
plt.imshow(gray_2d_pixel, cmap = 'gray')   # (matplotlib은 원래 3차원을 받으니까 2차원임을 알려줘야 함)
plt.show()

반복문 추가 설명

  • gray_pixel[y, x]: 배열 gray_pixel에서 위치 (y, x)에 해당하는 픽셀을 나타냄
  • gray_pixel[y, x] = int(np.mean(gray_pixel[y, x])): 현재 픽셀의 RGB 값을 해당 픽셀의 RGB 값의 평균으로 설정. np.mean(gray_pixel[y, x])는 해당 픽셀의 세 가지 색상 채널(R, G, B)의 평균값을 반환

profile
일단 해보는 사람

0개의 댓글