buto > /dev/null

だいたい急に挑戦してゴールにたどり着かずに飽きる日々です

Python OpenCV 画像のRGB取得

opencvでマスキングでは読み込んだ画像のピンク色の部分を切り出しました 今日は「読み込んだ画像のRGBを取得」「そのRGBに近い色で他の画像をマスキング」してみます!

参考:Python + OpenCVによる色情報の取得

from IPython.display import Image
import cv2  
import numpy as np  

kugel_img = cv2.imread("./christmas_kugel02_pink.png") 
Image("./christmas_kugel02_pink.png")

いらすとやのクリスマスオーナメントの画像からピンク色の部分のRGBを取得します

f:id:butorisa:20201020134536p:plain

# ピンクの範囲範囲を切り出し(ここは手動で値を設定)
# 横
boxFromX = 50 # ここから
boxToX = 100 # ここまで
# 縦
boxFromY = 150
boxToY = 200

imgBox = kugel_img[boxFromY: boxToY, boxFromX: boxToX]
cv2.imwrite("./pink.jpg", imgBox)
Image(filename='./pink.jpg') 

f:id:butorisa:20201020134520j:plain

# RGB平均値を出力
# flattenで一次元化しmeanで平均を取得 
b = imgBox.T[0].flatten().mean()
g = imgBox.T[1].flatten().mean()
r = imgBox.T[2].flatten().mean()

# 小数点切り捨て
import math
b = math.floor(b)
g = math.floor(g)
r = math.floor(r)

print("B:{}  G:{}  R:{}" .format(b,g,r))

B:159 G:114 R:229

切り出したピンクの範囲のRGBの平均値が取得できました! 次はこの色に近い色をでツリーの画像をマスキングします

tree_img = cv2.imread("./christmastree_decoration.png") 
Image(filename='./christmastree_decoration.png') 

最初に読み込んだピンクのオーナメントが左上にありますね

f:id:butorisa:20201020134626p:plain

# さっき切り出したピンクの範囲のBGRに近い色を指定
lower_color = np.array([b,g,r])  
upper_color = np.array([255,240,255])  

# マスキング  
tree_mask = cv2.inRange(tree_img, lower_color, upper_color)  
output = cv2.bitwise_and(tree_img, tree_img, mask=tree_mask)  

cv2.imwrite("./mask_tree_img.jpg", output)  
Image(filename='./mask_tree_img.jpg')  

ピンクのオーナメントの花柄部分とプレゼントのオーナメントのリボンが切り抜けました (白いところも切り抜けてしまった…)

f:id:butorisa:20201020134641j:plain

これを応用して画面から画像の「好きな色の範囲」を選択して、RGB値を保存 → 好きな色に近い色の画像をピックアップする とかやってみたいな~