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を使った物体検出のプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import cv2 import matplotlib.pyplot as plt img=cv2.imread("./drive/My Drive/ブログ_ColaboratoryでPythonの基礎/ハリネズミ_ブログ02.jpg") img_show=cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img_show) plt.show() img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) img_thres=cv2.threshold(img_gray,180,255,cv2.THRESH_BINARY_INV)[1] cnts, hierarchy = cv2.findContours(img_thres,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) for i in cnts: if cv2.contourArea(i) < 1000: continue else: x, y, w, h = cv2.boundingRect(i) cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 10) img_show=cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img_show) plt.show() |

プログラム全体の流れを説明します。
まず、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]を使ってみる
1 2 3 4 5 6 7 8 |
def tasu_kake(x,y): z1=x+y z2=x*y return z1,z2 show=tasu_kake(3,2)[1] print(show) |

tasu_kake(3,2)[1]はx*yをしたz2の6が表示されます。
tasu_kake(3,2)[0]の場合はx+yをしたz1の5が表示されます。
[0]や[1]を使わない場合
1 2 3 4 5 6 7 8 9 |
def tasu_kake(x,y): z1=x+y z2=x*y return z1,z2 show1,show2=tasu_kake(3,2) print(show1) print(show2) |

[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の比較」の投稿になります。