이미지 변환
문제 설명
컴퓨터에서 이미지는 작은 사각형 모양의 점들을 가로와 세로로 나란히 늘어놓는 방식으로 표현됩니다. 이미지를 구성하는 점들을 픽셀(pixel) 이라고 부르며, 각 픽셀은 해당 위치의 점이 가지는 색상에 대한 정보를 담고 있습니다.
높이가 H이고 너비가 W인 이미지는 픽셀들이 H 행 W 열로 늘어선 것이며, 각 픽셀을 하나의 수로 나타낼 수 있다면 이 이미지를 H x W 의 모양을 가지는 2차원 배열에 담을 수 있습니다.
흑백 이미지를 구성하는 픽셀은 하나의 수로 나타낼 수 있으며, 컬러 이미지를 표현하기 위해서는 하나의 픽셀을 두 개 이상(보통은 세 개)의 수의 조합으로 표현합니다.
흑백 이미지
흑백 이미지의 각 픽셀에는 명도를 나타내는 채널 1개만 있습니다. 따라서 높이가 H, 너비가 W인 흑백 이미지는 H x W 모양의 2차원 배열 또는 H x W x 1 모양의 3차원 배열(Tensor)로 나타낼 수 있습니다.
컬러 이미지
컬러 이미지의 각 픽셀에는 R(red), G(green), B(blue)의 정보가 담겨 총 3개의 채널이 있습니다. 즉, 높이가 H, 너비가 W인 컬러 이미지에서 RGB 정보를 추출하여 H x W x 3 모양을 가진 3차원 배열(Tensor)로 나타낼 수 있습니다.
이번 문제에서는 컬러 이미지를 다음과 같은 방법을 사용하여 흑백 이미지로 변환합니다.
- 높이가 H이고 너비가 W인 컬러 이미지에서 RGB정보를 추출합니다.
- R, G, B 각 색상을 표현하는 수들로부터 다음과 같은 가중평균을 적용하여 흑백 이미지의 명도로 변환한다.
- 명도 값 = Red * 0.3 + Green * 0.5 + Blue * 0.2
- 최종 높이가 H이고 너비가 W인 흑백 이미지로 변환한다.
높이가 H, 너비가 W인 컬러 이미지에서 RGB 정보를 추출하여 만든 3차원 배열 img는 H x W x 3 모양을 가집니다. 그리고 img의 채널은 R, G, B 순으로 있습니다. 예를 들어, img[1, 1, 0]는 (1, 1) 위치에 있는 픽셀의 R 값에 접근합니다. 또, img[2, 1, 2]는 (2, 1) 위치에 있는 픽셀의 B 값에 접근합니다. img가 numpy.ndarray 타입으로 주어질 때, 위의 방법을 참고하여 img 를 흑백 이미지를 나타내는 H x W 모양의 2차원 배열로 변환하는 함수를 구현하세요.
입출력 예
img | return |
---|---|
[[[51 60 74] [92 20 74]] [[14 82 87] [71 86 99]]] | [[60.1 52.4] [62.6 84.1]] |
입출력 예 설명
입출력 예의 계산 과정을 그림으로 나타내면 다음과 같습니다.
문제풀이
import numpy as np
def solution(img):
red = []
green = []
blue = []
a,b,c= img.shape
answer = np.array([])
for i in range(a):
for j in range(b):
for k in range(c):
if k == 0:
red.append(img[i,j,k])
elif k == 1:
green.append(img[i,j,k])
elif k == 2:
blue.append(img[i,j,k])
red = np.array(red)
green = np.array(green)
blue = np.array(blue)
red = red.reshape(a,b)
green = green.reshape(a,b)
blue = blue.reshape(a,b)
answer = red * 0.3 + green * 0.5 + blue * 0.2
return answer
문제 해석
[[[51 60 74] [92 20 74]] [[14 82 87] [71 86 99]]] 이런식으로 img의 형태가 받아진다.
이때 img는 WH3의 행렬로 만들어진다. 이때 W,H의 값을 알수 있도록 shape의 메소드를 이용하여 w,h의 값을 구한다.
그러면서 3중포문으로 red,green,blue의 좌표값들을 하나 하나씩 받는다. 좌표 값을 다 받은 후엔 이를 np.array를 통해 list에서 array형태로 바꾼다. w,h의 값을 얻은 바탕으로 reshape을 통해 red,green,blue의 형태를 변환 시킨다. 그 후엔 명도값을 얻을 수 있는 함수식을 이용하여 값을 구했다.
'AI_Bootcamp' 카테고리의 다른 글
Numpy 심화 실습 chap5 브로드캐스팅 3 (0) | 2022.01.21 |
---|---|
Numpy 심화 실습 chap6 any(),all() (0) | 2022.01.21 |
[MYSQL] INNER JOIN, LEFT JOIN 예제문제 (0) | 2022.01.21 |
Numpy 심화 실습 chap4 브로드캐스팅 2 (0) | 2022.01.20 |
Numpy 심화 실습 chap3 브로드캐스팅 (0) | 2022.01.20 |