つれづれなる備忘録

日々の発見をあるがままに綴る

OpenCVの使い方10 ~ ぼかしフィルタ

 今回はOpenCVを用いて画像にぼかし・ローパスフィルタ処理の方法について紹介する。

1. 画像読み込み

 Google Colab上での画像読み込みの手順は以下の通り。ローカルで実行する場合はcv2.imreadで読み込む画像ファイルパスを指定すればよい

サンプル画像読み込み

import cv2
import numpy as np
from matplotlib import pyplot as plt
from google.colab import files
uploaded_file = files.upload()
uploaded_file_name = next(iter(uploaded_file))
orig = cv2.imread(uploaded_file_name)
src = cv2.cvtColor(orig, cv2.COLOR_BGR2RGB)
plt.imshow(src)

今回はいつも使用している桃の花の画像をサンプルとして使用する。

"サンプル画像"
サンプル画像

2. 平均化フィルタ

 いくつか代表的なぼかしフィルタの適用方法を紹介する。平均化フィルタは指定された区域の平均値を出力するフィルタで、cv2.blur(画像, (kx,ky))を用いる。 kx,kyは平均化するピクセル数を指定し、数が大きいほど強いぼかし効果が得られる。

blur1 = cv2.blur(src,(5,5))
blur2 = cv2.blur(src,(10,10))
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.imshow(blur1)
plt.subplot(1,2,2)
plt.imshow(blur2)

左側は5x5ピクセル、右側は10x10ピクセルでの平均化フィルタをサンプル画像に適用したが、右側の方が強くぼけていることがわかる。

"blurフィルタの効果"
blurフィルタの効果

3. ガウシアンフィルタ

 次にガウシアンフィルタは、区域内の画素を中心から重みを付けるフィルタでcv2.GaussianBlur(画像, (kx,ky),sigmaX,sigmaY)を用いる。sigmaX,sigmaYは重みをつける際のガウス関数のX方向、Y方向の標準偏差の値で0を指定するとXY共通で自動計算される。なお領域のピクセル数は奇数である必要がある。

gauss1 = cv2.GaussianBlur(src,(11,11),0)
gauss2 = cv2.GaussianBlur(src,(11,11),1,1)
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.imshow(gauss1)
plt.subplot(1,2,2)
plt.imshow(gauss2)

左側は領域を11x11ピクセル標準偏差を0にして自動計算したもの、右側はX,Y方向の標準偏差を1に指定している。標準偏差を小さめに指定すると同じ領域でもぼけが弱くなることがわかる。

"ガウシアンフィルタの効果"
ガウシアンフィルタの効果

4. メディアンフィルタ

 メディアンフィルタは領域内の中央値を適用するフィルタで、平均化やガウシアンは画素の演算値を出力していたが、メディアンフィルタは中央値を選択してして出力している。 メディアンフィルタcv2.medianBlur(画像,サイズ)でサイズは正方領域の奇数のピクセル数を指定する。

median1 = cv2.medianBlur(src,5)
median2 = cv2.medianBlur(src,11)
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.imshow(median1)
plt.subplot(1,2,2)
plt.imshow(median2)

左側は領域を5ピクセル、右側は領域を11ピクセルに指定していて、右側の方がよりぼけていることがわかる。

"メディアンフィルタの効果"
メディアンフィルタの効果

5. バイラテラルフィルタ

バイラテラルフィルタは、エッジ部を維持して画像をぼかすことに特徴があるフィルタでcv2.bilateralFilter(画像,領域,sigmaColor,sigmaSpace)を用いる。領域は円の直径を意味し、sigmaColorは混色の調整、sigmaSpaceは距離に応じた重みづけを調整する。

bilat = cv2.bilateralFilter(src,25,75,75)
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.imshow(src)
plt.subplot(1,2,2)
plt.imshow(bilat)

以下左側は元画、右側はバイラテラルフィルタを適用した画像を示す。花びらの輪郭はぼけていないのでフィルタがかかっていることがわかりづらいが、後ろの草などの背景は確かにぼけていることが確認できると思う。

"バイラテラルフィルタの効果"
バイラテラルフィルタの効果

6. まとめ

 今回はOpenCVを用いたぼかしフィルタの適用方法と効果について紹介した。