LoginSignup
3
4

More than 3 years have passed since last update.

OpenCVで二値化処理

Last updated at Posted at 2019-09-25

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

image.png
opencvより転載

今回対象とする画像

town.jpg

結果

cv2.THRESH_BINARYを使用して、閾値を適当に半分の127に設定。
パラメータの探索が面倒。
town.jpg

適応的閾値処理

適応的閾値処理といういいものがあった。
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)

結果は以下の通り

  • 最後の引数の値が10
    town.jpg

  • 最後の引数の値が2

town.jpg

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4