자동 이진화
영상 이진화 처리시 임계값은 경험에 의존해 임계값을 설정하는 것이 일반적이다.
하지만 영상이 조명이나 환경에 따라서 픽셀 값이 미세하게 변화한다.
영상마다 사용할 수 있는 임계값이 있는데 임계값을 자동으로 설정해주는 방법이 있다. 가장 유명한 방법인 Otsu 이진화 방법에 대해 알아보자.
Otsu 이진화 방법
이진화의 임계값을 구분하는 가장 좋은 방법으로 많이 이용하고 있다.
입력 영상이 배경(background)과 객체(object) 두 개로 구성되어 있다고 가정하면, 이를 Bimodal histogram 이라고 한다.
Otsu 이진화는 Bimodal histogram인 경우에 적용이 가능하다.
임의의 임계값 T에 의해 나눠지는 두 픽셀 분포의 분산이 최소가 되는 T를 선택하는 방법이다.
Ostu 이진화 알고리즘
✔︎ Within-class variance
$$\sigma^{2} _{Within}(t) = \omega _{1}(t)\sigma^{2} _{1}(t) + \omega _{2}(t)\sigma^{2} _{2}(t)$$
그룹 내 분산을 최소로 하는 곳을 임계값으로 설정한다.
T가 1~255까지 다 계산하는데 이 계산이 너무 오래 걸리므로 그룹 간 분산을 이용한다.
✔︎️ Between-class variance
$$\sigma^{2} _{Within}(t) = \omega _{1}(t)(1-\omega _{1}(t))(\mu _{1}(t)-\mu _{2}(t))^2$$
모든 t값에 대해 그룹 간 분산을 구하여 최적의 T를 선택한다. 하지만 연산속도가 너무 오래 걸린다.
Otsu는 Recursion을 이용해 효율적으로 계산하여 연산속도를 높였다.
✔︎ Otsu 방법을 이용한 자동 이진화 - cv2.threshold
OpenCV에서 cv2.threshold 함수는 Otsu 이진화 계산을 지원한다.
- type flag에 cv2.THRESH_OTSU를 입력
import sys
import numpy as np
import cv2
src = cv2.imread('rice.png', cv2.IMREAD_GRAYSCALE)
if src is None:
print('Image load failed!')
sys.exit()
th, dst = cv2.threshold(src, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
print("otsu's threshold:", th) # 131
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
⬇︎
'OpenCV' 카테고리의 다른 글
[OpenCV with Python] 이진 영상 처리 : 모폴로지(Morphology) - 침식과 팽창 (0) | 2022.02.04 |
---|---|
[OpenCV with Python] 이진 영상 처리 : 지역 이진화 - cv2.adaptiveThreshold (0) | 2022.02.04 |
[OpenCV with Python] 이진 영상 처리 : 영상의 이진화 - cv2.threshold (0) | 2022.02.04 |
[OpenCV with Python] 영상의 특징 추출 : 영상에서 원 검출하기 - 허프 변환 (0) | 2022.02.04 |
[OpenCV with Python] 영상의 특징 추출 : 영상에서 직선 검출하기 - 허프 변환 (0) | 2022.02.04 |