ソフトな忘却力(105) SciPy.ndimage で画像フィルタのお勉強

Joseph Halfmoon

「サイエンティフィックPythonのための」IDE、Spyder上にてScientific Python Lecturesの実習中。前回は画像の拡大縮小、シフト、回転といったアリガチな操作を練習。今回は画像をフィルタしてみます。これまた定番のフィルタどもなんだけれども。でも素のままでは芸がない?しかたがない?

※「 ソフトな忘却力」投稿順 Index はこちら

Scientific Python Lectures様のコースは例題だけでなく、エクササイズなども充実、それを全部順番に解いていったら必ずや立派な人になれるだろ~と思います。でも老い先短い年寄には量が多過ぎて多分死ぬまでに終わりません。適当な練習でお茶を濁してます。今回の「お勉強」は「5.10 Image manipulation: scipy.ndimage」の「5.10.2 Image filtering」です。

画像のフィルタリング

最近、ネットで見る動画とか静止画は「AI生成」であったり、実際の人物であっても「盛られている」らしき画像が大半ではないかと思われます。まあこれもしかたがない。。。さて、昔の画像のフィルタリングは、それほど過激に「盛ったり」する目的ではなく、ノイズをちょっと消してといった操作であったような気がします。今回使用してみる3種類のフィルタについて、Googleの生成AI、Gemini 2.5 Flash様にまとめていただいたものが以下に。geminiFilterEC

画像にフィルタをかけるスクリプト

今回は、レクチャのExampleコードをチョイ変で上記の3種類のフィルタをかけてます。Exampleコードで使っている face という関数で呼び出せるタヌキみたいな動物のご尊顔が可愛いかったからです。そのままフィルタをするだけだと、あまりに芸がないので、Excersizeでヒストグラムとれ、というご指示もあったので、テキトーにヒストグラムも描いてみてます。

オリジナルのface画像にノイズを載せたものを入力として、3種類のフィルタをかけてます。コードが以下に。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Scientific Python Lectures example code, P.269

modified by J. Halfmoon
histgram added.
"""
import numpy as np
import matplotlib.pyplot as plt
import scipy as sp

def showFace(face, title):
    plt.imshow(face, cmap="gray")
    plt.axis("off")
    plt.title(title)   

def plotHist(face, title):
    plt.hist(face, bins=50, range=(0, 300), density=True)
    plt.title(title)

def main():
    face = sp.datasets.face(gray=True)[:512, -512:]
    rng = np.random.default_rng()
    noisy_face = np.copy(face).astype(float)
    noisy_face += face.std() * 0.5 * rng.standard_normal(face.shape)
    blurred_face = sp.ndimage.gaussian_filter(noisy_face, sigma=3)
    median_face  = sp.ndimage.median_filter(noisy_face, size=5)
    wiener_face  = sp.signal.wiener(noisy_face, (5, 5))
    
    plt.figure(figsize=[12.8,4.8])

    plt.subplot(241)
    showFace(noisy_face, "noisy")   
    plt.subplot(242)
    showFace(blurred_face, "Gaussian")
    plt.subplot(243)
    showFace(median_face, "median")
    plt.subplot(244)
    showFace(wiener_face, "Wiener")

    plt.subplot(245)
    plotHist(noisy_face, "hist, Noisy")
    plt.subplot(246)
    plotHist(blurred_face, "hist, Gaussian")
    plt.subplot(247)
    plotHist(median_face, "hist, median")
    plt.subplot(248)
    plotHist(wiener_face,"hist, Wiener")

    plt.tight_layout()
    plt.show()

if __name__ == '__main__':
    main()
スクリプトの実行結果

フィルタ結果の画像が以下に。ndimageFilterSample

 

小さい画像サイズだと、フィルタかかっているんだか、かかってないんだか、判然としませんが、Gaussianフィルタはボヤケた感じになっているし、よく見れば違いが分かる?まあ、ヒストグラムはそれぞれ違う。でも考察は無。考察せんのかい。やりっぱなしだな、自分。

ソフトな忘却力(104) SciPy.ndimage で静止画像の変形のお勉強 へ戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です