OpenCVで二値化処理を行う
大津の2値化を使用したが計算された閾値がしっくり来なくて自動計算できるものを探した。
二値化処理とは
ある画素の画素値を閾値によって、白または黒を割り当てる処理。
メソッド
基本的にはcv2.THRESH_BINARY
を用いる
cv2.THRESH_BINARY
は閾値よりも大きな値を白に割り当てるが、白黒反転や閾値以下のみを黒にするなどの処理もある。
- cv2.THRESH_BINARY
- cv2.THRESH_BINARY_INV
- cv2.THRESH_TRUNC
- cv2.THRESH_TOZERO
- cv2.THRESH_TOZERO_INV
今回対象とする画像
結果
cv2.THRESH_BINARY
を使用して、閾値を適当に半分の127に設定。
パラメータの探索が面倒。
適応的閾値処理
適応的閾値処理といういいものがあった。
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst])
二値化に必要な閾値を自動で計算してくれるというもの。
今回はガウス分布を利用した関数にして実装した。
cv2_adaptive_threshold.py
cv2_img = cv2.imread('town.jpg')
gray_img = cv2.cvtColor(target_img, cv2.COLOR_RGB2GRAY)
(h,w,c) = cv2_img.shape
area_size = int(h*w/1000) # blockSizeはテキトー
i_binary = cv2.adaptiveThreshold(gray_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, area_size, 10)
cv2.imwrite(output_folder+image_name, i_binary)
結果は以下の通り