plant-raspberrypi3のブログ

ラズベリーパイ3とPythonに挑戦して、植物を愛でたり画像を加工したりします。最近はscikit-imageの勉強してます。

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)

f:id:plant-raspberrypi3:20181007115723p:plain:w350

f:id:plant-raspberrypi3:20181007115734p:plain:w350

平滑化

Gaussianフィルタは平滑化フィルタです。いわゆる「ぼかし」処理。

詳細を読む

原理についてはこちらのページが詳しいです。

algorithm.joho.info

ガウシアンフィルタは、画像の平滑化に使われるフィルタの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)

f:id:plant-raspberrypi3:20181007115811p:plain:w350

f:id:plant-raspberrypi3:20181007115822p:plain:w350

f:id:plant-raspberrypi3:20181007115832p:plain:w350

f:id:plant-raspberrypi3:20181007115839p:plain:w350

エッジファインダ

Sobel、Scharr、Prewitt、Roberts、Laplacianフィルタはエッジをみつけるためのフィルタ群です。

詳細を読む

エッジについては以下のページの説明がわかりやすいです。

エッジ検出

画像のエッジ(edge)とは、画素値が急峻に変化する点です。画素値の変化の大きさを「勾配(Gradient)」や「エッジの強さ」と言います。エッジは物体の輪郭を示す場合が多く、物体認識において重要な要素と言えます。

各フィルタの原理については以下のページを参照。

Sobel, Scharr, Prewitt, Robertsフィルタを使ってみる

詳細を読む

グレースケール画像を使用します。

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)

f:id:plant-raspberrypi3:20181007120607p:plain:w350

f:id:plant-raspberrypi3:20181007120621p:plain:w350

f:id:plant-raspberrypi3:20181007120629p:plain:w350

f:id:plant-raspberrypi3:20181007120640p:plain:w350

f:id:plant-raspberrypi3:20181007120657p:plain:w350

Sobel、Scharr、Prewittフィルタはほとんど同じように見えますが、Robertsフィルタだけ結果が若干違います。

Robertsフィルタは他の3つと原理が異なるので(コチラ参照)、当然の結果と言えそうです。

Laplacianフィルタを使ってみる

詳細を読む

こちらもグレースケール画像を使用。

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)

f:id:plant-raspberrypi3:20181007121340p:plain:w350

f:id:plant-raspberrypi3:20181007121356p:plain:w350

Laplacianフィルタは2次微分に相当します。

Laplacianフィルタでエッジ抽出する - [物理のかぎしっぽ]

Laplacianフィルタの場合、ほとんどの画素値が0付近になり、特に変化の大きいところだけがプラス、マイナスの大きい値として現れます。

画素値のヒストグラムを描くと以下のようになります。

plt.hist(laplace_img.flatten())
plt.savefig("scimage_filters/laplace_hist.png",dpi=150)
plt.show()

f:id:plant-raspberrypi3:20181007122402p:plain:w350

以上です。