[2022 국민대학교 겨울 인공지능 특강] 3주차 5일 학습 내용

하지원·2022년 1월 21일
0

이번 5일차 문제는 이미지 변환 문제다.
컴퓨터에서 이미지는 픽셀이라는 작은 점 단위로 구성되어 높이와 너비의 길이만큼 2차원 배열의 형태를, 즉, 행렬을 구성한다.
이미지가 흑백일때는 각 픽셀은 하나의 수로 이뤄질 수 있지만, 색상일때는 픽셀이 빨강(R), 초록(G), 파랑(B) 이 3가지로 나눠져, 3차원 행렬을 구성한다. 행렬이 3가지 만들어진다고 하면 된다.

이번 문제에서는 색상 이미지를 흑백으로 전환하는 방법을 다루는데, R, G, B 각 색상을 표현하는 수들에 각자 다른 숫자를 적용하고 하나의 흑백 이미지로 전환하는 것이 목표다.
Red 0.3 + Green 0.5 + Blue * 0.2

img = [[[51, 60, 74], [92, 20, 74]], [[14, 82, 87], [71, 86, 99]]]

여기서 각 R, G, B 배열의 첫번째 행과 첫번째 열 값에 연산을 더하면 다음과 같다.
(51)(0.3) + (60)(0.5) + (74)(0.2) = 60.1

img =
[
[[51, 60, 74],
[92, 20, 74]],

[[14, 82, 87],
[71, 86, 99]]
]

이미지(img) 배열의 각 열 순서대로 빨강(R), 초록(G), 파랑(B)의 원소다. 이 배열의 원소를 읽어내기 위해 배열의 전체 길이와 내부 길이를 알아내고 반복문(for)을 적용해야 한다.
->

for i in range(len(img)):  # len(img) == 2
	for j in range(len(img[i])):  # len(img[i]) == 2
    		for k in range(len(img[i][j])):  # len(img[i][j]) == 3              

이렇게 (2, 2, 3) 크기의 배열을 가진다는 것을 알 수 있다.

각 3개의 색상마다 연산을 하기 위해 이를 위한 배열도 따로 준비했다.
num = np.array([0.3, 0.5, 0.2])

그리고 각 자리의 원소를 곱했고, 이 식의 합을 구하기 위한 변수를 준비했다.
원활한 덧셈을 위하여 이 new 배열을 0으로 초기화했다. (new = 0)
->

for i in range(len(img)):
	for j in range(len(img[i])):
    		new = 0
    		for k in range(len(img[i][j])):
            		new += img[i][j][k] * num[k]

연산이 3번 모두 진행된 후에 최종 값을 출력 배열에 저장할 수 있도록 k 반복문 이후에 image 리스트에 추가하도록 했다. 그리고 image 리스트를 j 반복문 바로 직전에 둔 이유는 k와 j 반복문을 마치고 나서 초기화하기 위함이다. 초기화 후에 다음 데이터를 입력할 수 있기 때문이다.
->

for i in range(len(img)):
    image = []
    for j in range(len(img[i])):
        new = 0
 	for k in range(len(img[i][j])):
            new += img[i][j][k] * num[k]
        image.append(new)

그리고 문제에서의 출력값이 소수점 1의 자리이기 때문에 여기에 맞추기 위해 round() 함수를 이용했다.
new = round(new, 1)
->

for i in range(len(img)):
    image = []
    for j in range(len(img[i])):
        new = 0
 	for k in range(len(img[i][j])):
            new += img[i][j][k] * num[k]
        new = round(new, 1)
        image.append(new)

마지막으로 이 배열들을 최종 리스트에 저장해야한다. 2차원 배열을 만들기 위해서다. 따라서 j 반복문 이후에 image 리스트 입력하기를 다음과 같이 구현했다.
->

for i in range(len(img)):
    image = []
    for j in range(len(img[i])):
        new = 0
 	for k in range(len(img[i][j])):
            new += img[i][j][k] * num[k]
        new = round(new, 1)
        image.append(new)
    answer.append(image)

최종 코드는 다음과 같다.

import numpy as np

def solution(img):
    num = np.array([0.3, 0.5, 0.2])
    answer = []
    for i in range(len(img)):
        image = []
        for j in range(len(img[i])):
            new = 0
            for k in range(len(img[i][j])):
                new += img[i][j][k] * num[k]
            new = round(new, 1)
            image.append(new)
        answer.append(image)
    answer = np.array(answer)
    return answer

자주 사용하던 코드들이지만, 반복문과 변수들을 어느 위치에 배치하냐에 따라 실행 값이 달라진다는 것을 느끼게 해준 시간이었다.

profile
국민대 전자공학부, 서강대학교 석사과정, 크래프톤 정글 2기

0개의 댓글