Seeeni Tech Diary

[데이터 전처리] 시험 공부하다가 양식이 만든 썰 - 아스키 아트 본문

AI

[데이터 전처리] 시험 공부하다가 양식이 만든 썰 - 아스키 아트

seyeon0207 2023. 8. 1. 22:39

0. 시험공부하다가 합당한 사유로 놀고 싶어지다.

써야지 써야지 하면서 미루다가 8월이 와버렸다. 더 이상 미루다가는 잊어버릴 것 같아서 오늘 쓰게 되었다.

 

6월 14일 밤, 금요일에 있을 시험을 대비하기 위해 공부를 하고 있었다. 고급 데이터 처리 기말 고사를 해야하는데, 고급 데이터 처리 과목의 시험 범위는 크게 리눅스 명령어와 데이터 전처리 및 간단한 인공지능 학습으로 나눌 수 있었고, 나는 선택과 집중을 해보자는 생각으로 조금 더 자신 있는 데이터 전처리에 올인하였다.(시험 자체는 결과적으로 완전 망했다... 왜냐하면 리눅스 명령어만 80퍼가 나왔고 데이터 전처리는 실습 문제가 단 한 문제도 나오지 않았다...)

 

작년 인공지능 과목에서는 데이터 전처리에 대해 중점적으로 다루지는 않았어서 이미지 데이터를 처리하는 과정을 깊게 생각해본 적이 없었다.(배운 인공지능 모델이 너무 많아서 그것들을 외우기에 급급했다.) 그래서 이번에 OpenCV (cv2) 부분을 공부하는 게 조금 즐겁다 보니 응용이 해보고 싶어졌다. 때마침 내 티스토리 방명록에 Minboy가 찍고간 펭귄 아스키 아트를 보고 아스키 아트를 함 해봐야겠다! 생각이 들었다! (라고 시험공부를 안 한 썰을 주저리 주저리 늘어놓고 있습니다..ㅎㅎ)


1. OpenCV (cv2)

이미지를 아스키 아트로 바꿀 때, 이미지 데이터를 이진 데이터로 바꾸고 이진 데이터 중 이미지를 표시하고 싶은 부분에 "#"을, 배경으로 표시하고 싶은 부분을 빈칸으로 하여 텍스트를 출력하는 과정을 거친다.

 

이 과정을 거치기 위해서는 이미지 데이터를 읽을 수 있는 형태로 바꾸어야 한다. 이때 사용되는 것이 바로 OpenCV 라이브러리다.

 

OpenCV는Open Source Computer Vision의 약자로, 오픈 소스 컴퓨터 비전 라이브러리 중 하나고, 주로 이미지와 같은 영상과 관련하여 사용된다. 과거 C++에만 지원했는데, 현재는 파이썬같은 다른 언어에서도 지원 가능한 형태로 바뀌었다. 인공지능의 대부분이 파이썬으로 이루어진다는 점 때문에 요새는 더욱 C++ 보다는 파이썬으로 OpenCV 라이브러리를 사용하여 이미지 데이터 처리를 하는 추새이다. 파이썬에서는 OpenCV라이브러리를 cv2를 import 하여 사용할 수 있다.

 

코랩에서 cv2를 import 하기 위해서는 다음코드를 import 전에 실행해야 한다.

!pip install opencv-python

 

내가 아스키 아트에서 사용할 OpenCV의 속성과 메소드들을 정리해보았다.

  • cv2.imread(file_path, flag) : file_path의 파일이 존재하면 이미지를 NumPy 배열 형태로 읽어옴
  • cv2.cvtColor(img, cv2.COLOR_BGR2RGB): img를 BGR -> RGB로 순서를 바꿈, matplotlib은 RGB순서, cv2는 BGR 순서 사용
  • cv2.COLOR_BGR2GRAY: 그레이스 스케일로 변환 플래그, cvtColor에서 사용하면 해당 이미지를 그레이스 스케일의 이미지로 바꿀 수 있음
  • cv2.resize(img, (128, 128)): 가로 세로 폭을 조정 128 X 128로 -> img.shape : (128, 128)
  • cv2.threshold(gray_img, 기준값, 기준값 이상일 때 바꾼값, cv2.THRESH_BINARY): 주어진 이미지를 기준값을 기준으로 이진화함

