scikit-imageのお勉強 第6回 filtersモジュール・前編 ~平滑化、エッジファインダ~
かなりご無沙汰していたscikit-imageの便利機能の備忘録シリーズの続き。
今回は第6回です。filters
モジュールの前編です。平滑化・エッジファインダについてメモしていきます。
平滑化
filters.gaussian
Gaussianフィルタ
エッジファインダ
filters.sobel
Sobelフィルタfilters.scharr
Scharrフィルタfilters.prewitt
Prewittフィルタfilters.roberts
Robertsフィルタfilters.laplace
Laplacianフィルタ
準備
前回までと同じようにサンプル画像のロケットを使用します。 カラー画像とグレースケール画像の両方を準備。
詳細を読む
%matplotlib inline
import matplotlib.pyplot as plt
from skimage import filters, color, data
def image_show(img,title,record=False):
plt.imshow(img)
plt.xticks([])
plt.yticks([])
plt.title(title)
# record=Trueの時タイトルと同名の画像ファイルを保存
if record:
plt.savefig(f"scimage_filters/{title}.png",dpi=150)
plt.show()
rocket = data.rocket()
image_show(rocket,"Raw",record=True)
gray_rocket = color.rgb2gray(rocket)
image_show(gray_rocket,"Gray",record=True)
平滑化
Gaussianフィルタは平滑化フィルタです。いわゆる「ぼかし」処理。
原理についてはこちらのページが詳しいです。 ガウシアンフィルタは、画像の平滑化に使われるフィルタの1つです。考え方は簡単で、「注目画素からの距離に応じて近傍の画素値に重みをかける」ということをガウス分布を利用して行います。それにより、自然な平滑化をおこなうことができます。詳細を読む
Gaussianフィルタを使ってみる
グレースケール画像の場合はデフォルトでOKですが、カラー画像に適用したい場合は
詳細を読む
multichannel=True
を設定します。sigma
の値が大きいほど、ぼかし具合が強くなります。image_show(rocket[300:400,250:400],"Raw_magnified",record=True)
sigmas = range(0,5,2)
for s in sigmas:
gaussian = filters.gaussian(rocket,sigma=s,multichannel=True)
image_show(gaussian[300:400,250:400],f"sigma={s}",record=True)
エッジファインダ
Sobel、Scharr、Prewitt、Roberts、Laplacianフィルタはエッジをみつけるためのフィルタ群です。
エッジについては以下のページの説明がわかりやすいです。 画像のエッジ(edge)とは、画素値が急峻に変化する点です。画素値の変化の大きさを「勾配(Gradient)」や「エッジの強さ」と言います。エッジは物体の輪郭を示す場合が多く、物体認識において重要な要素と言えます。 各フィルタの原理については以下のページを参照。 Sobelフィルタ、Prewittフィルタ、Laplacianフィルタ Sobelフィルタ、Scharrフィルタ、Laplacianフィルタ Sobelフィルタ、Prewittフィルタ、Robertsフィルタ、Laplacianフィルタ詳細を読む
qiita.com
画像の勾配 — OpenCV-Python Tutorials 1 documentation
エッジ検出
Sobel, Scharr, Prewitt, Robertsフィルタを使ってみる
グレースケール画像を使用します。
Sobel、Scharr、Prewittフィルタはほとんど同じように見えますが、Robertsフィルタだけ結果が若干違います。 Robertsフィルタは他の3つと原理が異なるので(コチラ参照)、当然の結果と言えそうです。詳細を読む
filter_names = ("filters.sobel","filters.scharr","filters.prewitt",
"filters.roberts")
filter_tuple = (filters.sobel,filters.scharr,filters.prewitt,
filters.roberts)
image_show(gray_rocket[300:400,250:400],"Raw_gray_magnified",record=True)
for f,name in zip(filter_tuple,filter_names):
filtered_image = f(gray_rocket)
image_show(filtered_image[300:400,250:400],f"{name}_magnified",record=True)
Laplacianフィルタを使ってみる
こちらもグレースケール画像を使用。
Laplacianフィルタは2次微分に相当します。 Laplacianフィルタでエッジ抽出する - [物理のかぎしっぽ] Laplacianフィルタの場合、ほとんどの画素値が0付近になり、特に変化の大きいところだけがプラス、マイナスの大きい値として現れます。 画素値のヒストグラムを描くと以下のようになります。
詳細を読む
image_show(gray_rocket[300:400,250:400],"Raw_gray_magnified",record=True)
laplace_img = filters.laplace(gray_rocket)
image_show(laplace_img[300:400,250:400],f"laplace_magnified",record=True)
plt.hist(laplace_img.flatten())
plt.savefig("scimage_filters/laplace_hist.png",dpi=150)
plt.show()
以上です。