透明な画像を作って描画していきます。その後、ベース画像にaddWeightedを実行します。opencv pythonで透明な画像を作成する
openCVのpythonで完全に透明な画像を幅と高さで初期化するにはどうすればよいですか?
編集:Photoshopのような効果を作りたい、レイヤーのスタックを持っている、すべてのスタックされたレイヤーは最初は透明であり、描画は完全に透明なレイヤーで実行されます。最後にすべてのレイヤーをマージして最終的な画像を得る
透明な画像を作って描画していきます。その後、ベース画像にaddWeightedを実行します。opencv pythonで透明な画像を作成する
openCVのpythonで完全に透明な画像を幅と高さで初期化するにはどうすればよいですか?
編集:Photoshopのような効果を作りたい、レイヤーのスタックを持っている、すべてのスタックされたレイヤーは最初は透明であり、描画は完全に透明なレイヤーで実行されます。最後にすべてのレイヤーをマージして最終的な画像を得る
として作成することができ、これについて:
import cv2
import numpy as np
#create 3 separate BGRA images as our "layers"
layer1 = np.zeros((500, 500, 4))
layer2 = np.zeros((500, 500, 4))
layer3 = np.zeros((500, 500, 4))
#draw a red circle on the first "layer",
#a green rectangle on the second "layer",
#a blue line on the third "layer"
red_color = (0, 0, 255, 255)
green_color = (0, 255, 0, 255)
blue_color = (255, 0, 0, 255)
cv2.circle(layer1, (255, 255), 100, red_color, 5)
cv2.rectangle(layer2, (175, 175), (335, 335), green_color, 5)
cv2.line(layer3, (170, 170), (340, 340), blue_color, 5)
res = layer1[:] #copy the first layer into the resulting image
#copy only the pixels we were drawing on from the 2nd and 3rd layers
#(if you don't do this, the black background will also be copied)
cnd = layer2[:, :, 3] > 0
res[cnd] = layer2[cnd]
cnd = layer3[:, :, 3] > 0
res[cnd] = layer3[cnd]
cv2.imwrite("out.png", res)
透明な画像を作成するには、4つのチャンネルマトリックスが必要です。そのうちの3つはRGBカラーを表し、4番目のチャンネルはアルファチャンネルを表します。 RGB値を無視してアルファチャンネルを直接0
に設定することができます。 PythonではOpenCVのは、行列を操作するためnumpy
を使用していますので、あなたはどのようにして、いくつかの「レイヤー」上に描画して、一緒に図面をスタックしたい場合透明画像は
import numpy as np
import cv2
img_height, img_width = 300, 300
n_channels = 4
transparent_img = np.zeros((img_height, img_width, n_channels), dtype=np.uint8)
# Save the image for visualization
cv2.imwrite("./transparent_img.png", transparent_img)
ありがとう、私はあなたが提案したイメージに何かを描こうとしましたが、それは動作しません。イメージは本当に作成されますが、単純な四角形を描画することはできません。操作は完了しましたが、画像が保存されると矩形は見えません。 –
実際には、アルファ255の値を持つ4チャンネルの四角形を追加したときに動きました...ありがとう –
これは非常に広いです。新しい画像(例:白)を使用して描画し、描画している場所を何らかの形でマークします(すべてのピクセルを確認できるように白を描画しない場合は不要です=白)。これら2つの画像を結合すると、ドローされていないウェイトはすべてゼロになります。 (私はopencvユーザではなく、addWeightedがどのように動作するかについていくつかの仮定をしました)。 – sascha
OpenCVはアルファチャンネルをサポートしていますが、アルファチャンネルのレンダリングをサポートしていません。 – Micka