web-dev-qa-db-ja.com

Pythonを使用した背景透過.png形式のOpenCVに関する問題

私はPythonでOpenCVについて勉強しています。画像の色をPNG形式に変更しようとしましたが、PNG背景に問題があります(画像の背景が透明になっています)。

グレースケールに変更すると、背景が黒に変わりました-私の写真はもう透明ではありません。絵の背景を透明に保ちたい。


元の画像:

私のコード:

img = cv2.imread('line.png',cv2.IMREAD_UNCHANGED)
cv2.imshow('line',img)
cv2.waitKey()

出力画像:

必要な出力:

ボーダー画像の周りの白い色は透明でなければなりません。どうすればできますか?

4
Neko

まず、cv2.imshowを使用してアルファ透明度の画像を表示すると、透明領域が黒くなることを述べておきます。


入力画像にはすでにアルファチャネルが含まれているため、解決策は単純です。アルファチャネルを再利用するだけです。

わずかな問題があります。PNG形式ではアルファチャネル付きのグレースケールを使用できますが、AFAIKではそのような画像をOpenCVで書き込む方法はありません。

したがって、解決策は簡単です。処理されたグレースケール画像を取得してBGRに変換し直し、元のアルファチャネルを追加して、結果を保存します。

私たちはPythonを使用しているため、画像は派手な配列として表されるため、必要なチャネルを抽出するために array indexing を使用できます。 numpy.dstack を使用すると、アルファチャネルを簡単に追加できます。


サンプルコード:

import cv2
import numpy as np

src = cv2.imread('51IgH.png', cv2.IMREAD_UNCHANGED)

bgr = src[:,:,:3] # Channels 0..2
gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)

# Some sort of processing...

bgr = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
alpha = src[:,:,3] # Channel 3
result = np.dstack([bgr, alpha]) # Add the alpha channel

cv2.imwrite('51IgH_result.png', result)

結果:

もう一度、別の背景について説明します。これで、本当に透明になっていることがわかります。

3
Dan Mašek

透明度情報をアルファチャネルでエンコードできるように、配列に4番目のチャネルを追加する必要があります。

pythonコード例:

import cv2
file_name = "source.png"

src = cv2.imread(file_name, cv2.IMREAD_UNCHANGED)

# Save the transparency channel alpha
*_, alpha = cv2.split(src)

gray_layer = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

# ... Your image processing

# Duplicate the grayscale image to mimic the BGR image and finally add the transparency
dst = cv2.merge((gray_layer, gray_layer, gray_layer, alpha))
cv2.imwrite("result.png", dst)

灰色の画像の結果:

Grey image with transparency

BGR画像の結果:

0
leoburgy