前提
OpenCVを使った画像処理での疑問が解消できません。
実現したいこと
- 画像内の特定の色以外を暗くする
発生している問題・エラーメッセージ
下のコードを実行するとプライマルウィンドウのスクリーンショットを撮って赤青緑の内、指定した色以外を薄暗くした画像が描画されます。
私が気にしているのは11行目の記述です。
hsv_img_ori =cv2.cvtColor(frame,cv2.COLOR_RGB2HSV)
frameはBGR画像であり、この画像に対してRGBをHSVに変換するcv2.cvtColor(frame,cv2.COLOR_RGB2HSV)は明らかに正常な動作をしないと思います。
しかし、この記述をcv2.cvtColor(frame,cv2.COLOR_BGR2HSV)と直すと38行目の時点でdstはscolor ="red"の場合青の領域を、scolor ="blue"の場合赤の領域をマスクしてしまいます。
13行目の時点でhsv_img_oriとhsv_imgをcv2.imshow('hsv_img_ori', hsv_img_ori)で確認したところ外見上はどちらも全く一緒で、何故この処理で成立するのか理解できません。どなたかご解説ください。
該当のソースコード
Python
1from PIL import Image, ImageTk, ImageOps # 画像データ用 2from PIL import ImageGrab 3import numpy as np 4import cv2 5 6img = ImageGrab.grab() 7capture = np.array(img, dtype=np.uint8) 8frame = capture 9 10cv_img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) 11hsv_img_ori =cv2.cvtColor(frame,cv2.COLOR_RGB2HSV) 12hsv_img = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 13 14bg_saturation = 4 15# 背景の明るさ 16bg_value = 0.2 17s_magnification = bg_saturation # 彩度(Saturation)の倍率 18v_magnification = bg_value # 明度(Value)の倍率 19hsv_img[:,:,(1)] = hsv_img[:,:,(1)]*s_magnification # 彩度の計算 20hsv_img[:,:,(2)] = hsv_img[:,:,(2)]*v_magnification # 明度の計算 21img_bgr = cv2.cvtColor(hsv_img,cv2.COLOR_HSV2RGB) 22 23hsv_s = 10 24hsv_v = 10 25# 三原色抽出 26red_mask = cv2.inRange(hsv_img_ori, (0, hsv_s,hsv_v), (20,255,255))+cv2.inRange(hsv_img_ori, (150, hsv_s,hsv_v), (180,255,255)) 27blue_mask = cv2.inRange(hsv_img_ori, (80, hsv_s,hsv_v), (130,255,255)) 28green_mask = cv2.inRange(hsv_img_ori, (30, hsv_s,hsv_v), (80,255,255)) 29 30scolor ="red" 31 32if scolor =="red": 33 dst = cv2.bitwise_and(cv_img, cv_img, mask=red_mask) 34elif scolor =="green": 35 dst = cv2.bitwise_and(cv_img, cv_img, mask=green_mask) 36elif scolor =="blue": 37 dst = cv2.bitwise_and(cv_img, cv_img, mask=blue_mask) 38 39# 合成・型抜き 40rows,cols,channels = dst.shape 41roi = img_bgr[0:rows, 0:cols ] 42img2gray = cv2.cvtColor(dst,cv2.COLOR_RGB2GRAY) 43ret, mask = cv2.threshold(img2gray, 1, 255, cv2.THRESH_BINARY) 44mask_inv = cv2.bitwise_not(mask) 45img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv) 46img2_fg = cv2.bitwise_and(dst,dst,mask = mask) 47 48dst = cv2.add(img1_bg,img2_fg) 49dst = cv2.cvtColor(dst, cv2.COLOR_RGB2BGR) 50img_bgr[0:rows, 0:cols ] = dst 51# NumPyのndarrayからPillowのImageへ変換 52pil_image = Image.fromarray(img_bgr) 53pil_image.show() 54
試したこと
cv2.cvtColor(dst, cv2.COLOR_RGB2BGR)等で色々変えてみましたが色がおかしくなる一方で特に成果は無し。
cv2.imshow()で見る限り、11行に問題がある様にしか見えない。
補足情報(FW/ツールのバージョンなど)
言語:Python
ツール:VScode

回答1件
あなたの回答
tips
プレビュー