OpenCVを勉強をしているんですが、
「二値化」が何か分かりません・・・
すごいざっくり説明すると「画像の白黒化」だ。
OpenCVライブラリを使った二値化の方法も解説しよう。
✔️ 本記事のテーマ
OpenCVでの二値化の方法(コード付き)
✔️ 読者さんへの前置きメッセージ
結論から述べると、以下の関数を使うことでOpenCVを使って二値化をできます。
cv2.threshold(画像, しきい値, 255, 二値化の手法)
本記事は「OpenCVライブラリを使った二値化の方法」について書いています。
この記事を読むことで、
「二値化とは? や 二値化をするコードの書き方」
をイメージできるようになります。
OpenCVライブラリは画像処理に特化したPythonライブラリです。
OpenCVライブラリを使えば、画像の二値化などを簡単に行うことができます。
それでは、その方法を詳しく解説していきましょう。
OpenCVとは?
OpenCV (Open Source Computer Vision Library) は、
画像処理に関する機能をまとめたライブラリです。
主に、画像中から人の顔を検出したり、カラー画像を白黒画像に変換する場面で使われています。
OpenCVライブラリの関数一覧と使い方については
「【python】OpenCVの関数一覧と使い方」の記事で解説しています。
今では「画像処理」を用いたPythonプログラミングでは必ずと言っていいほど使用されるほどに、メジャーなライブラリです。
インストール自体も簡単なので趣味や個人開発にもオススメです。
なお、OpenCVのインストールについては
「【python】OpenCVのインストール方法」の記事で解説しています。
OSにもよりますが、3ステップほどでサクッとインストールすることができます。
OpenCVの二値化とは?
すごいざっくり説明すると、「画像の白黒化」です。
厳密には少し違いますが、イメージとしてはこの理解でOKです。
例えば、画像の二値化を行うと、
以下のようにグレースケール画像を白黒画像に変換することができます。
処理の細かな部分を解説すると、全てのピクセルを白か黒かに変換しています。
グレースケールとは画像を白と黒の多階調のグレーだけで表現する方式のことです。
グレースケールでは以下のように、黒を0、白を255として、画素値が設定されています。
OpenCVライブラリを使った二値化では、
基準の値(例えば125)を設定して、基準値以下を黒、基準値以上を白に変換しています。
先ほど、厳密には違うと言ったのはこの部分です。
単純に白黒しているというよりは、
基準の数字以下の色を0(つまり黒)、基準の数値以上の色を255(つまり白)に変換します。
色の数値を、0 or 255 の二値に変換するので「二値化」と呼ばれているのです。
OpenCVで二値化をする方法(コード付き)
OpenCVライブラリで二値化を行う方法を解説します。
まず、今回のサンプルコードは以下のようになります。
# ライブラリのインポート
import cv2
# 画像の読み込み
img = cv2.imread('/etc/tmp/Lena.jpg', 0)
# 二値化(しきい値125以上の色を255に変換)
ret, img_thresh = cv2.threshold(img, 125, 255, cv2.THRESH_BINARY)
# 二値化画像の保存
cv2.imwrite(''/etc/tmp/after_Lena.jpg', img_thresh)
それでは、順番に詳しく解説していきましょう。
ライブラリのインポート
import cv2
OpenCVライブラリはPythonの標準ライブラリではありません。
そのため、プログラムの一番上でインポートすることで、
OpenCVライブラリを使えるようにしておきましょう。
なお、プログラムを実行した時にこの箇所でエラーが出る場合は、
そもそもOpenCVライブラリのインストールが上手くできていない可能性があります。
OpenCVのインストールについては
「【python】OpenCVのインストール方法」の記事で解説しています。
エラーが出る場合は、一度、確認してみましょう。
画像の読み込み
img = cv2.imread('/etc/tmp/Lena.jpg', 0)
OpenCVライブラリで二値化を行う場合は、
事前準備としてOpenCVライブラリの関数を使って、画像を読み込む必要があります。
画像を読み込むには、cv2.imread関数を使います。
第1引数には画像のパス、第2引数には0を指定します。
第2引数に0を指定することで、グレースケール画像として読み込むことができます。
この引数を省略すると、読み込む画像によっては後続の処理でエラーになってしまうかもしれません。二値化をする際は、忘れず指定するようにしましょう。
なお、OpenCvライブラリで画像を読み込む方法については、
「OpenCVで画像を読み込む方法【Python】」の記事で解説しています。
二値化(しきい値125以上の色を255に変換)
ret, img_thresh = cv2.threshold(img, 125, 255, cv2.THRESH_BINARY)
この部分で二値化処理を実施しています。
OpenCVライブラリのthreshold関数を使って二値化をしています。
この関数は、引数と戻り値が少しややこしいです。
コードベースで解説しましょう。
不要(※), 二値化された画像 = cv2.threshold(読み込んだ画像①, しきい値②, 変換後の値③, 二値化手法④)
各引数と戻り値はこのようになっています。
この関数は4つの引数を指定する必要があります。
1つ目で「読み込んだ画像」を指定します。
サンプルコードはimread関数を戻り値を受けた変数を渡しています。
2つ目で「しきい値」を指定します。
「しきい値」とはOpenCVの二値化とは?で解説した「基準値」のことです。
3つ目は「変換後の値」を指定します。
ここは基本的に255を指定しておけば良いでしょう。
4つ目は二値化の手法を指定しましょう。
この引数には以下の手法を指定できます。
- cv2.CV_THRESH_BINARY
- cv2.CV_THRESH_BINARY_INV
- cv2.CV_THRESH_TRUNC
- cv2.CV_THRESH_TOZERO
- cv2.CV_THRESH_TOZERO_INV
- cv2.THRESH_OTSU
基本的には、「cv2.THRESH_BINARY」を指定すれば良いでしょう。
戻り値については2つありますが、
基本的には「2つ目の戻り値だけ使う」と覚えておくと良いでしょう。
一つ目の戻り値も、本来はちゃんと使い道があります。
「大津の二値化」を行う際には、こちらの戻り値を使うのですが、
複雑な話になるので本記事では説明を割愛します。
二値化画像の表示
cv2.imwrite(''/etc/tmp/after_Lena.jpg', img_thresh)
最後に二値化した画像を保存しておきましょう。
画像の保存には、imwrite関数を使います。
一つ目の引数に「出力画像のパス」、
二つ目の引数に「threshold関数の2つ目の戻り値」を指定します。
なお、cv2.imwrite関数の詳しい情報については、
「OpenCVで画像を保存する方法【Python】」の記事で解説しています。
OpenCVで二値化するときの注意点
OpenCVライブラリで二値化をする際、
cv2.threshold関数のインプット画像はグレースケール画像でないとエラーが発生します。
例えば、カラー画像をそのままインプット画像とすると、
画像のチャネル数が想定外となり、エラーが発生します。
本記事のサンプルコードでは、
画像を読み込む際にグレースケールとして読み込むように設定しています。
画像の読み込みで「この引数を省略すると、読み込む画像によっては後続の処理でエラーになってしまうかもしれません。」と記載している部分です。
もし、自身でコードを書いて、エラーが発生している方は、
インプット画像をグレースケール画像に修正するとエラーが解消するかもしれません。
OpenCVやPythonについてもっとスキルをつけるなら
今回はOpenCVの白黒二値化について解説しました。
OpenCVは今回解説した機能以外にも多くの便利な機能があり、
マスターすれば非常に強い武器になるでしょう。
もし、OpenCVについて独学でスキルをつけるなら、以下の書籍がオススメです。
この書籍はOpenCVの基礎から応用までを
丁寧にかつ詳細に解説しています。
OpenCVのほぼ全てを網羅しているとも言えるほどの徹底ぶりなので、
関数のリファレンスとしても使用することができます。
本記事で解説した白黒二値化についても掲載されています。
エンジニアとしての自身の価値をチェックする(完全無料)
エンジニアとして、
自分の価値がどれくらいのものかご存知でしょうか?
エンジニアとしてIT業界に身を置いていると
今の会社でずっと働くのか、フリーランスとして独立するのか …
と様々な選択肢があります。
どの選択肢が正解なのかを見極めるためにも、選択肢を広げるためにも
自身の価値を知っておくことはとても重要です。
TechClips ME では、
職務経歴書をアップロードするだけで企業からのスカウトを受けることができます。
▼▼▼▼▼
▲▲▲▲▲
しかもTechClips MEでは想定年収を企業から提示してくれるので、
自身の価値を数字で分かりやすくたしかめることができます。
登録はもちろん完全無料なので、一度登録してみると良いかもしれません。
コメント