生産技術者サラリーマンの日々

社畜サラリーマンが生産技術やお金の悩みを徒然と書くブログです。私の備忘録が共有できるとうれしいです

【Python+OPENCV】検出したい物体の色を抽出する!

1.はじめに

 画像処理の手法のひとつにHSV変換がある。これは、一般的によく使われるRGB色空間を変換して、HSV色空間にする。このHSVは、H(色相)、S(彩度)、V(明度)の3つのパラメータで色を表現する。

f:id:inusan0424:20200112031346j:plain

https://reiji1020.gitbooks.io/play-opencv/content/hsv.html

2.何に使えるか?

 最も利用される理由として、対象物体(検出したい物体)の色を特徴量としたいためである。RGB色空間で十分じゃない??と思うのですが、RGBは3原色を混ぜ合わせ色を作るため、パラメータが3つ必要!それに対して、HSVはH(色相)の1つですべての色を表現できるのである(ただし、黒と白は色相をもたない!) また、対象物体の色のS(彩度=鮮やかさ)もパラメータとして制御できるためRGBより対象物体の色抽出をしやすいのである。

 

3.やってみる(Python+OpenCV

import cv2

img = cv2.imread("sample.jpg")                                #入力画像を読み込む

Ex_img = np.zeros((h,w,1),np.uint8)                         #抽出結果を格納する画像を初期化(全部黒にする)

h = img.shape[0]                                                       #画像の縦ピクセル数を取得

w = img.shape[1]                                                      #画像の横ピクセル数を取得

th1 = 0                                                            #青色の色相の下限値

th2 = 33                        #青色の色相の上限値

hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)   #入力画像をHSV変換する

for j in range(h):                                     #画像の縦方向を操作する
          for i in range(w):                      #画像の横方向を操作する
                    if hsv[j,i,0] >= th1:                    #色相(hsv[j,i,0])が閾値より大きい

                          if hsv[j,i,0] <= th2:                #色相(hsv[j,i,0])が閾値より小さい
                                    Ex_img[j,i] = 255               #物体の領域と判断して、白の画素を入れる。

 

4.結果

サンプルとして青色のワイヤだけを抽出しました。こんなかんじになります。色相のパラメータは事前に調べておく必要があります。次回はその決定方法について、書いてみます

f:id:inusan0424:20200112040517j:plain

入力画像

 

f:id:inusan0424:20200112040530j:plain

抽出結果

 

inusan0424.hatenablog.com

 

inusan0424.hatenablog.com


 

https://blog.hatena.ne.jp/inusan0424/inusan0424.hatenablog.com/config/design/detail