2. 아스키 아트

2 - 0. 이미지 고르기

무슨 이미지로 해볼까하다가 깃헙에서 돌아다녀보니 성민오빠 깃헙에서 반려묘 양식이가 프사로 되어있는 것을 보았다. 양해를 구하지 않고 냅다 이미지를 저장하고 양식이를 아스키 아트로 찍어보기로 했다. (물론 지금 이 글을 쓰는 시점에서는 양해를 구했다!)

 

2 - 1. 그레이스 스케일로 이미지 불러오기

양식이의 이미지를 cat.jpg로 저장해놓고 이미지를 다음과 같은 코드를 사용하여 회색이미지로 불러왔다.

img = cv2.imread('./cat.jpg')

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray_img = cv2.resize(gray_img, (100,100))

plt.imshow(gray_img, cmap='gray')
plt.show()

cv2.imread를 통해 양식이 이미지를 numpy형태로 불러와 img에 저장하고 이 이미지를 cv2.cvtColor의 플래그를 cv2.COLOR_BGR2GRAY로 하여 그레이스 스케일로 바꾸어 gray_img로 저장하였다. 각 이미지의 픽셀들이 0~255의 값으로 변환되어 저장된다고 보면 된다. 그리고 아스키 아트를 100 X 100으로 할 것이기 때문에 resize로 이미지 크기를 조정하였다.

 

pyplot 라이브러리를 통해 이미지를 찍어보면 밑의 이미지가 출력된다. 

양식이 이미지(gray)

 

2 - 2. 그레이스 스케일 이미지를 이진 이미지(흑백 이미지)로 바꾸기

그레이스 스케일로 저장된 이미지를 아스키 아트로 찍어내기 위해 이진 데이터로 바꾸었다.

ret, bin_img = cv2.threshold(gray_img, 100, 255, cv2.THRESH_BINARY)

plt.imshow(bin_img, cmap='gray')
plt.show()

양식이 이미지(binary)

 

2 - 3. 이진 이미지 데이터를 아스키 아트로 변환(출력)

현재 이진 이미지 데이터는 NumPy형태로 저장되어 있기 때문에 출력하기 쉽게 리스트 형태로 변환하여 배경에 해당하면 "#", 양식이에 해당하면 빈칸을 출력하도록 하였다. 보통 반대로 하는 경우가 많은데, 양식이가 하얗고 배경이 검기 때문에 반대로 하였다.

bin_list = bin_img.tolist()

for i in bin_list:
  string = ""
  cnt = 0
  for j in i:
    if j != 255:
      string += "#"
      cnt += 1
    else:
      string += " "
  print(string)

 

2 - 4. 전체코드와 결과

전체코드와 출력한 결과를 보면 다음과 같다.

import cv2
import matplotlib.pyplot as plt
%matplotlib inline

img = cv2.imread('./cat.jpg')

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

print(gray_img.shape) #2차원
gray_img = cv2.resize(gray_img, (100,100))
plt.imshow(gray_img, cmap='gray')
plt.show()

ret, bin_img = cv2.threshold(gray_img, 100, 255, cv2.THRESH_BINARY)

plt.imshow(bin_img, cmap='gray')
plt.show()
bin_list = bin_img.tolist()

for i in bin_list:
  string = ""
  cnt = 0
  for j in i:
    if j != 255:
      string += "#"
      cnt += 1
    else:
      string += " "
  print(string)

 

양식이 아스키 아트 완성본

 

앞으로 티스토리 열심히 써야겠다 ㅎㅎ

'AI' 카테고리의 다른 글

[AI] ML 기초 + Optimizer  (0) 2024.05.11
Comments