공부하는 아저씨의 IT 공방

파이썬 시각화 공부 1일(기존 컬러 이미지 흑백 변환, Matplotlib 사용) 본문

파이썬 기초(1일 1코드)

파이썬 시각화 공부 1일(기존 컬러 이미지 흑백 변환, Matplotlib 사용)

공대아저씨 2023. 9. 4. 16:54

안녕하세요 공대아저씨 입니다 :)

 

오늘은 파이썬 시각화 공부 1일차 입니다. 

 

오늘 공부할 내용은 파이썬 시각화 작업을 위한 기본적인 내용으로

 

기존 컬러 이미지를 흑백으로 변환하거나, bgr을 rgb로 바꾸는 방법에 대해서 한번 알아보겠습니다.

 

 

실습에 앞서, 먼저 필요한 패키지를 설치해주겠습니다.

 

저는 주피터 환경에서 하기 때문에, 여러분들 편한 환경에서 동일한 방법으로 구동해주시면 됩니다.

 

pip install opencv-python   # 오픈 CV 설치
import cv2
print (cv2.__version__)  # CV 버전 확인

cv2 패키지를 import 시키고, 현재 설치된 cv2의 버전을 확인해보니 저는 4.6.0이 나오네요. 

 

가끔 버전에 따라서 코드가 달라지는 경우가 있으니 참고하기 바랍니다.

 

1일차 실습 시작

이미지는 본인이 갖고있는 아무런 이미지를 사용해도 무방합니다. 혹시 모르니 제가 사용한 이미지도 올려드릴게요 :)

 

3.jpg
0.00MB
fruits.jpg
0.05MB

# 이미지 로드 및 출력
import cv2
import sys

#img = cv2.imread('./img/3.jpeg') #컬러사진 이미지를 어디서 읽어올지에대한 경로
img = cv2.imread('./img/3.jpg', cv2.IMREAD_GRAYSCALE)  # 회색조 이미지를 어디서 읽어올지에대한 경로
                                                   #회색조로 출력할떄는 IMREAD_GRAYSCALE 입력 필수


if img is None :
    print('Image load failed!')
    sys.exit()
    
cv2.namedWindow('image') #주피터 노트북에 이미지를 출력하는게 아니라 새로운 윈도우 창을 띄워서 이미지를 출력
cv2.imshow('image', img) #image 이름으로 윈도우 출력

cv2.waitKey() #새로운 키가 입력될때 까지 대기
cv2.destroyAllWindows() # 키입력되면 입력되었던 창을 닫아라
print(img[50:51])

이렇게 되면 내가 입력한 이미지 데이터에 대한 슬라이스를 수행하게 됩니다.

 

즉, 이미지의 51번째 행(0부터 시작하는 인덱스)을 선택하고 해당 행에 있는 픽셀 값을 출력합니다.

 

결과는 이러한 형태로 나오게됩니다. 모든 이미지는 0~255 사이의 값을 갖는데,

이 이미지의 51번째 행의 값은 이렇게 나오네요

[[255 255 255 255 255 255 255 255 253 253 253 253 253 253 253 253 252 252
  252 252 252 252 252 252 253 253 253 253 252 252 252 251 242 247 247 235
  208 173 140 121 113 102  95  98 103 101  97  95  95  92  89  89  92  94
   94  93  95  93  89  86  84  84  85  86  94  94  94  95  96  97  98  98
   99  94  93  97  94  85  81  83  94  96  99 103 107 112 115 117 120 116
  113 114 117 116 109 103  92  94 104 115 109 110 119 103  61   7  14   6
    5   4  13  51  88  81  79  83  82  80  91 107 100 106 110 106  95  83
   75  72  75  75  77  78  77  76  82  90  99 107 113 110 102 100 108 119
  123 124 130 140 152 168 188 202 233 244 255 255 255 254 254 255 253 253
  253 253 254 254 254 254 254 254 254 254 254 254 255 255 255 255 255 255
  255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
  255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
  255 255 255 255 255 255 255 255 255]]

 

만약, 이미지의 변수의 크기를 보고싶다면, 다음 코드를 입력하면 됩니다.

print(img.shape)  # 이미지라는 변수의 크기  #[B, G, R순]
(225, 225)

 

이 숫자의 의미는 225의 높이 픽셀, 225 너비 픽셀임을 의미합니다. 

I

1. 기존 컬러 이미지를 흑백으로 변환 후 저장 하기

import cv2

img = cv2.imread('./img/3.jpg', cv2.IMREAD_COLOR)  # 바나나 사진 칼라로 출력
cv2.imshow('img', img)

gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
cv2.imshow('img2', gray_img)

cv2.imwrite('./img/new_banana.jpg', gray_img)

cv2.waitKey() #새로운 키가 입력될때 까지 대기
cv2.destroyAllWindows() # 키입력되면 입력되었던 창을 닫아라

바나나 사진을 출력해보겠습니다. 그러면 화면에 바나나 사진이 나타날 겁니다.

 

import cv2

img = cv2.imread('./img/3.jpg')  # 바나나 사진 출력

cv2.namedWindow('img_window', cv2.WINDOW_NORMAL)  # 사진창 크기 조절하도록 그러나 비율유지는 안됨.
cv2.imshow('img_window', img)

cv2.waitKey() #새로운 키가 입력될때 까지 대기
cv2.destroyAllWindows() # 키입력되면 입력되었던 창을 닫아라

요건 형태로 한번 불러보았습니다. 불러온 이미지의 크기 변환이 가능합니다. 다만, 비율유지는 안됩니다.

 

 

2. Matplotlib 시작 : 함수의 다양한 2차원, 3차원 그래프 그리기 기능 제공

먼저 Matplotlib 패키지 설치를 해보겠습니다.

pip install matplotlib

그 다음 이미지를 불러서, bgr을 rgb로 변경하

import cv2
import matplotlib.pyplot as plt

im_CV2 = cv2.imread('./img/3.jpg')
im_MPL = cv2.cvtColor(im_CV2, cv2.COLOR_BGR2RGB)   #bgr을 rgb로 변경

im_GRY1 = cv2.cvtColor(im_CV2, cv2.COLOR_BGR2GRAY) #원본이미지를 그레이 스케일로
im_GRY2 = cv2.cvtColor(im_MPL, cv2.COLOR_BGR2GRAY) #rgb이미지를 그레이 스케일로


plt.figure(figsize = (10,5))
plt.subplot(1,4,1) # BGR 이미지
plt.imshow(im_CV2)
plt.subplot(1,4,2) # RGB로 바꾼 이미지
plt.imshow(im_MPL)


plt.subplot(1,4,3)
plt.imshow(im_GRY1) #그레이로 색상을 바꾼 뒤 그림으로 출력
plt.subplot(1,4,4)
plt.imshow(im_GRY2)

plt.show()

이미지 출력결과

 

다른 이미지를 적용해보겠습니다.

import cv2
import matplotlib.pyplot as plt

im_CV2 = cv2.imread('./img/fruits.jpg')
im_MPL = cv2.cvtColor(im_CV2, cv2.COLOR_BGR2RGB)   #bgr을 rgb로 변경

im_GRY1 = cv2.cvtColor(im_CV2, cv2.COLOR_BGR2GRAY)
im_GRY2 = cv2.cvtColor(im_MPL, cv2.COLOR_BGR2GRAY)


plt.figure(figsize = (10,5))
plt.subplot(1,3,1) # BGR 이미지
plt.imshow(im_CV2)
plt.subplot(1,3,2) # RGB로 바꾼 이미지
plt.imshow(im_MPL)
plt.subplot(1,3,3)
plt.imshow(im_GRY1) #그레이로 색상을 바꾼 뒤 그림으로 출력

plt.show()

이미지 출력 결과

 

그레이스케일(grayscale) 변환은 일반적으로 특징을 추출하거나, 메모리의 계산 효율성을 위해서 컬러 이미지를 변환할때 많이 사용됩니다. 즉, 그레이스케일 변환을 하면 제한된 환경에서 이미지 처리를 수행이 가능해집니다.

그리고, 필터링, 모폴로지 연산, 임계값 처리 등 다양한 작업에도 그레이스케일 변환은 기본이기 때문에

CV를 공부하시는 분들은 그레이 스케일이 어떤 것인지, 어떻게 사용하는지에 대해서 반드시 인지하시기 바랍니다.

 

다음시간에는 픽셀연산하는 방법, 영상데이터를 numpy.ndarray로 표현하는 방법에 대해서 알아보겠습니다.