컴퓨터비전 처리는 각광받는 분야다. 4차 산업의 방향성으로 볼때 향후 그 중요성이 더해질 것으로 보인다.

 

현재의 인공지능이 스스로 판단하는 능력이 얼마나 되는가라는 것을 따져봤을 때 다양한 의견이 제시되고 있다.

 

2016년에 AI Robot Sophia 가 세상에 나오면서 사람들을 놀라게 했지만 소피아는 진정한 의미의 'AGI' (artificial general intelligence)는 아니라는 비판이 많다. 컴퓨터가 인간의 일을 대체하려면 인간과 닮은 시각 처리능력이 필수이다. 이것을 구현하려는 분야를 컴퓨터 비전이라고 한다.

 

컴퓨터 비전이란 단어가 생소한 것은 얼마 전까지는 이미지 프로세싱의 분야라는 이름으로 불렸기 때문이라고 한다.

 

카오스 사이언스의 컴퓨터 비전 강연에서 현재 연구중인 교수의 시각을 볼 수 있다.

 

이렇게 보면 멀게만 느껴지는 분야인데 파이썬에는 일반인도 컴퓨터 비전을 배울 수 있게 해주는 모듈이 있다. opencv-python 이다. C++ 로도 있기 때문에 구분하기 위해 opencv-python 이라고 한다.

 

이번 포스팅은 readthedocs 등을 참고하여 이미지를 다루어 본다. 컴퓨터 비전이라는 무서운(?) 것을 짧은 시간에 이해하기는 어렵겠지만 천리길도 한걸음 부터라고 이번 기회에 이미지 프로세싱이 뭔지 컴퓨터 비전이 뭔지 알아가는 시간을 가져보려고 한다.

 

파이썬 opencv 설치방법은 아래를 참고한다.

 

컴퓨터 비전 | 파이썬 이미지 처리 | opencv 설치 및 테스트 | 윈도우10

최근에 컴퓨터 비전이란 기술이 각광을 받고 있다. 컴퓨터 비전이란 쉽게 말해 컴퓨터가 이미지나 영상을 사람처럼 보는 는 능력을 구현하는 것을 목표로 하는 소프트웨어 분야다. 넓은 관점에

digiconfactory.tistory.com

 

우선 이미지 처리부터 시작한다. 이미지 처리 다음에 영상 처리로 나아가는 것이다. 이미지가 한 장의 사진이라면 영상이란 영화처럼 여러장의 사진을 시간의 흐름에 따라 이어 붙인 것이기 때문이다.

 

플립북의 원리와도 같다. 여러장의 그림을 연속적으로 보여주면 애니메이션이 된다.

 

flip book 플립북

흔히 동영상의 프레임이라고 한다. 

 

대표적으로 영화관에서는 1초에 24장을 보여준다. 24장을 재빠르게 돌려주는 것이다. 왜 24장이냐면 우리 눈이 자연스럽다고 생각하는 범위에 영화사가 감당할 수 있는 비용이기 때문이라고 한다. 우리 눈은 48 프레임 (1초에 48장) 이상을 구분하지 못한다고 한다.

 

정리하면 이미지는 1장의 사진과 같고 영상은 1초에 24장이 이어진 영화와 같다. 면의 차원으로 보면 너비x높이의 면인 이미지는 2차원이고 이 면들이 시간의 흐름에 따라 연속으로 배열되는 영상은 3차원이라고 할 수 있다.

 

VR 영상은 각각의 프레임에 3차원 정보까지 가지고 있으므로 유사한 4차원이라고도 볼 수 있다. VR이 사람들에게 더 큰 자극이 되는 것은 경험의 차원이 늘어나기 때문이다.

 

당연하지만 3차원인 영상을 처리하기 위해서 2차원 이미지데이터부터 해석하고 다룰 수 있어야 한다.

 

 

왜 영화는 1초에 24장인 24p(24fps)가 기본이 되었을까?

전 사진은 많이 찍지만 동영상은 많이 찍지 않습니다. 찍어도 소질도 없고 크게 관심도 없어서 공부도 하지 않았습니다. 그런데 최근에 유튜브 쪽에 관심을 가지면서 조금씩 배우고 있습니다.

