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

プラグラミング言語「PYTHON」を使ってみよう!!

業務自動化・効率化の実例を踏まえ、解説できればと思っています。対象は、プログラムを学び始めた初心者向けとなります。

今回の内容

  • openCVを用いて画像を2値化する

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

2値化はその名の通り、白か黒の2つの色しかありません。通常は「0」か「255」ですがその他の数値で表すことも可能です。



使用するのはopenCV

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

サンプルコード

import cv2
img = cv2.imread('osaka.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,th = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
cv2.imwrite('osaka_threshold_binary.jpg', th)

コメント

  • 1行目 OpenCVをインポート
  • 2行目「img = imread〜」jpegファイル読み込み
  • 3行目「gray = 〜」写真をグレースケールにする
  • 4行目「ret,th = cv2〜」で2値化する
  • 5行目「cv2.imwrite〜」2値化したファイルを保存

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

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

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

オリジナル写真


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

THRESH_BINARY


閾値は127に設定しました。この値は自分で決める必要があります。

2値化の結果を見ながら良い感じの値を設定すれば良いと思います。

THRESH_BINARY_INV


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

4行目を変更するだけです。変更点は赤字箇所。

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

cv2.THRESH_OTSU


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

変更点は4行目、赤字箇所です。
「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をコピーしました