Update 2023.11.14 2018.11.07

科学技術計算 画像の幾何学的変換(lena)
Python3(3.10)で動くソースコード(.pyファイル .ipynbファイル)あります
「anaconda3」on .py「PyCharm」.ipynb「Jupyter Notebook」

課題 画像の幾何学的変換(lena)
超有名な画像 lena を読み込み,
トリミング,シフト,回転,ズーム,マスクなどの変換処理をしなさい.
for文や if文を使わないようにしよう.

(2023-11-14)Python3.10で動作確認済み

【オリジナル画像 lena 】
画像を扱うときはimportするライブラリを間違わないようにする.
多くのWebの例では超有名なlena()という関数から入力するが,この例では普通に画像を読み込む.この画像は lena() を読み込んでから書き出したものである.
モノクロ画像を読み込みしたり加工したりすると疑似カラー画像になってしまうので明示的にモノクロを指定する.

【トリミング 】
上下左右を50pxずつトリミングした.shape で確認したところ実際に小さくなっているの確認できた.
上下左右とも違う数値を指定することができる.

【シフト 】
右へ50px,下へ50px シフトした.画像の大きさは変わっていない.
右と下をトリミングしたのと同じ効果になる.

【回転 】
反時計方向へ30度回転した.
画像全体が少し大きくなっているが人物が映っている部分が元の大きさというわけでもない.

【ズーム 】
2倍に引き伸ばした.
画像の画素数を変更するときは再サンプリングの演算があるのが普通であるが,ここでどのような変換をしているのかは不明である.

【ロケット 】
上の例はすべて1行のコードで変換できているが,この例はマスクという手法で演算している.
2次元配列をつくってそれから円の外側が True となる mask をつくる.
画像arrayの円の外側を mask と比較しながら 0 にする.この演算が lena[mask] = 0 だけでできてしまう.
今までの画像の変換のプログラムで for文や if文が一切使われていないことに気付いただろうか.これが Python のすごいところである.

◆◆ソースコード◆◆

このWebページの左上隅からダウンロードできます。

ソースファイルは3つです(含む画像)。
・lena.py;科学技術計算 画像の幾何学的変換(lena)
・lena.png
・lenacolor.png

【lena.py】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# -*- coding: utf-8 -*-
# 画像の幾何学的変換(lena)
import numpy as np
from matplotlib import pyplot as plt
from scipy import ndimage

# モノクロ画像を読み込む
lena = plt.imread('lena.png')
print(type(lena))
# <class 'numpy.ndarray'>
print(lena.shape)
# (512, 512)
plt.imshow(lena)
plt.show()

# 疑似カラーになっているのでモノクロに戻す
plt.imshow(lena, cmap=plt.cm.gray)
plt.show()

# トリミング(50px)
lena_trim = lena[50:-50,50:-50]
plt.imshow(lena_trim, cmap=plt.cm.gray)
plt.show()
plt.imsave('lena_trim.png', lena_trim, cmap=plt.cm.gray)

# シフト(50px)
lena_shift = ndimage.shift(lena,(50, 50))
plt.imshow(lena_shift, cmap=plt.cm.gray)
plt.show()
plt.imsave('lena_shift.png', lena_shift, cmap=plt.cm.gray)

# 回転
lena_rotate = ndimage.rotate(lena, 30)
plt.imshow(lena_rotate, cmap=plt.cm.gray)
plt.show()
plt.imsave('lena_rotate.png', lena_rotate, cmap=plt.cm.gray)

# ズーム
lena_zoom = ndimage.zoom(lena, 2)
print(lena_zoom.shape)
# (1024, 1024)
plt.imshow(lena_zoom, cmap=plt.cm.gray)
plt.show()
plt.imsave('lena_zoom.png', lena_zoom, cmap=plt.cm.gray)


# locket
y, x = np.ogrid[0:512,0:512] # x and y indices of pixels
print(y.shape, x.shape)
#  ((512, 1), (1, 512))
centerx, centery = (256, 256) # center of the image
mask = ((y - centery)**2 + (x - centerx)**2) > 230**2 # circle

lena[mask] = 0
plt.imshow(lena, cmap=plt.cm.gray)
plt.show()
plt.imsave('lena_locket.png', lena, cmap=plt.cm.gray)

トップページに戻る
inserted by FC2 system