前提・実現したいこと
プログラミング初心者です。
現在、画像のからある範囲の色以外の部分を抽出するということをやろうとしているのですが、どのようにすればいいかがわかりません。
PythonでOpenCVを使用する予定です。
具体的に言うと、hsvの(0,0,0)から(0,0,255)の範囲以外を抽出したいです(画像の白黒部分を切り取り、色のついている部分のみを残したい)。
(下の画像のようにしたいです。)
いろいろ検索、検証しましたが、わかりませんでした。
もし、詳しい方がいれば教えてくださるとありがたいです。
↓
試したこと
いろいろ検索しましたが、ある範囲の色を抽出すると言うプログラムが多く、ある範囲以外の色を抽出すると言うのはありませんでした。
特定の範囲の色を判定してその座標を出すプログラムと特定の色を抽出するプログラムは作成したので、もしここから改良して作成できるようなら、そのようにしてくださるとありがたいです。
該当のソースコード
python
1#特定の範囲の色を判定してその範囲を求めて重心の座標を出すプログラム 2import cv2 3import numpy as np 4from time import sleep 5 6# 0 <= h <= 179 (色相) OpenCVではmax=179なのでR:0(180),G:60,B:120となる 7# 0 <= s <= 255 (彩度) 黒や白の値が抽出されるときはこの閾値を大きくする 8# 0 <= v <= 255 (明度) これが大きいと明るく,小さいと暗い 9# ここでは青色を抽出するので120±20を閾値とした 10LOW_COLOR = np.array([0, 0, 0]) 11HIGH_COLOR = np.array([0, 0, 255]) 12 13# 抽出する色の塊のしきい値 14AREA_RATIO_THRESHOLD = 0.005 15frame = cv2.imread("sample.jpg") 16 17# 高さ,幅,チャンネル数 18h,w,c = frame.shape 19 20# hsv色空間に変換 21hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV) 22 23# 色を抽出する 24img = cv2.inRange(hsv,LOW_COLOR,HIGH_COLOR) 25 26# 輪郭抽出 27contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 28 29# 面積を計算 30areas = np.array(list(map(cv2.contourArea,contours))) 31 32if len(areas) == 0 or np.max(areas) / (h*w) < AREA_RATIO_THRESHOLD: 33 # 見つからなかったらNoneを返す 34 print("the area is too small") 35else: 36 # 面積が最大の塊の重心を計算し返す 37 max_idx = np.argmax(areas) 38 max_area = areas[max_idx] 39 result = cv2.moments(contours[max_idx]) 40 x = int(result["m10"]/result["m00"]) 41 y = int(result["m01"]/result["m00"]) 42 43print(x) 44print(y) 45 46cv2.circle(frame,(x,y),10,(0,0,255),-1) 47 48# 画面に表示する 49cv2.imshow('frame', frame) 50sleep(1) 51 52while True: 53 # キー入力を1ms待って、keyが「q」だったらbreak 54 key = cv2.waitKey(1)&0xff 55 if key == ord('q'): 56 break 57 58cv2.destroyAllWindows() 59
python
1#ある範囲の色を抽出するプログラム 2#!/usr/bin/python 3import numpy as np 4import cv2 5from time import sleep 6 7# image info 8image_file = 'Sample.jpg' 9img = cv2.imread(image_file) 10 11# detect pink 12hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 13lower = np.array([0, 0, 0]) 14upper = np.array([0, 0, 255]) 15img_mask = cv2.inRange(hsv, lower, upper) 16img_color = cv2.bitwise_and(img, img, mask=img_mask) 17 18# debug 19cv2.imshow('HSV_test1', img_color) 20sleep(1) 21 22while True: 23 # キー入力を1ms待って、keyが「q」だったらbreak 24 key = cv2.waitKey(1)&0xff 25 if key == ord('q'): 26 break 27 28cv2.destroyAllWindows() 29
###利用環境
エディタ Atom
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/03 14:36