私はPythonでOpenCVについて勉強しています。画像の色をPNG形式に変更しようとしましたが、PNG背景に問題があります(画像の背景が透明になっています)。
グレースケールに変更すると、背景が黒に変わりました-私の写真はもう透明ではありません。絵の背景を透明に保ちたい。
元の画像:
私のコード:
img = cv2.imread('line.png',cv2.IMREAD_UNCHANGED)
cv2.imshow('line',img)
cv2.waitKey()
出力画像:
必要な出力:
ボーダー画像の周りの白い色は透明でなければなりません。どうすればできますか?
まず、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)
結果:
もう一度、別の背景について説明します。これで、本当に透明になっていることがわかります。
透明度情報をアルファチャネルでエンコードできるように、配列に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)
灰色の画像の結果:
BGR画像の結果: