
「サイエンティフィックPythonのための」IDE、Spyder上にてScientific Python Lecturesの実習中。前回はフィルタ(LPF)に音声っぽい?信号を通してみました。今回からは2次元の画像です。まずは画像の拡大縮小、シフト、回転といった基礎的な操作を練習。この辺は出来て当然。でもn次元って何?
※「 ソフトな忘却力」投稿順 Index はこちら
※Scientific Python Lectures様のコースは例題だけでなく、エクササイズなども充実、それを全部順番に解いていったら必ずや立派な人になれるだろ~と思います。でも老い先短い年寄には量が多過ぎて多分死ぬまでに終わりません。適当な練習でお茶を濁してます。今回の「お勉強」は「5.10 Image manipulation: scipy.ndimage」の「5.10.1 Geometrical transformations on images」です。
画像の幾何学的操作
お惚け老人は、画像については、泣く子も黙るOpenCVという金字塔的ライブラリ?があるので、そこを探せば何でもあるだろ~という印象もってます。実際、各種処理系のツールキットなどでも下敷きになっているのはOpenCVだったりします。別シリーズ「手習ひデジタル信号処理」でも画像、映像の処理でIPCVという「ツールキット」にお世話になりましたが、これの裏ではOpenCVが蠢いてました。
一方、SciPyの場合、ndimageという御名前からは「n次元」のイメージを処理するのだ、という強い意思?が感じとれます。なんか複雑な計算になりそ~。そしてそもそもの設計思想も異なるようです。しかし、OpenCVと機能的に重なる部分もあり、重ならない部分もありみたい。どちらもPythonから呼び出して使えるし、NumPy配列にデータを詰めておけるので、適切に使い分け、相互運用しろ、ってこってしょうか?
さて今回は「機能的には重なりそうな」初歩の初歩部分。画像を拡大縮小、位置をずらしたり、回転したりという基本操作っす。SciPyのマニュアル的には以下のところです。
画像を拡大、シフト、回転するスクリプト
以下は、SciPyに含まれる画像を使って、上記のような操作をしてみるサンプルです。通り一遍、お茶を濁しただけ。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Tue Jul 8 2025 @author: jhalfmoon NDimage sample """ import matplotlib.pyplot as plt import scipy as sp def main(): fig = plt.figure(figsize=[12.8,4.8]) ax1, ax2, ax3, ax4 = fig.subplots(1, 4) orgImg = sp.datasets.ascent() z2 = sp.ndimage.zoom(orgImg, 1.5) s50 = sp.ndimage.shift(orgImg, (0, 50)) r45 = sp.ndimage.rotate(orgImg, 45, reshape=True) ax1.imshow(orgImg) ax2.imshow(z2) ax3.imshow(s50) ax4.imshow(r45) plt.tight_layout() plt.show() if __name__ == '__main__': main()
スクリプトの実行結果
実行結果のグラフが以下に。左から、
-
- オリジナルの画像
- 1.5倍ズームした画像
- 右にシフトした画像
- 左に45度回転させた画像
プロットの都合で同じサイズに押し込めてプロットしてあるので、一番左のオリジナルとその隣の1.5倍ズームはまったく同じ画像に見えますが、周囲の座標表示のスーケールが異なるので、画像がデカくなってるのが分かるかと思います。
この手の幾何学的な変形は当然できると。当たり前か。