やりたいこと
以下の画像があります。

これは事前の元画像を二値化したものでありますが、ここに写っている白黒画像について、pythonのopencvを用いて白色→赤色に黒色→青色になどと自由に色を変換したいと考えています。
以下、元のソースコードです。
import cv2 import numpy as np import matplotlib.pyplot as plt # (coins.png)の読み込み img = cv2.imread('tmp/coins.png') # グレースケールに変換する gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # Otuの二値化(入力はgrayのみ) ret, bin_img = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) # 輪郭の抽出 contours, _ = cv2.findContours(bin_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 小さい輪郭は誤検出として削除 # 輪郭内部を塗りつぶすdrawContours draw = cv2.drawContours(bin_img, contours, -1, color=255,thickness=-1) print(draw.shape) print(draw) (246, 300) [[255 0 0 ... 0 0 0] [255 0 0 ... 0 0 0] [255 0 0 ... 0 0 0] ... [255 0 0 ... 0 0 0] [255 0 0 ... 0 0 0] [255 0 0 ... 0 0 0]]
試したこと
以下のようにnp.whereなどで特定の画素をいじれないか見てみましたが、そもそもrgbの色情報などがないため、特定の色に変換することができない??
draw = np.where(draw[:,0] >= 255, 255, 100)
最後に
どうか白黒rgbではない画像を白→赤、黒→青のように特定の色に変換する方法をアドバイスしてくれると助かります。
どうかよろしくお願いします。
GRAY2BGRで白黒RGBにするのは禁じ手なんですか。
いえ、そんなことないです。
できるのであればどんな手法でも大丈夫です。
特に何も考えなければ「結果用の画像バッファを用意して,自前で全画素走査(ループ)して結果画像の画素値を決めていく」ことを素直に行えば済む,という話になりそうですが,
「そういう自明すぎる話をしたいのではなくて,なんつーか,こう,労せず一発で(?)やれるような方法は無いか?」といったような趣旨なのであれば,そのような話だということがもう少しわかりやすいように書かれるとよいのではないかな,とか思います.
(「当然こう書けばやれるけども長いしめんどいじゃん? もっと簡単な方法を教えてみせてみろよ」みたいな)
例えばprint(draw)の下に以下7行を追加する感じでもいいんですかね。
w_mask = cv2.cvtColor(draw,cv2.COLOR_GRAY2BGR)
r_img = img.copy()
t_img = img.copy()
r_img[:] = (0,0,255)
t_img = w_mask & r_img
cv2.imshow('masked',t_img)
cv2.waitKey(-1)
(白が赤になります。)
・3chの結果画像バッファを全面青色で用意する
・白黒画像をマスクとして用いて結果画像バッファの一部を赤に変える
みたいな手順でよいのではないかと思うけど,それをpythonでどう書くのかは知らない.
回答1件
あなたの回答
tips
プレビュー
