PythonとOpenCVを使ってRBGやhex等の色検出を行う方法

スポンサーリンク

こんにちは、プログラマー仲間です。

今日はこのチュートリアルで、PythonのOpenCVライブラリを使って、画像内の様々な色を検出する方法を学びます。

スポンサーリンク

色彩検出入門

画像中の任意の色の名称を検出する処理を色検出といいます。

これは人間にとっては非常に単純な作業ですが、コンピュータにとってはそれほど単純なことではありません。

人間の目と脳は、光を色に変換するために協力しています。

その信号は、目にある光の受容体を介して脳に伝わります。

その後、色は脳によって認識されます。

このPythonの色検出のチュートリアルでは、クリックするだけで色の名前を取得できるアプリケーションを作成します。

そのため、色の名前と値が入ったデータファイルが必要になります。

そして、各色間の距離を計算し、距離が最も小さいものを選びます。

色判別に使用するデータセット

赤、緑、青は、あらゆる色を構成する3原色です。

コンピュータにおける各色の値は、0~255の数値で定義されています。

1つの色は約1650万通りの表現が可能です。

データセットを使って、各色の値をそれぞれの名前に変換する必要がある。

今回は、RGBの値とその名前を含むデータセットを使用します。

OpenCVをインポートする

最初のステップは、OpenCV と一緒に必要なモジュールをすべてインポートすることです。

そして、画像を読み込みますが、画像はコードファイルと同じフォルダにあることを確認してください。

1
2
3
4
5
import cv2
import numpy as np
import pandas as pd
 
img = cv2.imread("sample.jpg")

“colors.csv “ファイルを読み込む

CSVのようなデータファイルに対する操作を行うために、pandas ライブラリを利用します。

そして、pd.read_csv()関数を使用してCSVファイルをロードして読み込んでいます。

また、インデックスリストには各カラムに名前を付けて、アクセスしやすくしている。

1
2
index = ["color", "color_name", "hex", "R", "G", "B"]
data = pd.read_csv("colors.csv", names=index, header=None)

ウィンドウとコールバック関数を作成する

まず、入力画像を表示するための新しいウィンドウを作成する必要があります。

そして、画像上でマウスイベントが発生したときにのみアクティブになるコールバック関数を用意します。

1
2
cv2.namedWindow("Color Detection Window")
cv2.setMouseCallback("Color Detection Window",call_back_function)

しかし、ここでは call_back_function という名前のコールバック関数を作成しなければならない。

コールバック関数の作成

このコールバック関数が何をするのか理解しよう。

ダブルクリックしたピクセルのrgb値を計算し、マウス位置の(x,y)座標が保存されます。

1
2
3
4
5
6
7
8
9
10
def call_back_function (event, x,y,flags,param):
  if event == cv2.EVENT_LBUTTONDBLCLK:
        global b,g,r,xpos,ypos, clicked
        clicked = True
        xpos = x
        ypos = y
        b,g,r = img[y,x]
        b = int(b)
        g = int(g)
        r = int(r)

rgb値から色名を抽出する

画像からrgb値を抽出できたので、次はrgb値を色名に変更する必要があります。

以下の関数で同じことを行います。

1
2
3
4
5
6
7
8
def get_Color_Name(R,G,B):
    minimum = 10000
    for i in range(len(csv)):
        d = abs(R- int(csv.loc[i,"R"])) + abs(G-           int(csv.loc[i,"G"]))+ abs(B- int(csv.loc[i,"B"]))
        if(d<=minimum):
            minimum = d
            cname = csv.loc[i,"color_name"]
    return cname

色名を得るには、特定の色にどれだけ近いかを示す距離(d)を計算し、距離が最小になるものを選択します。

距離は以下の式で計算します。

d = abs(Red – ithRedColor) + (Green – ithGreenColor) + (Blue – ithBlueColor)

結果をウィンドウに表示する

ここでは、 cv2.imshow() 関数を用いて、先ほど作成したウィンドウに画像を描画しています。

ユーザがウィンドウをダブルクリックすると、画像の上に矩形が描かれ、 cv2.rectanglecv2.putText() 関数を用いてウィンドウに色の名前が表示されます。

1
2
3
4
5
6
7
8
9
10
11
12
while(1):
  cv2.imshow("Color Detection Window",img)
  if (clicked):
    cv2.rectangle(img,(20,20), (750,60), (b,g,r), -1)
    text = getColorName(r,g,b)+'R='+str(r)+'G='+ str(g)+'B='+ str(b)
    cv2.putText(img, text,(50,50),2,0.8, (255,255,255),2,cv2.LINE_AA)
    if(r+g+b>=600):
       cv2.putText(img, text,(50,50),2,0.8,(0,0,0),2,cv2.LINE_AA)
    clicked=False
    if cv2.waitKey(20) & 0xFF ==27:
      break
cv2.destroyAllWindows()

Sample Outputs

Fake tag
Fake tag
Fake tag

別の画像に出力する

Color Detection Window Opencv
Color Detection Window Opencv

まとめ

今日は、Pythonプログラミング言語でOpenCVを使用して色を検出する方法を学びました。

お読みいただきありがとうございました。

タイトルとURLをコピーしました