見出し画像

モノクロ画像をいい感じに透過してみた(python)

JPGをPNGに変換する

JPG画像はピクセルごとに は Red Green Blue の3つの値を持ちます。透過させるためには、Alphaチャネルという透明度の情報を追加して、RGBAの4つの値を持つPNG画像に変換する必要がありますね。

# pythonでJPG画像に透過度の情報を付与して、PNG画像に変換する
# opencv という画像処理系のライブラリを読み込む
import cv2 # opencv

# 変換元の画像をRGBとして読み込む
# Alphaを付与した画像に変換して、PNGとして保存する
img = cv2.imread('lena.jpg',cv2.IMREAD_UNCHANGED) #読み込み
print(img.shape) 
# (512,512,3) = (縦のサイズ,横のサイズ,RGB)
img = cv2.cvtColor(img,cv2.COLOR_RGB2RGBA) # alphaチャネルの付与
print(img.shape) 
# (512,512,4) = (縦のサイズ,横のサイズ,RGBA)
cv2.imwrite('lena_a.png',img,[int(cv2.IMWRITE_PNG_COMPRESSION),1]) # 変換して保存

ピクセルの白の部分を透過していく

それぞれのピクセルについて早速処理をしていきます。まず今、透明度の値はすべて255です。え、じゃあ、全部透明じゃんと思われるかもしれませんが、厳密には「透明じゃない度」と言い換えてもいいです。0に近づくにつれて、透明になります。下記のグラフのように透明度を変えてみることにします。

# opencvを読み込み、出力済みのpng画像を読み込む
import cv2 # opencv
img = cv2.imread('lena_a.png',cv2.IMREAD_UNCHANGED) # png
# 縦横のサイズを求めて、それぞれのピクセルから情報を取得する。白い部分は透明(0)に、黒に近づくにつれて(1)になるようにALPHAの値を変えていく。
height, width, rgba = img.shape # サイズを取得
for h_ in range(height):
    for w_ in range(width):
        r = img[h_][w_][0] # 座標[h_][w_]のRGBAのRを取得
        a = 255 - r # alphaの値を求める
        img[h_][w_][3] = a # alphaの値を書き換える
cv2.imwrite('lena_a_a.png', img)     

結果を見てみる

画像1

左側が処理前です。右側が処理後。
濃淡に合わせて、透明度を変更することができました。
また内容についてわかりにくい部分などありましたら、コメントくださいませ。ありがとうございました。

この記事が気に入ったらサポートをしてみませんか?