photohistory.tistory.com

 

디지털 이미지의 프로세싱 관점에서 바라보면 이미지란 무엇인가? 컴퓨터의 데이터는 0과1로 이루어져 있다고 귀에 못이 박히도록 들었다면 이해하기가 쉬울 것이다.

 

모니터를 그림을 그리는 종이라고 생각한다. 그 종이를 바둑판 모양으로 아주 잘게 쪼갠다. 몇개로 나누었는지를 표현하는 것이 디스플레이 해상도이다. 필자는 32인치 2560 x 1440 해상도를 사용하고 있다. 이는 가로가 2560개 세로가 1440개 (가로를 너비, 세로를 높이라고 한다) 나누어져 있다는 것이다. 이 때 픽셀이란 단위를 사용한다. 이 모니터는 3,686,400 개의 픽셀을 사용하여 화면에 출력하는 것이다.

 

 

 확대해서 들여다보면 아래의 그림처럼 픽셀이 이루어져 있다. 바둑판이나 장기판과도 비슷하다.

 

(0,0) (0,1) (0,2) (0,3)

(1,0) (1,1) (1,2)

(2,0) (2,1)

(3,0)

 

좌표는 이런식으로 이루어진다. 자료형으로는 좌표를 가진 2차원 배열로 표현이 가능하다.

 

행이 x 축(너비) 열이 y축(높이) 이다.

 

컴퓨터 그래픽을 다루는 경우 이 개념은 중요한데 (0,0) 점이 어디서 시작하느냐에 따라 화면에 배치하는 알고리즘이 결정되기 때문이다. (2D 그래픽)

 

컴퓨터는 모니터상의 모든 픽셀에 다 접근하고 각각 위치에 색을 입히는 작업을 한다.

 

위의 배열에 한가지 정보를 더 주면 된다. 보통은 RGB 정보라고 한다. 색의 삼원색인 RED GREEN BLUE를 조합하여 색을 만들어 낸다. 하나의 삼원색에 0부터 255까지 단계가 나누어진다. 이런 방식은 24비트 16,777,216 (1600만)의 색을 표현할 수 있다. 1600만개의 색은 인간이 식별할 수 있는 범위를 거의 다 표현한다고 한다. 1600만개라고 하지만 사실 보통사람이 구분하는 색은 그렇게 많지는 않으니까 충분한 색상이라고 한다.

 

각 색상값을 255까지라고 한 것은 컴퓨터 메모리의 단위가 8비트이기 때문이다. 단위가 생각보다 의미가 있었다. 4비트 6비트 10비트가 아니라 8비트 인것은 컴퓨터에게도 인간에게도 가장 좋은 숫자였기 때문이다.

 

자 이제 32인치 모니터에 픽셀이 360만개 있다는 것도 알았고 1600만개의 색이 표현가능하다는 것도 알았다.

 

모니터에 있는 하나의 픽셀을 표현해보자.

 

오른쪽에서 2000번이고 위에서 1000번 픽셀이 초록색이다.

 

(2000, 1000) = (0, 255, 0)

 

파이썬으로 표현하면 저렇게 대응할 것이다.

(예시를 위한 것이다. 실제 픽셀 자료를 딕셔너리에 쓰는 것은 비효율적이다.)

 

중요한 것은 이미지 프로세싱에 이런 내부적인 사정이 있다는 것이다.

 

*자 그럼 이제 파이썬으로 돌아가보자.

 

먼저 실습에 사용할 이미지 자료를 하나 가져온다. 자신이 찍은 사진이나 그림도 좋다. jpg, png, bmp 파일이면 더 좋다.

 

필자는 무료 스톡 이미지 사이트를 추천한다. 실습을 하다보면 인터넷에 올리거나 타인에게 보여줘야 하는 경우도 있는데 이럴 때 가장 무난한게 무료 스톡 이미지 사이트이다. 짧은 동영상을 제공하는 곳도 많아서 나중에 영상 실습을 할 때도 유용하다.

 

 

무료 스톡 이미지 사이트 모음 | 상업적 사용가능 이미지,영상 | 저작권 걱정없는 자료 사이트 202

