Techブログ

Tech blog

Pythonの話

openCVで画像解析(輪郭と閾値)

カテゴリ:Pythonの話

2020.07.09

このエントリーをはてなブックマークに追加

こんにちは!前回openCVの環境構築まで説明して、一旦使ってみようという感じだったので、今回は画像解析において重要である、閾値と輪郭の抽出に関してまとめました。

閾値処理

画像解析で物体を検出しようとしたとき、輪郭が連続していて、はっきりとしていることが必要です。そのためには画像をグレースケール化し、閾値処理をした後で輪郭を取得することが必要になります。

この閾値処理ではある一定の閾値(threshold)を超えているかどうかで画像処理を行います。例えば輝度(明るさ)が一定値に達していないところを全て0にするというような処理になります。これにより、画像から不必要な背景を落とす処理をしたり、輪郭を強調することができ、画像処理において重要です。

閾値処理の実行方法は、cv2.threshold です。入力画像の他に引数として、閾値となる thresh ,値の上限である maxval ,閾値処理の種別である type が存在します。type別にそれぞれ説明していきます。

THRESH_BINARY

このタイプは閾値を超える画像ピクセル対して最大値(maxval)を割り当て、それ以外のピクセルに0を割り当てます。出力の変数ret ,thresh1にはそれぞれデータの分離度が高くなるフィルタとしての閾値(大津の2値化)、画像データが格納されます。

ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)

THRESH_BINARY_INV

THRESH_BINARYの全く逆で、閾値をこえたピクセルに対して0を割り当て、それ以外のものに最大値を割り当てます。

THRESH_TRUNC

TRUNCとはTruncationのことで、閾値の切り捨てのことです。具体的には閾値を超える画像ピクセルには最大値を割り当て、それ以外のピクセルは変更なしとなります。

THRESH_TOZERO

これは閾値を超える画像ピクセルは変更せず、それ以外のピクセルは0となります。

THRESH_TOZERO_INV

これはTHRESH_TOZEROの逆で、閾値を超える画像ピクセルは0となり、それ以外のピクセルはそのままとなります。

ここまでの種類をまとめると下の表のようになります。

Type
閾値より上閾値より下
THRESH_BINARY
maxval0
THRESH_BINARY_INV0maxval
THRESH_TRUNC閾値そのまま
THRESH_TOZEROそのまま0
THRESH_TOZERO_INV0そのまま

また、このそれぞれのタイプについて非常にわかりやすいイメージ図と、大津の二値化に関して解説してある記事があったので共有します。

http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html

輪郭の検出

輪郭とは同じ色や値を持つ(境界線にそった)連続する点をつなげて形成される曲線のことです。

検出を行うにはcv2.findCotoursを利用することで簡単に輪郭を検出することができます。

img = cv2.drawContours(img, contours, -1, (0,255,0), 3)

この関数は境界上に点を持つ形状であれば輪郭以外の形状でも描画に使えます。第一引数は入力画像、第二引数はPythonのlistとして保存されている輪郭、第三引数は描画したい輪郭のインデックスです。第三引数は、第二引数で与えた輪郭のlistから一つだけを描画するときに描画したい輪郭の指定に用います。全輪郭を描画する場合は−1を指定します。また、以降の引数は輪郭を描画する色や線の太さなどの情報です。

わかりにくいですが、白黒の場合「白」の方が値が高いため(255)、輪郭検出を行う場合輪郭が白で描画されている画像を入力として与える必要があります。
※白黒のかなりはっきりした画像でないと輪郭が検出されないので注意してください

検出された輪郭は、cv2.drawContoursで画像上に描画することで輪郭を表示することができます。

最後に

今回は閾値処理と輪郭の検出をテーマにしていましたが、閾値処理などを施す前に画像のノイズを除去する平滑化(ぼやかす処理)も重要ですので、また機会があれば紹介したいと思います!今回はこれで失礼します!

一覧へ戻る

記事をカテゴリから探す