はじめに
透過画像作りたいのですが、調べたら意外となかったので自分のために備忘録
環境
-
MacBookPro
-
Python (3.7.4)
python --version
Python 3.7.4
- OpenCV (4.1.1)
>>> import cv2
>>> cv2.__version__
'4.1.1'
プログラム
#!/usr/bin/python
import numpy as np
import cv2
image_file = 'sample.png'
image = cv2.imread(image_file, -1)
width = image.shape[0]
height = image.shape[1]
out = np.zeros(image.shape[:4], np.uint8)
for i in range(width):
for j in range(height):
b = image[i][j][0]
r = image[i][j][1]
g = image[i][j][2]
a = image[i][j][3]
if r>0 or g>0 or b>0:
out[i][j][0] = 255
out[i][j][1] = 255
out[i][j][2] = 255
out[i][j][3] = 255
else:
out[i][j][0] = b
out[i][j][1] = r
out[i][j][2] = g
out[i][j][3] = 0
cv2.imwrite("alpha.png", out)
簡単な解説
前提
そもそもalphaチャネルは、pngじゃないともっていないので、jpgとかだとダメです。なので、まずは、pngファイルを準備します。
画像読み込み
image_file = 'sample.png'
image = cv2.imread(image_file, -1)
画像を読み込む時の引数で -1
をつけるとalphaチャネルまで読み込めます。
出力画像の箱準備
out = np.zeros(image.shape[:4], np.uint8)
0で埋めたnparrayを準備してます。
透過処理
for i in range(width):
for j in range(height):
b = image[i][j][0]
r = image[i][j][1]
g = image[i][j][2]
a = image[i][j][3]
if b>0 or r>0 or g>0:
out[i][j][0] = 255
out[i][j][1] = 255
out[i][j][2] = 255
out[i][j][3] = 255
else:
out[i][j][0] = b
out[i][j][1] = r
out[i][j][2] = g
out[i][j][3] = 0
1ピクセルづつ処理してます。
この処理だと、黒(0,0,0)を透過させてます。そして、黒じゃないところを白(255,255,255)にします。
なので、黒じゃない時(b>0 or r>0 or g>0)はそのまま、それ以外の時は、alphaを0にしてます。
結果
↓↓↓↓↓↓↓↓↓
処理後
※透過+白だから見えないぽいので、クリックしていただけると幸いです。
たまに、透過画像が必要になる人は参考にしていただければと思います。
ありがとうございました。