우리는 앞선 장에서 판다스를 이용해 데이터를 다루는 것을 해보았다.
이번에는 이미지 데이터를 다루어 볼텐데
이미지란 컴퓨터에 저장된 2차원 시각 정보 파일이다.
디지털 이미지 데이터는 색상을 표현하는 점들이 모여 한 장의 이미지가 되는 비트맵 bitmap 방식과
점과 곡선, 면들이 수학적인 식으로 표현된 벡터 verbor 이미지로 나뉜다.
우리는 이번에 비트맵 방식에 대해서 다룰 것이다.
이미지에서 가장 작은 크기의 공간을 차지하며 하나의 색상 값을 가지고 있는 정보를 픽셀이라고 하고,
비트맵 방식의 이미지는 그림의 기본 구성요소를 의미하는 이 픽셀로 이루어진다.
가장 간단한 형태의 비트맵 이미지는 한 픽셀을 0과 1로 표현하는 이미지이다.
이때 0은 이미지 요소가 없음을 의미하므로 검정색, 1은 이미지 요소가 있음을 의미하는 흰색으로 나타낸다.
비트맵 방식은 2차원 배열을 구성한 다음 이를 화면에 점으로 나타낸다.
하나의 픽셀이 색상 없이 밝기 정보만 있는 이미지는 회색조라고 한다.
이때 밝기 정보만 표현하는 하나의 채널로 픽셀을 표현할 수 있다.
보통 하나의 채널을 하나의 바이트로 표현하는데 0에서 255단계까지의 회색조 이미지를 나타낸다.
맷플롯립으로 간단한 이미지를 그려보자.
예제로 사용할 이미지는 다른 것을 사용해도 되지만,
글의 내용과 똑같이 진행하고 싶다면 다음 링크에서 다운로드 받으면 된다.
https://github.com/casperWebmon/DataScience/blob/main/mandrill.png
아래 코드를 살펴보자.
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread('c:/data/mandrill.png')
# 이미지 데이터가 위치한 곳의 경로를 적는다.
print(img)
matplotlib 에서 pyplot 모듈과 image 모듈을 import 하자.
이미지 모듈이 가지고 있는 파일 읽기 함수 imread 를 호출하기만 하면 된다.
경로는 C드라이브 밑에 data 라는 폴더를 만들어 진행했다.
내용을 출력해보면 각 픽셀은 세 개의 채널로 이루어져 있으며 0에서 1사이의 값을 가지고 있는 것을
확인할 수 있다.
이미지를 조작하는데 있어 강력한 모듈이 또 있다.
그것은 openCV 인데, 이것은 Open Source Computer Vision 을 의미한다.
실시간 컴퓨터 비전을 위한 라이브러리이다.
opencCV 를 사용하기 위해서는 패키지를 설치해야 한다.
파이썬 프로그래밍 환경에서 pip를 이용해서 설치하자.
이제 openCV 을 이용해서 이미지를 읽고 화면에 보이는 예제를 만들어보자.
다음 코드를 살펴보자.
import cv2
img_gray = cv2.imread('c:/data/mandrill.png', cv2.IMREAD_GRAYSCALE)
img_color = cv2.imread('c:/data/mandrill.png', cv2.IMREAD_COLOR)
cv2.imshow('grayscale', img_gray) # 맨드릴 원숭이를 회색조 이미지로 화면에 표시
cv2.imshow('color image', img_color) # 맨드릴 원숭이를 컬러 이미지로 화면에 표시
# 다음 두 행은 키보드 입력을 기다렸다가 모든 창을 끄고 종료하는 코드
cv2.waitKey(0)
cv2.destroyAllWindows()
openCV 가 설치되었다면 import cv2 를 이용해 패키지를 사용할 수 있다.
해당 모듈에서 제공하는 imread() 함수를 이용해 이미지 파일을 읽어 데이터를 생성할 수 있다.
이 때 처음 인자는 파일명, 두 번째 인자는 이미지를 회색조 혹은 컬러로 읽을지 결정한다.
창을 띄우고 이미지를 보이게 하는 것은 cv2 모듈의 imshow() 를 통해 가능하다.
결과화면은 다음과 같다.
그렇다면 이번에는 합성 사진을 제작해보자.
img1 와 img2 를 섞어보겠다.
이때 사용하는 함수는 addWeighted() 함수이다.
이미지 파일 green_back.png 와 iceberg.png 파일을 다음 링크에서 다운받자.
https://github.com/casperWebmon/DataScience
해당 링크에 들어가면 위에서 말한 두 개의 이미지 파일이 보일 것이다.
다운로드 받아서 여기서는 C드라이브 밑에 data 폴더에 경로를 두고 진행하겠다.
import cv2
global img1, img2 # 두 이미지를 프로그램의 전체에서 사용할 수 있도록 함
def on_change_weight(x): # 트랙바가 움직이게 되면 이 함수가 호출된다
weight = x / 100 # x 값이 0에서 100사이이므로 100으로 나누어 0에서 1사이 값으로
img_merged = cv2.addWeighted(img1, 1-weight, img2, weight, 0)
cv2.imshow('Display', img_merged)
cv2.namedWindow('Display')
cv2.createTrackbar('weight', 'Display', 0, 100, on_change_weight)
img1 = cv2.imread('c:/data/green_back.png')
img2 = cv2.imread('c:/data/iceberg.png')
img1 = cv2.resize(img1, (300,400))
img2 = cv2.resize(img2, (300,400))
cv2.imshow('Display', img1)
# 다음 두 행은 키보드 입력을 기다렸다가 모든 창을 끄고 종료하는 코드
cv2.waitKey(0)
cv2.destroyAllWindows()
주의할 점은 두 이미지의 사이즈가 같아야 한다.
그렇지 않으면 cv2.resize() 함수를 이용해 두 이미지의 크기를 동일하게 만들고 진행해야 한다.
가중치를 조절하기 위해 OpenCV 에서 제공하는 트랙바를 사용하자.
트랙바를 조절하면 두 이미지가 합성되는 것을 볼 수 있다.
결과 캡쳐화면은 다음과 같다.
이번 시간에는 이미지 데이터를 가지고 회색조로 컬러로 표현해보고,
두 이미지를 합성하기도 해보았다.
이미지를 가지고 할 수 있는 일들도 많다.
우리가 흔히 사용하는 카메라 필터와 같이, 이미지 자체에 필터를 씌울 수도 있고
원하는 색 픽셀만 뽑아낼 수도 있다.
openCV 를 간단하게 다뤄보며 느낀 것은
파이썬은 정말 많은 라이브러리들이 존재해서 잘 가져다 쓰기만 해도
다양한 기능을 구현할 수 있다는 점이었다.
openCV 에는 이미지 마스킹, 필터링, 블러링 등 풍부한 함수를 제공하니
많이 사용해보면 좋겠다는 것을 느꼈다.
출처 : 따라하며 배우는 파이썬과 데이터 과학 - 천인국, 박동규, 강영민