이미지 이진화는 일반적으로 이미지 전체를 0과 1(또는 255)로 구성된 binary image로 만드는 작업을 말한다. 노이즈 제거, 백그라운드 제거 등에 사용될 수 있다.
히스토그램을 만들고 적당한 기준 값을 구한 뒤 이보다 크면 1, 작으면 0으로 처리하는 것이다.
히스토그램 분포가 bimodal distribution 일수록 잘 동작한다
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('gradient.jpeg',0)
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
cv2.threshold에서 2번째 인자는 임계 값이고 3번째 인자는 임계값을 넘었을때 적용되는 값이다
아래는 사용될 수 있는 옵션들이다
Global하게 thresholding하지 않고, Local하게 임계 처리 적용
이 방식이 항상 좋은 것은 아니고, 이미지 특성이 지역적인 이진화에 보다 유리할때 효과가 좋다
cv2.adaptiveTreshold()
Adaptive Method를 적용할 수 있다
가우시안의 특징 때문에 Mean에 비해 노이즈는 덜하지만 선명도는 떨어진다.
img = cv2.imread('../img/scaned_paper.jpg', cv2.IMREAD_GRAYSCALE)
t, t_otsu = cv2.threshold(img, -1, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
OTSU는 자동으로 threshold를 찾아주기 때문에 T값은 아무거나 넣어도 상관없다.
trial and error 류의 알고리즘이므로 반복 때문에 처리 속도는 상대적으로 느리다.