
まくまく
今回は、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)