파이썬 강의/openCV

파이썬 openCV 1. 이진화(binarization, thresholding)

마리사라 2020. 11. 14. 23:18
반응형

파이썬 openCV의 첫 번째 강의 이진화(binarization, thresholding)입니다. 

 

이진화는 이름에서 알 수 있듯이, 영상(사진)을 이진법처럼 두 가지로만 분류하는 것입니다. openCV에서 이진화는 기존의 영상을 검은색과 흰색으로만 이루어진 영상으로 바꾸어주는 작업을 말합니다. 이때 흰색은 0, 검은색은 255를 의미합니다.


0. 왜?

사실 이유는 여러 가지의 중요한 이유가 있지만, 가장 중요한 이유는 어떠한 경곗값을 기준으로 이진화를 시키면 물체가 뚜렷해지기 때문입니다.

 

이진화의 예시

 

위 사진처럼 일정 색 이하는 전부 흰색으로 처리하면 글자가 매우 선명하게되죠? 또한 이렇게 만들면 처리해야 될 화소가 줄어들기에 영상의 용량도 줄어듭니다.


1. 시작

우선 전에 알려드렸다시피 가장중요한 cv2모듈을 import 합니다.

import cv2

 이진화에서는 numpy모듈까지는 필요가 없기에 numpy모듈은 굳이 import 하실 필요는 없습니다.

 

그 후, 이진화 처리를 할 영상을 불러와야 합니다. 영상을 불러오는 코드는 cv2.imread(영상의 위치)입니다.

저는 파이썬 코드와 lenna이미지가 같은 폴더에 있다고 가정하고 진행하겠습니다

img = cv2.imread("lenna.png")

이제 img에 lenna의 이미지가 담겼습니다.

 

그 후 중요한 것이, 영상의 이진화에서 컬러 영상은 이진화할 수가 없습니다. 흑백 영상으로 만들어주어야 하지요. 그때 사용하는 코드가 바로 cv2.cvtColor(변경할 영상, 무엇에서 무엇으로)입니다.(여기서 대소문자는 매우 중요합니다.)

변경할 영상은 lenna이미지인 img가 될 것이지만, 무엇에서 무엇으로 가 중요합니다. 우리는 컬러 이미지인 lenna를 흑백 이미지로 만들어주어야 하므로, BGR2 GRAY가 될 것입니다.(이때 왜 RGB가 아니냐고 하신다면, openCV의 특성상 컬러 영상은 기본적으로 BGR로 읽습니다)

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

이렇게 해서 gray에 흑백의 lenna이미지가 담겼습니다.

 

이제 영상의 이진화를 처리해보겠습니다. 영상 이진화의 코드는 cv2.threshold(영상, 임계값, 최댓값, 이진화 방법)입니다. 여기서 영상은 이진화할 영상 gray가 되겠지만 나머지 3개에 대한 설명이 필요합니다.

임계값 - 이진화 할 기준이 되는 값

최댓값 - 이진화 방법에 따라 바꿀 때 필요한 값

이진화 방법
cv2.THRESH_BINARY 임계값 이상 = 최댓값, 임계값 이하 = 0
cv2.THRESH_BINARY_INV 위의 반전, 임계값 이상 = 0, 임계값 이하 = 최댓값
cv2.THRESH_TOZERO 임계값 이상 = 원본값, 임계값 이하 = 0
cv2.THRESH_TOZERO_INV 위의 반전, 임계값 이상 = 0, 임계값 이하 = 원본값
cv2.THRESH_TRUNC 임계값 이상 = 임계값 임계값 이하 = 원본값
cv2.THRESH_MASK 흑색 이미지로
cv2.THRESH_OTSU otsu 알고리즘
cv2.THRESH_TRIANGLE triangle 알고리즘

이 중에서 THRESH_BINARY를 사용하겠습니다.

ret, dst = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

이때 저장되는 변수가 두개인데, ret에는 임계값이, dst에는 이진화된 영상이 저장됩니다.

위 코드처럼 하게 된다면 127을 기준으로 이하는 0, 이상은 최댓값이 됩니다.

 

이제 이걸 화면에 출력하도록 하겠습니다.

이미지를 출력하는 코드는 cv2.imshow(제목, 영상)입니다. 따라서 이진화된 영상을 출력하는 코드는

cv2.imshow("binary", dst)

입니다. 비교를 위해 원본 영상도 출력해보도록 하겠습니다.

cv2.imshow("original", img)

 

이제 코드를 실행하면 엄청난속도로 무언가가 떴다가 바로 꺼질 겁니다. 이유는 대기 명령이 없어서 그렇습니다. openCV의 대기명령 코드인

cv2.waitKey(0)

을 입력하면 다른 키가 입력될 때 까지 대기하게 됩니다. 이제 실행한다면

 

 

이진화된 lenna
원본 lenna

 

이렇게 이진화되어 잘 나타나게 됩니다. 이러한 사진들을 한 화면에 합쳐서 출력할 수도 있고, 사진의 히스토그램도 출력할 수가 있지만, 아직은 굳이 다루지 않겠습니다.


2. 마치며

다른 블로그나 사이트에서는 이진화를 나중에 알려줍니다. 사실 이진화가 더 쉬운데 말이죠. 그래서 저는 가장 먼저 이진화를 올려보았습니다. 이제 전체 코드를 올리고 마치도록 하겠습니다. 수고하셨습니다.

 

 

import cv2


img = cv2.imread("lenna.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, dst = cv2.threshold
(gray, 127, 255, cv2.THRESH_BINARY)
cv2.imshow("original", img)
cv2.imshow("binary", dst)
cv2.waitKey(0)
반응형