⚡️ OpenCV(Open Source Computer Vision) 개요
오픈 소스 컴퓨터 비전 라이브러리 중 하나로 실시간으로 이미지, 영상 프로세싱에 중점을 둔 라이브러리이다. 과거에는 C언어만을 지원하였지만, 현재 C++, Python에서도 활용이 가능하다. 필자도 현재 Python으로 랩핑된 OpenCV를 활용하고 있으며, 특히 딥러닝 분야에 특화된 Python이기에 필자도 현재 자주 사용하고 있다. 이미지도 일종의 데이터로 분류되며, 데이터를 더 의미 있게 만들기 위해서는 전처리 과정을 필수로 가지게 됩니다. 각각의 이미지는 픽셀을 갖고 있으며, 각각의 픽셀은 8비트로 구성된 각각의 데이터를 지니고 있습니다. 이미지 데이터처리의 기본적인 전처리 과정인 그레이스케일에 대하여 알아보고, 더 나아가 이진화(binarization)에 대해서도 다뤄보도록 하겠습니다.
⚡️그레이스케일(GrayScale)
그레이스케일(GrayScale)이란 앞서 말한 8비트의 R.G.B(3채널)의 이미지를 1채널로 변화시키는 것을 의미합니다. 쉽게 말하여 색상정보를 갖지 않고 0~255 밝기의 차이로 이미지를 변환시키는 것을 말합니다. 3채널의 이미지가 1채널의 이미지로 변환이 되면서 컴퓨터가 처리해야 할 계산이 줄어들기 때문에 이미지, 영상을 처리하는 데 있어 그레이스케일을 자주 활용 합니다.
⚡️비교
import sys
import cv2
from google.colab.patches import cv2_imshow
#RGB로 이미지 읽기
src = cv2.imread('/content/drive/MyDrive/Colab Notebooks/opencv/moons.png', cv2.IMREAD_COLOR)
#그레이스케일로 이미지 읽기
img_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
resize_img = cv2.resize(src, (300, 300))
resize_grayImg = cv2.resize(img_gray, (300, 300))
cv2_imshow(resize_img);
cv2_imshow(resize_grayImg);
⚡️원본 : 3차원 배열
[[ 93 100 103]
[ 93 100 103]
[ 93 100 103] ]
⚡️그레이스케일(grayScale): 2차원 배열
[[100 100 100 ... 136 136 136]
[100 100 100 ... 136 136 136]
[100 100 100 ... 136 136 136]]
⚡️이진화(binarization)란?
그레이스케일(grayScale)이 3채널의 이미지를 1채널로 바꾸는 거라면 이진화는 무엇일까? 바로 1채널의 이미지 0~255를 0 or 1로 바꿔주는 것이다. 쉽게 말하면, 특정 값(임계값)을 흑 또는 백으로 구분을 짓는 것이다.
⚡️이진화(binarization)
import sys
import numpy as np
import cv2
from google.colab.patches import cv2_imshow
#RGB로 이미지 읽기
src = cv2.imread('/content/drive/MyDrive/Colab Notebooks/opencv/moons.png', cv2.IMREAD_COLOR)
#그레이스케일로 이미지 읽기
img_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
#이진화(binarization)
ret, img_threshold = cv2.threshold(img_gray, 150, 255, cv2.THRESH_BINARY)
resize_threshold = cv2.resize(img_threshold, (300, 300))
cv2_imshow(resize_threshold);
위의 코드는 python 이진화(binarization) 입니다. 필자는 이진화를 사용하기 위하여 cv2.threshold(임계값 함수)를 사용하였습니다.
- img : 그레이스케일(grayScale) 이미지
- threshold.value : 임계값
- value : 적용되는 type에 따라 변하는 그 type의 최댓값
- type : 임계값 적용 방식
⚡️임계값 변화에 따른 출력 이미지
이진화(binarization)를 하는 이유는 최적의 임계값을 찾기 위함이다. 최적의 임계값이 나와야 이미지나 영상에 등장하는 사물의 특징을 추출할 수 있기 때문이다.
⚡️노이즈란?
블러링(bluring)에 대한 설명에 앞서 노이즈에 대해 알아보겠습니다. 노이즈는 잡음이라는 뜻으로 일상에서도 자주 사용하는 말일 겁니다. 하지만 이미지나 영상에서의 잡음이라고 하면 이해하기가 힘드실 수도 있습니다. 하지만 우리가 사진이나 영상을 카메라로 찍게 되면 광학적인 신호를 전기적 신호로 변환하는 과정에서 노이즈가 생기게 됩니다. 카메라가 받는 신호는 아래와 같습니다.
카메라가 받는 신호 = 렌즈가 받는 신호 + 잡음
이러한 과정으로 인해 우리가 확인하는 영상이나 이미지는 노이즈가 추가된 상태라고 볼 수 있습니다. 이러한 노이즈를 제거하기 위해 사용하는 영상 필터링 기법의 하나가 바로 블러링(bluring)입니다. 블러링(bluring)을 사용할 때 인접한 픽셀 간의 픽셀 값 변화가 크지 않다면 부드러운 느낌을 준다. 그러한 이유로 스무딩(smoothing)이라고도 불립니다.
⚡️블러링(bluring) - 필터링 기법
블러링(bluring) 기법은 여러가지가 있습니다. 하지만 오늘은 OpenCV에서 제공하는 함수 blur를 사용하여 평균 블러링(Averaging Bluring)을 구현해보도록 하겠습니다.
import numpy as np
import cv2
from google.colab.patches import cv2_imshow
#RGB로 이미지 읽기
ori = cv2.imread('/content/drive/MyDrive/Colab Notebooks/opencv/moons.png', cv2.IMREAD_COLOR)
#OpenCV에서 제공하는 blur함수
ori_blur = cv2.blur(ori,(20,20))
resize_ori = cv2.resize(ori, (300, 300))
resize_ori_blur = cv2.resize(ori_blur, (300, 300))
compare_src = np.hstack((resize_ori, resize_ori_blur));
cv2_imshow(compare_src);
cv2.waitKey(0)
cv2.destroyAllWindows()
⚡️Output:
영상 필터링 기법의 하나인 블러링(bluring)을 같이 알아보았습니다. 하지만 필터링 기법을 이해하려면 아직 알려드리지 않은 커널과, 컨볼루션 연산에 대한 개념이 꼭 필요합니다. 다음 포스팅에 커널과, 컨볼루션 연산에 대한 글을 포스팅하도록 하겠습니다.
읽어주셔서 감사합니다.
'Languages > Python' 카테고리의 다른 글
[Python]BeautifulSoup(bs4)를 사용하여 웹 스크래핑하기 (26) | 2023.08.10 |
---|---|
[Python]튜플(tuple) 자료형에 대해 알아보자 (8) | 2023.04.01 |
[Python]문자열(String)에 대해 알아보자 (8) | 2023.03.26 |
[Python]다른 언어 구별되는 Python의 변수 선언 방식 (5) | 2023.03.25 |
[Python]파이썬이란 어떤 프로그래밍 언어일까? (6) | 2023.03.23 |