Pynote

Python、機械学習、画像処理について

Pillow (PIL) - 画像にフィルタを適用する方法

Image.filter

Image.filter(filter)
  • 引数
  • 返り値
    • フィルタを適用した結果

入力画像

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

# フィルタを適用する。
dst = img.filter(filter=ImageFilter.BLUR)

各フィルタの情報はフィルタオブジェクトの filterargs で取得できる。

def print_filter_info(filter):
    import numpy as np
    size, scale, offset, kernel = filter.filterargs
    print(f"[{filter.name}]")
    print("kernel size", size)
    print("scale", scale)
    print("offset", offset)
    print("kernel")
    print(np.array(kernel).reshape(size))
    
print_filter_info(ImageFilter.BLUR)

ぼかす (ImageFilter.BLUR)

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.BLUR)

print_filter_info(ImageFilter.BLUR)
# [Blur]
# kernel size (5, 5)
# scale 16
# offset 0
# kernel
# [[1 1 1 1 1]
#  [1 0 0 0 1]
#  [1 0 0 0 1]
#  [1 0 0 0 1]
#  [1 1 1 1 1]]

出力画像

輪郭抽出 (ImageFilter.CONTOUR)

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.CONTOUR)

print_filter_info(ImageFilter.CONTOUR)
# [Contour]
# kernel size (3, 3)
# scale 1
# offset 255
# kernel
# [[-1 -1 -1]
#  [-1  8 -1]
#  [-1 -1 -1]]

出力画像

エッジ強調 (ImageFilter.DETAIL)

4方向のエッジを強調する。

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.DETAIL)

print_filter_info(ImageFilter.DETAIL)
# [Detail]
# kernel size (3, 3)
# scale 6
# offset 0
# kernel
# [[ 0 -1  0]
#  [-1 10 -1]
#  [ 0 -1  0]]

出力画像

エッジ強調 (ImageFilter.EDGE_ENHANCE)

8方向のエッジを強調する。

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.EDGE_ENHANCE)

print_filter_info(ImageFilter.EDGE_ENHANCE)
# [Edge-enhance]
# kernel size (3, 3)
# scale 2
# offset 0
# kernel
# [[-1 -1 -1]
#  [-1 10 -1]
#  [-1 -1 -1]]

出力画像

エッジ強調 (ImageFilter.EDGE_ENHANCE_MORE)

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.EDGE_ENHANCE_MORE)

print_filter_info(ImageFilter.EDGE_ENHANCE_MORE)
# [Edge-enhance More]
# kernel size (3, 3)
# scale 1
# offset 0
# kernel
# [[-1 -1 -1]
#  [-1  9 -1]
#  [-1 -1 -1]]

出力画像

エンボス (ImageFilter.EMBOSS)

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.EMBOSS)

print_filter_info(ImageFilter.EMBOSS)
# [Emboss]
# kernel size (3, 3)
# scale 1
# offset 128
# kernel
# [[-1  0  0]
#  [ 0  1  0]
#  [ 0  0  0]]

出力画像

輪郭抽出 (ImageFilter.FIND_EDGES)

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.FIND_EDGES)

print_filter_info(ImageFilter.FIND_EDGES)
# [Find Edges]
# kernel size (3, 3)
# scale 1
# offset 0
# kernel
# [[-1 -1 -1]
#  [-1  8 -1]
#  [-1 -1 -1]]

出力画像

シャープネス (ImageFilter.SHARPEN)

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.SHARPEN)

print_filter_info(ImageFilter.SHARPEN)
# [Sharpen]
# kernel size (3, 3)
# scale 16
# offset 0
# kernel
# [[-2 -2 -2]
#  [-2 32 -2]
#  [-2 -2 -2]]

出力画像

平坦化 (ImageFilter.SMOOTH)

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.SMOOTH)

print_filter_info(ImageFilter.SMOOTH)
# [Smooth]
# kernel size (3, 3)
# scale 13
# offset 0
# kernel
# [[1 1 1]
#  [1 5 1]
#  [1 1 1]]

出力画像

平坦化 (ImageFilter.SMOOTH_MORE)

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.SMOOTH_MORE)

print_filter_info(ImageFilter.SMOOTH_MORE)
# [Smooth More]
# kernel size (5, 5)
# scale 100
# offset 0
# kernel
# [[ 1  1  1  1  1]
#  [ 1  5  5  5  1]
#  [ 1  5 44  5  1]
#  [ 1  5  5  5  1]
#  [ 1  1  1  1  1]]

出力画像

ガウシアンフィルタ (ImageFilter.GaussianBlur)

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(ImageFilter.GaussianBlur(radius=3))

出力画像

ボックスフィルタ (ImageFilter.BoxBlur)

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.BoxBlur(radius=3))


アンシャープマスク (ImageFilter.UnsharpMask())

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.UnsharpMask())

出力画像

ランクフィルタ (ImageFilter.RankFilter)

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.RankFilter(size=5, rank=10))

出力画像

メディアンフィルタ (ImageFilter.MedianFilter)

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.MedianFilter(size=5))

出力画像

最小フィルタ (ImageFilter.MinFilter)

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.MinFilter(size=5))

出力画像

最大フィルタ (ImageFilter.MaxFilter)

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.MaxFilter(size=5))
dst

出力画像

最頻値フィルタ (ImageFilter.ModeFilter)

from PIL import Image, ImageFilter

# 画像を読み込む。
img = Image.open("sample.jpg")

dst = img.filter(filter=ImageFilter.ModeFilter(size=5))

出力画像