Skip to content

OpenCVによる2値化

Posted in Python

Last updated on 2020年11月3日

2値化とは。閾値(しきい値)を設定し画像を黒と白の2色に変換することであるにゃ

さすが、よく知ってるね


こんにちは、エピックです。

引き続きOpenCVを深堀りしてみたいを思います。

画像処理といえば、みなさん何を思い浮かべるでしょうか。

色を変えること?サイズを変えること?色々有ると思います。

が、個人的には2値化こそ画像処理だと考えています。

OpenCVでは、さまざまな2値化の手法があります。

それでは、見ていきましょう。


2値化とは何か

2値化とは、閾値を決めて画像を2つの値(例えば、白:255、黒:0)のみで表現する方法であり手法になります。

方法は単純であり、設定したが閾値より大きければ白を割り当て,そうでなければ黒を割り当てるというロジックになります。

この2値化ですが、他の画像処理と組み合わせて利用することが多く画像処理の幹ともいえると私は考えています。


OpenCVでの2値化

OpenCVでの2値化ですが、cv2.threshold () を利用することで実装することができます。

引数は下記の通りとなります。

第四引数の手法については、下記で説明しますので一旦よみながしてください。

また、重要な点として、OpenCV で2値化を行う場合読み込み画像はグレースケール画像である必要があります。

では、コードとその結果を見てみましょう。

import cv2

def imgShow(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 画像を読み込み
# cv2.imread() を利用した場合、読み込みは BGR となる
img = cv2.imread("color.png")

# BGR から(to) GRAY への変換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 画像の2値化
ret,th = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)

# 画像を表示
imgShow("th",th)

上記の画像が下記のように変換され表示されるはずです。


2値化の手法

先程はとばしてしまいましたが、OpenCVでは第四引数で指定可能な方法がいくつか用意されています。

それが下記になります。

基本的には、白と黒の2値化を行う場合が多いため、cv2.THRESH_BINARY および cv2.THRESH_BINARY_INV を覚えておけばよいかと思います。

先程の画像をベースにそれぞれの結果は下記のようになります。

cv2.THRESH_BINARY
cv2.THRESH_BINARY_INV
cv2.THRESH_TRUNC
cv2.THRESH_TOZERO
cv2.THRESH_TOZERO_INV

大津(OTHU)により自動で閾値を決める

上記の手法の他に、大津の手法というものがあります。

大津の手法とは、自動的に閾値を決定して二値化を行う手法の1つです。

さきほどは閾値を自ら設定していましたが、大津の手法を利用することで閾値をその必要がなくなるというわけです。

原理について解説しようかと思いましたが下記のサイトの方が非常に分かりやすく説明されているのでそちらを参考にしてみてください。

結論から言えば、閾値を適当に設定したときのクラス(閾値を堺に分けられる2つの塊)間の分離度が最大となる値を求めます。

分離度は、クラス間分散とクラス内分散から求められます。


では実際にコードを書いてみます。

import cv2

def imgShow(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 画像を読み込み
# cv2.imread() を利用した場合、読み込みは BGR となる
img = cv2.imread("color.png")

# BGR から(to) GRAY への変換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 画像の2値化
# 第二引数の閾値は自動で設定されるため0を指定
ret,th = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)

# 画像を表示
imgShow("th",th)

(画像が悪かったかもしれませんが)2分割できているのがわかるかと思います。

次からもっとわかりやすい画像にしようにゃ(な)


まとめ

今回はOpenCVを利用したスタンダードな2値化の方法についてでした。

OpenCVを利用することで非常に簡単に2値化を行うことがわかったと思います。

実は、これ以外にも応用的な2値化の方法があるのでそれについては別に記事にしたいと思います。

今回も最後までお読みいただきありがとうございます。

ご質問等はコメントへお願いします。

では。


参考


画像のしきい値処理(OpenCV-Python Tutorials)

今回扱った内容が記載されたOpenCV-Python Tutorialsのページです。

英語を機械的に日本語に翻訳した感じで多少読みづらいかもしれませんが情報はまとまっています

チュートリアルであり情報が不足している部分もあるため、他の有志の方々のサイトを参考にしてみてください。

とはいえ、最初に読む分には程よい分量であるためおすすめです。

cv2.adaptiveThreshold () には今回記事では説明しておりませんので興味有る方は是非見てみてください。


Pythonで始めるOpenCV入門

Pythonでの実装をベースにまとめられた貴重なOpenCVの入門書です。

内容についても、環境のセットアップから画像処理の基本(変換、平滑化、抽出 等)過不足なく一通りの操作が解説されており個人的にすごく勉強になりました。

Kindle Unlimitedで読むことができるのですが購入し、今回も参考にさせていただいてます。

もし、PythonでOpenCVのまとまったドキュメントを探している方は手にとっても損にはならないかと思います。


西住工房(【画像処理】大津の二値化処理の原理・特徴・計算式)

西住工房さんという個人?の方のブログになります。

Pythonをはじめ、さまざまなソフトウェアやガジェット、またアニメまで幅広い内容となっています。

Youtubeでも解説動画を上げていらっしゃるのですが、これがわかりやすくて時間が有るときにお世話になっております。

数式強い人は本当に尊敬します。

Be First to Comment

コメントを残す