【OpenCV】2値化手法を比較してみた

まくまく
まくまく
今回は、2値化手法を比較してみようと思います。

2値化とは、画像を白と黒の2つの値で表すことです。閾値を決めて、その設定値以上の画素には白を割り当て、それ以下には黒を割り当てるというものです。

2値化はその名の通り、白か黒の2つの色しかありません。通常は「0」か「255」です。



使用するのはopenCV

使用するのは、画像処理ライブラリのopenCVです。ここではopenCVがインストールされているのを前提として書き進めていきます。

サンプルコード

#ライブラリをインポート
import cv2
#画像を読み込み
img = cv2.imread('osaka.jpeg')
#読み込んだ画像をグレースケールへ変換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#2値化を実施
ret,th = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
#2値化した画像を書き出し
cv2.imwrite('osaka_threshold_binary.jpg', th)

コメント

2値化の引数は、(画像データ、閾値、出力の最大値、2値化の手法)です。

2値の手法はいくつもありますが、まずは以下の4種類程度を押さえておけば良いと思います。

  • cv2.THRESH_BINARY
  • cv2.THRESH_BINARY_INV
  • cv2.THRESH_OTSU
  • ADAPTIVE_THRESHOLD_GAUSSIAN_C

オリジナル写真


オリジナルの写真はこちら。この写真を2値化していきます。

THRESH_BINARY


まずはTHRESH_BINARYから。

閾値は127に設定しました。この値は自分で決める必要があります。2値化の結果を見ながら良い感じの値を設定すれば良いと思います。

THRESH_BINARY_INV


THRESH_BINARYの白と黒を反転したのがこちら。

以下の赤字箇所を変更するだけでOKです。

「ret,th = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)

cv2.THRESH_OTSU


大津の方法による2値化は、閾値を自動で決めてくれます。

変更点は赤字箇所です。
「ret,th = cv2.threshold(gray,0,255,cv2.THRESH_OTSU)

ADAPTIVE_THRESHOLD_GAUSSIAN_C


これは適応的閾値処理による二値化と言われ、近傍領域の重み付け平均値を閾値として使用します。重み付けをするだけあって複雑な画像でもパラメーター(引数の最後から2つ目の値)を最適なものに設定すると良い結果が得られそうですね。この値は奇数にしておく必要があります。

適応的閾値処理のコードを記載しておきます。

import cv2
img = cv2.imread('osaka.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
th = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
                       cv2.THRESH_BINARY,39,2)
cv2.imwrite('osaka_adaptive_threshold.jpg', th)



タイトルとURLをコピーしました