YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

【図解で解説】白色部分を透明化処理|Python×OpenCV

Pythonの画像処理ライブラリOpenCVを使用して、画像の白色部分を透明化する方法を紹介します。

正直言って、白色部分を透明化処理するだけであれば、ウェブ上に無料のソフトがあります。

しかし、自分でスクリプトを書けば、複数ファイルの自動処理など、応用の幅が広がります

とはいえ、いざやってみようとすると難しいものです。

そこで今回は、OpenCVを使用した白色部分の透明化処理について紹介します。

透明化処理とは?

画像データは、BGR(青緑赤)の3つのデータの重ね合わせで構成されます。

しかし、BGRに加えて透明度、アルファチャンネル(Alpha)を併せ持つ画像もあります。

透明度を持つ画像は、BGRA(青緑赤透明度)の4つのデータの重ね合わせです。

次の画像は背景が、白色と透明の場合の違いを表しています。

左側の元画像は同じ見た目ですが、他の画像に重ねた時に透明だと裏側が透けて見えます

画像を重ねる際に、背景が透明化どうかは大切になってきますね。

以下ではOpenCVを使用して、白色を透明化する方法を解説します。

OpenCV環境の準備

まずはじめに、PythonでOpenCVを使用できる環境を整えましょう。

ここではAnacondaでOpenCV環境を構築、jupyter notebookで使用する方法を紹介します。

OpenCVのインストール

ここではPythonのモジュール管理ソフトAnacondaを使用した例を紹介します。

Anacondaターミナルで次のコマンドを実行すれば、base環境にインストールできます。

conda install opencv

ただし、baseの環境には新規のライブラリをインストールすることは推奨されていません。

次のように新規の仮想環境を作成することをオススメします。

conda create -n 環境名
conda activate 環境名
conda install opencv

必要に応じて新規仮想環境にjupyter notebookやNumPyもインストールしておきましょう。

conda install numpy pandas notebook

jupyter notebookでOpenCVを使う

OpenCVをインストールした仮想環境でjupyter notebookを起動する方法を紹介します。

Anacondaのターミナルで次のコマンドを実行しましょう。

conda activate 環境名
conda jupyter notebook

もしくは、スタートメニュー ⇒ <Anaconda3(64-bit)> ⇒ <Jupyter Notebook(環境名)>をクリックしてもOKです。

白色部分の透明化(スクリプト紹介)

以下のスクリプトで、白色部分を透明化できます。

src.pngの白色部分が透明化されてdst.pngとして保存されます。

# OpenCVとNumPyをインポート
import cv2
import numpy as np
 
# 元画像の読み込み
path = "./figure_bgr.png"
src = cv2.imread(path)
 
# Point 1: 白色部分に対応するマスク画像を生成
mask = np.all(src[:,:,:] == [255, 255, 255], axis=-1)
 
# Point 2: 元画像をBGR形式からBGRA形式に変換
dst = cv2.cvtColor(src, cv2.COLOR_BGR2BGRA)
 
# Point3: マスク画像をもとに、白色部分を透明化
dst[mask,3] = 0
 
# png画像として出力
cv2.imwrite("dst.png", dst)

このスクリプトでは、次の3つがポイントです。

  • Point 1:白色部分に対応するマスク画像を生成
  • Point 2:元画像をBGR形式からBGRA形式に変換
  • Point 3:マスク画像をもとに、白色部分を透明化

次の3×3の画像を例に各ポイントを解説していきます。

Point 1:白色部分に対応するマスク画像を生成

画像の白色部分をTrue、それ以外をFalseとする真偽値の配列を作成します。

mask = np.all(src[:,:,:] == [255, 255, 255], axis=-1)

np.all()関数で、BGR全てが255(=白色)ならTrue、そうでなければFalseとなる配列を作ります。

このような特定の条件を満たす領域を抽出するための画像をマスク画像と呼びます。

Point 2:元画像をBGR形式からBGRA形式に変換

元の画像はBGRのデータしかないので、アルファチャンネルを追加します。

dst = cv2.cvtColor(src, cv2.COLOR_BGR2BGRA)

これでBGRA形式の画像になったため、透明度の設定ができるようになりました。

ここまでで下準備OKです。あろは白色部分を透明に書き換えるだけです。

Point 3:マスク画像をもとに、白色部分を透明化

画像の(x,y)の位置のピクセルのα値は、[x,y,3]に対応しています。

α値を0にすると透明になるので、マスク画像のTrueの場所(=白色)のα値を0にします。

dst[mask,3] = 0

これで白色の部分のα値が0になって、透明化されました。

このスクリプトを使えば次のように、白色を透明に変換できます。

おわりに

Web上に無料ソフトなどもありますが、自分でOpenCVを使えれば、複数ファイルの自動処理など、応用の幅が広がりますね。

これまで何冊かOpenCVの本や動画を見てきましたが、基礎から学ぶにはこちらの本がおススメです。

色の処理やフィルタ処理から始まってオブジェクト検出まで網羅的に解説しています。

PythonでのOpenCV初めての一冊にはピッタリかと思いますね。