NumPy:画像処理で使う【0パディング】の例


サマリ

  • np.pad
    • 元のndarray(NumPy配列)を広げる
    • 広げる時にある数字で満たすことをパディング(padding)と言う
  • ※ここでは画像処理で利用する0パディングに限定

前提

サンプルコード

np.pad(1次元の場合)

元のndarrayの確認

import numpy as np
a = np.random.randint(1,30,5)
print(a)
print(a.shape)
[18 15 28 14  1]
(5,)
  • 1次元のndarray(NumPy配列)を作成

padding実行

b = np.pad(a,1)
c = np.pad(a,2)
print(b)
print(b.shape)
print(c)
print(c.shape)
[ 0 18 15 28 14  1  0]
(7,)
[ 0  0 18 15 28 14  1  0  0]
(9,)
  • 左右に0が付く
  • padding=1の場合
    • 5+(1×2)=7になる
  • padding=2の場合
    • 5+(2×2)=9になる
  • 単純な計算だけど、左右分の2倍されることに注意(よく忘れる)

np.pad(2次元の場合)

元のndarrayの確認

import numpy as np
a = np.random.randint(10,100, 6).reshape(2,3)
print(a)
print(a.shape)
[[18 34 77]
 [97 89 58]]
(2, 3)
  • 表示が見やすくなるように2桁の数字に限定
  • 形状(2,3)のndarray(NumPy配列)を作成
    • 縦方向が2(2行)
    • 横方向が3(3列)

padding=1実行

b = np.pad(a,1)
print(b)
print(b.shape)
[[ 0  0  0  0  0]
 [ 0 18 34 77  0]
 [ 0 97 89 58  0]
 [ 0  0  0  0  0]]
(4, 5)
  • 周囲に0が付く(見た目にはとても分かりやすい)
  • 行方向
    • 2+(1×2)=4になる
  • 列方向
    • 3+(1×2)=5になる
  • それぞれの計算方法は1次元の時と同じことに注意

padding=2実行

c = np.pad(a,2)
print(c)
print(c.shape)
[[ 0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0]
 [ 0  0 18 34 77  0  0]
 [ 0  0 97 89 58  0  0]
 [ 0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0]]
(6, 7)
  • 周囲に0が2つずつ付く
  • 行方向
    • 2+(2×2)=6になる
  • 列方向
    • 3+(2×2)=7になる
  • やっぱり、左右分(上下分)の2倍されることに注意(よく忘れる)

タプル指定するとどうなるか?

d = np.pad(a,((1,2),(3,2)))
print(d)
print(d.shape)
[[ 0  0  0  0  0  0  0  0]
 [ 0  0  0 18 34 77  0  0]
 [ 0  0  0 97 89 58  0  0]
 [ 0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0]]
(5, 8)
  • (1,2)
    • 行方向に伸びる
    • 上に1行
    • 下に2行
  • (3,2)
    • 列方向に伸びる
    • 左に3行
    • 右に2行


Posted by futa