opencvでマスキングでは読み込んだ画像のピンク色の部分を切り出しました 今日は「読み込んだ画像のRGBを取得」「そのRGBに近い色で他の画像をマスキング」してみます!
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を取得します
# ピンクの範囲範囲を切り出し(ここは手動で値を設定) # 横 boxFromX = 50 # ここから boxToX = 100 # ここまで # 縦 boxFromY = 150 boxToY = 200 imgBox = kugel_img[boxFromY: boxToY, boxFromX: boxToX] cv2.imwrite("./pink.jpg", imgBox) Image(filename='./pink.jpg')
# 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')
最初に読み込んだピンクのオーナメントが左上にありますね
# さっき切り出したピンクの範囲の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')
ピンクのオーナメントの花柄部分とプレゼントのオーナメントのリボンが切り抜けました (白いところも切り抜けてしまった…)
これを応用して画面から画像の「好きな色の範囲」を選択して、RGB値を保存 → 好きな色に近い色の画像をピックアップする とかやってみたいな~