【Python】画像へのモザイク処理・ぼかし処理【PIL】

画像のモザイク処理・ぼかし処理についての説明図

このページにはプロモーションが含まれています

このページでは、Python で画像にモザイクをかける方法と画像をぼかす方法について解説していきます。

モザイク処理とぼかし処理の説明図

特に画像のぼかしに関してはフィルタリングなどを行なう本格的な方法もあるのですが、このページで紹介するのは簡易的な方法のものになります。また、今回は画像全体に対してモザイク処理・ぼかし処理を行なう例を示していきます。

このような簡単なモザイクや画像のぼかしであれば、PIL パッケージのみを利用して実現することが可能です。

MEMO

このページの猫の画像はリズム727さんによる写真ACからの写真を使用させていただいています

モザイク処理とぼかし処理

では、画像へのモザイク・ぼかしの実現方法について解説していきます。

モザイク処理とぼかし処理の実現方法

画像へのモザイク処理も、画像へのぼかし処理も、実はほとんど同じ考え方で実現可能です。

画像を縮小した後、縮小後の画像を元の画像サイズまで拡大を行います。基本的にはこれだけで、画像へのモザイク処理 or ぼかし処理が実現できることになります。画像を縮小する際、画像を小さくすればするほどモザイクやぼかしが強くなり、元画像を推測しにくくなります。

画像へのモザイクの書け方の説明図

画像にモザイクをかけるのか、画像をぼかすのかは、拡大時に使用する補間アルゴリズムによって決定することができます。

具体的には、画像にモザイクをかける場合は補間アルゴリズムとして最近傍補間(Nearest Neighbor)を使用します。画像をぼかしたい場合は補間アルゴリズムとして双線形補間(Bi-linear)等を使用します。今回は双線形補間の例で説明していきますが、最近傍補間でなければ、基本的に画像のぼかし処理を実現できると思います。

補間アルゴリズムによってモザイク処理orぼかし処理のどちらになるかが決まる様子

画像全体へのモザイクやぼかしを実現するのであれば、これだけで実現可能です。特にぼかしに関しては、ぼかし用の関数が OpenCV には用意されているため、本格的なぼかしを行いたい場合は OpenCV を利用することをお勧めします。とりあえず簡単なぼかしで良いのであれば、今回紹介する方法でも実現は可能です。

スポンサーリンク

画像へのモザイク・ぼかしの実装

前述の通り、画像の縮小と拡大で画像へのモザイク処理もぼかし処理も実現でき、画像の縮小と拡大は PIL の Image クラスにおける resize メソッドで実現可能です。

したがって、PIL を利用すれば、下記のような処理の流れでモザイク処理とぼかし処理を実現することが可能です。

  • Image.open で画像オブジェクトを生成する
  • 画像オブジェクトに resize を実行させて画像を縮小する
  • 画像オブジェクトに resize を実行させて画像を拡大する

resize を実行する際には、リサイズ後の画像サイズを指定する必要があります。縮小する際には小さな画像サイズ、拡大する際には元の画像サイズを指定します。

また、モザイク処理を行いたい場合は、resize で画像を拡大させる際に resample 引数として Image.Nearest を追加して補間アルゴリズムとして最近傍補間を指定する必要があります。ぼかし処理を行いたい場合は resample 引数に Image.BILINEAR を指定します(resample を指定しなかった場合は Image.BICUBIC がデフォルト設定として指定されることになり、この場合も画像をぼかすことができます)。

ということで、画像へのモザイク処理とぼかし処理を行うソースコードは下記のようなものになります。file_path にはモザイク処理・ぼかし処理を行いたい画像のファイルパスを指定してください。intensity を強くすると、モザイクの大きさや、ぼかしの強さを変化させることができます。

モザイク・ぼかし
from PIL import Image

file_path = 'image1.png'
intensity = 20

original = Image.open(file_path)

# 画像サイズをintensity分の1に縮小
small = original.resize(
    (round(original.width / intensity), round(original.height / intensity))
)

# 元画像のサイズに拡大してモザイク処理
mosaic = small.resize(
    (original.width,original.height),
    resample=Image.NEAREST # 最近傍補間
)

# 元画像のサイズに拡大してぼかし処理
blur = small.resize(
    (original.width,original.height),
    resample=Image.BILINEAR # 双線形補間
)

# 画像の表示
original.show()
mosaic.show()
blur.show()

例えば、最初の Image.open で下図のような画像を開いた際には、

加工前の画像

モザイク処理後の画像として下図のような画像が、

モザイク後の画像

ぼかし処理後の画像として下図のような画像が表示されることになります。

ぼかし後の画像

intensity を変更すれば、モザイクの荒さや、ぼかしの強度が変化することも確認できると思います。下図は intensity20 の時と 50 の時のモザイク処理後の画像を比較したものになります。

パラメータの変更によりモザイクの荒さが変化する様子

