ユーニックス総合研究所

  • home
  • archives
  • python-pillow-image-effect-noise

PythonのPillowのImage.effect_noiseでガウシアンノイズを生成

  • 作成日: 2020-10-01
  • 更新日: 2023-12-24
  • カテゴリ: Python

PillowのImage.effect_noiseの使い方

Pythonの画像処理ライブラリであるPillowには画像を処理するImageモジュールがあります。
Imageモジュールはガウシアンノイズを生成する関数effect_noise()を持っています。

この関数を使うと、簡単にガウシアンノイズを生成することが出来ます。

ガウシアンノイズとは?

ガウシアンノイズの特徴は、正規分布(ガウス分布)と等しい確率密度関数を持つ統計的雑音であるということです。

🦝 < 確率密度・・・統計的・・・

🐭 < 気をしっかり持て

デジタル画像においては、画像の取得中に、照明が不十分であったり高温であったりすることに起因して電子回路ノイズが発生することがあります。
環境が悪いとカメラの中でノイズが発生しやすくなるということですね。
Image.effect_noise()はこのガウシアンノイズを人工的に発生させるものです。

Image.effect_noiseの構造

Image.effect_noiseは↓のような構造を持っています。

PIL.Image.effect_noise(size, sigma)  

引数と返り値の説明は↓の通りです。

size(第1引数)

sizeは生成する画像のサイズのタプルです。
タプルの第1要素には横幅、第2要素には高さを渡します。
つまり(width, height)のようなフォーマットになります。

sigma(第2引数)

sigmaにはノイズの標準偏差の値を指定します。
この値が大きいほどノイズは荒くなり、値が小さいとノイズは細かくなります。

返り値

返り値はImageオブジェクトです。

ノイズを生成する

横幅500px, 高さ500pxのガウシアンノイズを施した画像を生成します。
sigmaの値は100です。

from PIL import Image  

# ガウシアンノイズの画像を生成  
noise_im = Image.effect_noise((500, 500), 100)  

# 画像を保存  
noise_im.save('dst/out0.png')  

出力結果。

ノイズが画面全体にまんべんなく広がっているのがわかります。

目の細かいノイズを生成する

sigmaの値を20ぐらいにすると目の細かいノイズの画像が生成されます。

from PIL import Image  

# ガウシアンノイズの画像を生成  
noise_im = Image.effect_noise((500, 500), 20)  

# 画像を保存  
noise_im.save('dst/out0.png')  

出力結果。

ちなみにsigma0にすると↓のようにノイズが生成されなくなります。

ノイズ画像とイラストを合成する

このイラストの画像とノイズを合成したいと思います。
合成するにはイラストの画像を開き、次にノイズの画像を生成します。
このとき、2つの画像のモードが同じでないと乗算処理でエラーが出るので、convertメソッドで画像のモードをRGBに統一しておきます。

それからImageChops.multiply()を使って2つの画像を乗算合成します。
合成した画像をファイルに保存すれば完了です。

from PIL import Image, ImageChops  

# イラストの画像を開き、モードをRGBに変換  
illust_im = Image.open('img/a.png').convert('RGB')  

# ガウシアンノイズを生成し、モードをRGBに変換  
noise_im = Image.effect_noise((500, 500), 100).convert('RGB')  

# イラストとのノイズを乗算して合成する  
result_im = ImageChops.multiply(illust_im, noise_im)  

# 画像を保存  
result_im.save('dst/out3.png')  

出力結果。

ちなみに合成方法をスクリーンにすると

result_im = ImageChops.screen(illust_im, noise_im)  

↓のようになります。

ソースコードの分析

Image.effect_noise()のコードを辿ると最終的にC言語で書かれたモジュールに辿り着きます。
関数ImagingEffectNoise()がガウシアンノイズを生成している関数です。
このコードを見ると、Image.effect_noise()はデフォルトでL(8ビットピクセル)モードで画像を生成しているのがわかります。

自力でガウシアンノイズを生成してみたい人は参考にされてみてはいかがでしょうか。

問題

Q1: Image.effect_noise()の第1引数として適当なものを答えよ

  1. 100
  2. (100, 100)
  3. (100, 100, 100)

Q2: Image.effect_noise()の第2引数として適当なものを答えよ

  1. tuple
  2. int
  3. list

Q3: Image.effect_noise()の返り値として適当なものを答えよ

  1. list
  2. dict
  3. Image

正解はこちら↓

Q1: 2
Q2: 2
Q3: 3