cv2.threshold()[1]←この[1]について Python

Pythonプログラムの物体検出で勉強した2値化処理をするcv2.threshold(…)[1][1]の意味がわからなくて、詰まった経験があるので、その[1]についてプログラミングコードとColaboratoryで実行した様子の解説を書きます。

目次

cv2.thresholdとは

cv2.thresholdを使った物体検出のプログラム


[1]の意味について

def文を使った自作関数で[1]を使ってみる


[0]や[1]を使わない場合

グレイ画像にした様子や2値化した様子など

cv2.thresholdとは

cv2.thresholdグレイ(灰色)にした画像から指定した引数に従って、白と黒だけの画像(2値化した画像)にします。

使い方
cv2.threshold(引数1引数2引数3引数4)

引数1にはグレイ画像のデータが入ります。

引数2にはしきい値(閾値)を設定します。

引数3には最大値を設定します。

引数4には2値化する条件を指定します。

この投稿では引数4にcv2.THRESH_BINARY_INVを指定しています。
cv2.THRESH_BINARY_INVは引数2のしきい値よりも画像の画素値が大きいときは0(黒)それ以外は引数4の値にします。

cv2.thresholdを実行して返ってくる値は2値化した画像データと指定したしきい値の2つの値が返ってきます。

(例)
cv2.threshold(img_gray,180,255,cv2.THRESH_BINARY_INV)

※しきい値(閾値)は境目となる値のことです。
※2値化は白と黒にする処理のことです。

cv2.thresholdを使った物体検出のプログラム

プログラム全体の流れを説明します。

まず、4行目のcv2.imreadで物体検出をする画像を読み込みます。そして、読み込んだ画像を9行目cv2.cvtColorでグレイ画像にして、2値化するcv2.thresholdにグレイ画像にしたデータを渡しています。

その後、cv2.findContoursで2値化画像データから輪郭を抽出して、下のfor文に輪郭の座標を渡します。それから、if文でその座標からcv2.contourAreaを使って面積を求め、1000より小さい場合はcontinueして小さい輪郭は四角で囲まないようにしています。

elseではcv2.boundingRectで輪郭の座標から外側だけを取った四角の形にして、cv2.rectangleで四角の枠で物体を囲みます。

プログラムを実行した様子がこちら↓

[1]の意味について

本題のcv2.threshold(…)[1]の[1]について、cv2.thresholdグレイ画像や指定したしきい値(閾値)などから、2値化した画像データと指定したしきい値2つの値を返します。上のプログラムの場合だとしきい値は180.0を返します。

2つの値が返ってくることから[1]は返ってくる2つの値の内どの値を返すかを決めています。

[0]は指定したしきい値を返し、
[1]2値化した画像データを返します。

def文を使った自作関数で[1]を使ってみる

tasu_kake(3,2)[1]はx*yをしたz2の6が表示されます。

tasu_kake(3,2)[0]の場合はx+yをしたz1の5が表示されます。

[0]や[1]を使わない場合

[0]や[1]を使わない場合は自作関数のtasu_kakeを呼び出した所にshow1,show2の2つの変数を用意します。
show1には5がshow2には6が入っています。


グレイ画像にした様子や2値化した様子など

cv2.imreadで読み込んだ画像をmatplotlib.pyplotで表示した様子になります。


cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)でグレイにした様子になります。


cv2.thresholdで白黒の2値化した様子になります。


cv2.rectangleで物体を認識した箇所に四角で囲んだ様子になります。


この投稿以外にcv2.thresholdを使ったプログラムがこちらcv2.thresholdとcv2.Cannyの比較の投稿になります。