
「サイエンティフィック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様にまとめていただいたものが以下に。
画像にフィルタをかけるスクリプト
今回は、レクチャの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()
スクリプトの実行結果
小さい画像サイズだと、フィルタかかっているんだか、かかってないんだか、判然としませんが、Gaussianフィルタはボヤケた感じになっているし、よく見れば違いが分かる?まあ、ヒストグラムはそれぞれ違う。でも考察は無。考察せんのかい。やりっぱなしだな、自分。