この intensity の設定値に関しては正解はなく、画像や好みに合わせて適当な値に設定していただければと思います。

モザイク処理・ぼかし処理の原理

最後に、画像の縮小と拡大によってモザイク処理・ぼかし処理が実現できる理由について簡単に説明しておきます。伝えたいのはモザイク処理・ぼかし処理を実現できる理由のイメージなので、あまり詳細な説明はしていませんが、それでもこれらが実現できる理由はなんとなく理解していただけると思います。

まず、画像とは「色のついた点」の集まりです。この色のついた点を画素と呼びます。画像ビューワー等で画像をどんどん拡大していけば、たくさんの画素が集まって画像が形成されていることが確認できると思います。

画像が画素の集まりであることを示す図

画像の縮小とは、この画素を間引いて画素数を減らすことを言います。例えば下の図の画像を使って画像の縮小について考えていきましょう!各四角が画素を表しており、この図は9画素 x 9画素の画像を表したものになります。

画像のモザイク化を説明するための画像

そして、下の図は元々の画像から太枠の部分以外を間引いて3画素 x 3画素の画像に縮小する例になります。

画像の縮小の説明図

さらに、画像の拡大とは、画素と画素の間に新たな画素を追加することを言います。下の図は、先ほど縮小して作成した画像に画素を追加し、元々の画像と同じ画素数の9画素 x 9画素に拡大した画像となります。

画像の拡大の説明図

ただ、この時に新たに追加する画素の色は拡大前の画像には存在しません。縮小前の画素には存在していますが、これらは間引いて捨てられているので、これらの画素を参考にすることもできません。そのため、追加する画素の色は推測して設定する必要があります。

このように、間に新たな要素を追加し、この要素の値を推測して設定することを補間と呼びます。そして、この補間時の推測の仕方を補間アルゴリズムと呼びます。画像の場合、要素が「画素」となり、推測する値が「画素の色」ということになります。

補間アルゴリズムが最近傍補間である場合、追加した画素の色は、拡大前の画像に存在している画素の中から追加した画素に一番近い位置の色に設定されます。

最近傍補間の説明図

そのため、先ほど示した縮小後の画像を拡大した場合、各画素は下の図のように設定されます。

最近傍補間で拡大を行なった結果の例

つまり、最近傍補間を補間アルゴリズムとした場合、追加された画素が近くの画素と同じ色に設定されるため、画像の一部一部が同じ色で塗りつぶされる形で画像が拡大されることになります。そのため、画像にモザイクをかけたような見た目になります。同じ倍率で縮小・拡大を行う場合は、この倍率が大きければ大きいほど、同じ色で塗りつぶされる領域が大きくなるので(補間が必要な画素が多くなるので)、モザイクが荒く見えるようになります。この倍率が、前述で示したソースコードにおける intensity となります。

それに対し、補間アルゴリズムが双線形補間である場合、追加された画素の色は、拡大前の画像に存在していた画素間で線形的に変化していくように設定されます。

双線形補間の説明図

上の図では1次元的に並んでいる画素に対する補間を行なっていますが、実際には2次元的に並んでいる画素に対して補間を行うことになります。が、その場合でも考え方は同じです。

このような補間を行なった場合、画像内の各画素間の色は滑らかに変化するようになり、画像の見た目としては若干ぼやけたように見えることになります。画像の拡大時の倍率が極端に大きくなければ気にならないのですが、倍率が大きければ大きいほど見た目がぼやけたように見えます。

例えば、上記のソースコードでは、画像の拡大時の倍率を 20 に設定しているため、画像が明らかにぼやけて見えるようになっています。このように、画像がぼやけて見えることを利用してぼかし処理を実現しています。

まとめ

このページでは、Python で PIL を用いた画像へのモザイク処理・ぼかし処理の実現方法について解説しました!

どちらも画像を縮小した後に元のサイズへ拡大することで実現することが可能です。そして、画像拡大時の補間アルゴリズムに最近傍補間を用いた場合にはモザイク処理を実現することが可能となります。

元々の画像の雰囲気を残しながら情報を隠すという意味で、モザイク処理やぼかし処理は便利だと思います。ただ、AI や機械学習が発達した今では、モザイクの荒さやぼかしの強度によっては元の画像が復元される可能性もあるため、情報をとにかく隠したいのであれば、透明度なしの白色や黒色で隠したい情報をベタ塗りすることをオススメします。

また、今回は画像全体に対してモザイク処理・ぼかし処理を行いましたが、画像の一部のみを縮小・拡大することで特定の部分のみに対してモザイク処理・ぼかし処理を行うようなことも可能です。

実際に、Python の tkinter を利用した “選択範囲のみ” に対してモザイク処理・ぼかし処理を行うアプリの作り方の解説を下記で行っていますので、興味のある方は是非読んでみてください!

【Python/tkinter】画像のモザイク化アプリの作り方【選択範囲のみのモザイク化】

同じカテゴリのページ一覧を表示