데이터 분석가

파이썬 np.arange를 통한 이미지 조작 본문

파이썬(python) 기초

파이썬 np.arange를 통한 이미지 조작

PlintAn 2023. 5. 30. 10:00

 

저번 시간에 이어 np.array, np arange 활용하여 이미지를 조작해보는

 

코드를 배워보겠습니다 !

 

다음 코드는 이번 시간에 사용할 라이브러리의 간단한 설명입니다 !

import numpy as np
import matplotlib.pyplot as plt

# np.arange
# 0부터 10까지 2씩 증가하는 배열 생성
arr = np.arange(0, 10, 2)
print(arr)  # [0 2 4 6 8]

# np.flip
# 배열의 순서를 반전시킴
flipped_arr = np.flip(arr)
print(flipped_arr)  # [8 6 4 2 0]

# np.nonzero
# 배열에서 0이 아닌 요소의 인덱스를 반환
indices = np.nonzero(arr)
print(indices)  # (array([1, 2, 3, 4]),)
# indices 변수에는 0이 아닌 요소의 인덱스인 [1, 2, 3, 4]가 반환됨

# np.linspace
# 0부터 1까지 5개의 요소를 갖는 배열 생성
lin_space = np.linspace(0, 1, 5)
print(lin_space)  # [0.   0.25 0.5  0.75 1.  ]

# 랜덤 노이즈 생성
noise = np.random.random((128, 128, 3))
print(noise.shape)  # (128, 128, 3)

# matplotlib을 사용하여 이미지 표시
plt.imshow(noise)
plt.show()

np.arange: 0부터 10까지 2씩 증가하는 배열을 생성
np.flip: 배열의 순서를 반전
np.nonzero: 배열에서 0이 아닌 요소의 인덱스를 반환
np.linspace: 0부터 1까지 5개의 요소를 갖는 배열을 생성
np.random.random: 128x128 크기의 3차원 배열에 랜덤한 값으로 노이즈를 생성
plt.imshow: matplotlib을 사용하여 이미지를 표시

 

 

 

2. 파이썬 행렬곱셈

 

파이썬의 행렬곱셈에서는 무려 선형 대수학의 법칙이 적용됩니다..

 

그게 뭐냐고여 ? 

 

한번 봅시다 !

 

 

import numpy as np

# 행렬 A와 B 생성
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# np.dot을 사용한 행렬 곱셈
C = np.dot(A, B)
print(C)
# 결과: [[19 22]
#        [43 50]]

# np.matmul을 사용한 행렬 곱셈
D = np.matmul(A, B)
print(D)
# 결과: [[19 22]
#        [43 50]]

# @ 연산자를 사용한 행렬 곱셈
E = A @ B
print(E)
# 결과: [[19 22]
#        [43 50]]

다음과 같이 행렬 간 곱셍에 대해서 규칙이 적용되는 것을 확인해 볼 수 있었습니다 !

 

저도 사실 조금 이해가 잘 안되지만 그냥 외우면 좋을거 같습니다 !

 

 

3.np.array를 통한 이미지 조작

 

이미지 조작 시작 전 연습으로

 

각각의 픽셀을  RGB(RED, GREEN, BLUE)  0~255 번까지 색상의 정도를 조절하여

 

랜덤 색상을 통해 색상을 돌려 이미지를 만들어 보겠습니다 !

 

import numpy as np
import matplotlib.pyplot as plt

# 랜덤 노이즈 생성
noise = np.random.random((128, 128, 3))

# noise 배열의 크기 출력
print(noise.shape)  # (128, 128, 3)

# matplotlib을 사용하여 이미지 표시
plt.imshow(noise)
plt.show()

 

noise.random

 RGB 3색원이 정말 자기 멋대로 혼합된 결과물을 보여주네요 ! 개판이구만

 

이미지를 불러오기 위해

 

from scipy import misc 
from PIL import Image

# scipy의 misc 모듈 import
# 이미지 관련 기능을 제공하는 모듈

# PIL(Python Imaging Library)의 Image 모듈 import
# 이미지 처리와 조작 라이브러리로, 이미지를 열고 저장,
# 크기 조정, 자르기, 회전, 필터 적용 등 다양한 이미지 조작 작업

해당 라이브러리를 불러오면 밑의 귀여운 너구리를 불러올 수 있습니다 !

 

img = misc.face() #너구리 얼굴을 가져오자
plt.imshow(img) #바로 보여주자

아주 귀여운 너구리 !

여기 RGB 색상을 적용하여 만든 이미지가 있습니다 !

 

type(img)
# img의 데이터 타입 확인
# 결과: numpy.ndarray

img.shape
# img의 크기 확인
# (768, 1024, 3) 높이, 너비, 색상 수

img.ndim
# img의 차원 확인
# 결과: 3

해당 이미지를 분석해보자면 numpy.ndarray 타입이고, 높이, 너비, 채널(색상 수, 차원)을 확인 가능합니다

 

grey_vals = np.array([0.2126, 0.7152, 0.0722])
# RGB to grayscale 변환에 사용할 가중치를 지정한 배열 생성
# R 채널의 가중치: 0.2126, G 채널의 가중치: 0.7152, B 채널의 가중치: 0.0722

sRGB_array = img / 255
# img 배열을 0~255 범위로 스케일링하여 sRGB_array 생성
# 이미지의 각 픽셀 값을 0~1 범위로 변환하기 위해 255로 나눔

img_gray = sRGB_array @ grey_vals
# sRGB_array와 grey_vals 간의 행렬 곱셈을 수행하여 img_gray 생성
# sRGB_array는 (세로 크기, 가로 크기, 3)의 shape을 갖는 RGB 이미지 배열
# grey_vals는 (3,)의 shape을 갖는 가중치 배열
# 행렬 곱셈을 통해 각 픽셀의 RGB 값을 grayscale 값으로 변환

img_gray = np.matmul(sRGB_array, grey_vals)
# np.matmul 함수를 사용하여 행렬 곱셈 수행 (다른 표현 방식)

plt.imshow(img_gray, cmap='gray')
# img_gray 배열을 회색조(grayscale) 이미지로 표시
# cmap='gray'를 지정하여 회색조 컬러맵을 사용하여 표시

위 코드를 이해가 조금 더 쉽게 풀어 설명하자면

 

1.'grey_vals': RGB 이미지를 grayscale로 변환하기 위해 사용할 가중치 지정한 배열 생성

 

2.'sRGB_array': 'img' 배열을 0~255 범위로 스케일링하여 sRGB_array 생성

 

3. 'img_gray':'sRGB_array' 'grey_vals' 간의 행렬 곱셈을 수행하여 'img_gray' 생성


4. plt.imshow: img_gray 배열을 회색조(grayscale) 이미지로 표시

 

0~1 스케일링 결과(흑백)

컬러풀한 너구리가 흑백 너구리가 돼 버렸네요 

 

너구리 뿐 아니라 모든 이미지도 이처럼 조작이 가능합니다 !

 

이상 이미지 색상 조작을 배워보는 시간이었습니다 !

 

 

Comments