인터넷에서 콘텐츠를 생산하려면 항상 걸리는 것이 있다. 불펌이라는 단어는 여기서만 봐야할 콘텐츠를 누가 허락없이 저기로 가져가서 사용한다는 말이다. 불펌때문에 뭔가 경제적인 이득이

tactmarketing.tistory.com

이미지 처리 기초

 

필자는 무료 저작권 사진을 픽사베이에서 다운로드 받았다.

 

파일 명을 woman01.jpg 라고 하고 폴더 cv 안에 넣는다.

 

다음은 가장 심플한 코드이다.

 

import cv2

img = cv2.imread('cv/woman01.jpg', cv2.IMREAD_COLOR)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2를 사용해서 이미지 파일을 읽고 창을 하나 열어서 화면에 출력한다. imread나 imshow는 적응이 어렵지 않을 것이다. 파이썬의 file을 open 하는 방식과 같다.

 

imread  (이미지 읽기)에는 정해진 인수가 들어간다. 파일을 로드하는 칼라모드이다.

 

cv2.IMREAD_COLOR

 

-> 기본 설정값이다. RGB 값을 가져온다.

 

cv2.IMREAD_GRAYSCALE

 

-> 회색톤으로 읽어온다. 

 

회색톤으로 읽는다

cv2.IMREAD_UNCHANGED

 

-> 알파값(투명도)까지 읽어 온다.

 

이미지를 어떻게 읽어오느냐? numpy 객체로 읽어온다. type 로 확인해보면 클래스가 넘파이다. 넘파이는 숫자들의 연속이다. toString 정보를 출력하면 색상값을 저장한 배열들이 나온다.

 

print(type(img))

 

정보확인을 위해 속성을 꺼내본다.

print(img.shape)

파일을 확인해보면 너비와 높이가 출력된다. 마지막의 3이란 것은 RGB 세개의 요소가 사용된 이미지라는 것이다.

 

cv2.waitKey(0)

 

- 이것을 넣어주지 않으면 바로 종료해버린다. 0이 아닌 양수를 밀리세컨 단위로 넣으면 그 만큼 기다렸다가 종료한다.

 

import cv2

img = cv2.imread('cv/woman01.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('image', img)
key = cv2.waitKey(0)
print(key)
if key == ord('s'):
    cv2.imwrite('cv/woman01.png', img)
    print('file saved')
cv2.destroyAllWindows()

이렇게 하면 s 키를 입려받으면 파일 png 파일로 저장한다.

 

cv2.destroyAllWindows()

 

- 사용된 모든 윈도우들(이미지)을 반환하고 종료한다.

 

Matplotlib 사용하기

 

멧플롯립을 사용하면 다양한 기능을 사용할 수 있다. 주의할 점은 opencv 는 이미지를 bgr로 읽기 때문에 이를 다시 쪼개서 r, g, b로 입력해야 한다. r g b 는 각각 numpy 객체이다. merge 메서드가 있으니 편리하게 만들 수 있다. rgb 순서를 바꾸면 외계인 같이 이상한 피부의 인간처럼 되버린다.

 

import cv2
from matplotlib import pyplot

img = cv2.imread('cv/woman01.jpg', cv2.IMREAD_COLOR)

b, g, r = cv2.split((img))
plot_img = cv2.merge([r, g, b])
pyplot.imshow(plot_img)
pyplot.show()

숫자는 픽셀 좌표를 말한다. 좌측 상단 꼭대기가 0,0 으로 부터 우하향하여 내려오는 모습을 볼 수 있다.

 

853, 1,280 의 값이란 높이가 853 너비가 1280 위에서 부터 내려오는 것이다.

 


 

이미지 기본에 대하여 다루어 봤다. opencv python은 컴퓨터 비전이 아니더라도 컴퓨터 원리에 대한 지식도 얻을 수 있고 간단한 이미지 처리기도 만들 수 있다는 장점이 있다.

 

 

아래 opencv 유튜브 강의는 opencv 뿐만 아니라 이미지에 대한 설명도 훌륭해서 참고할 만하다.

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band