#画像をNumPy配列にする#
まず,下のように画像を読み込んでnp.array
でNumPy配列にします.
import numpy as np
img = np.array(Image.open('画像のパス'))
#次元#
ndim
で次元を調べてみます
print(img.ndim)
出力結果
3
はい,3次元でしたね
#形状#
shape
で形状を見てみます
print(img.shape)
出力結果
(150, 150, 3)
サイズが150×150のカラー画像を読み込んだ時の結果です.
画像をNumPyで扱うときは画像配列は(行データ, 列データ, RGBデータ)
のようになっているんですね.
#スライス#
スライスを使ってRGBデータをみてみたいと思います.
今回はGreenのデータをみてみます.
3番目の要素は3つあって
0番目が赤(Red)のデータ
1番目が緑(Green)のデータ
2番目が青(Blue)のデータ
が入っているので,Greenのデータをとるときは1番目のデータをとります.
:
は全てとってくるって意味です.
したがって, img[:, :, 1]
の意味は
行データを全てとってきて,列データを全てとってきて,2番目のデータをとってくるって感じです.
print(img[:, :, 1])
出力結果
[[138 137 135 ... 102 126 137]
[134 134 133 ... 107 119 114]
[131 131 130 ... 76 53 35]
...
[ 32 33 32 ... 25 30 34]
[ 29 27 28 ... 31 43 53]
[ 27 26 30 ... 44 59 70]]
##Greenだけの画像を表示してみる##
緑以外を0にすれば緑だけの画像になりますよね.
計算はこんな感じです.
img = 0*img[:, :, 0] + img[:, :, 1] + 0*img[:, :, 2]
するとこんな感じの画像ができます.
#二値化の計算をしてみる#
前回のときに二値化の計算をしました.
手順としては以下のようになります.
1.画像をグレースケールにする
2.閾値によって白黒わける
1では以下のように画像をグレースケールにしました
img = np.array(Image.open('lena.jpg').convert('L'), 'f')
この段階で次元が3で形状が(150,150,3)
だったカラー画像が
次元が2で形状が(150,150)
のグレースケールの画像になります.
2では以下のようにして二値化しました.
img = (img > 128) * 255
配列の要素全てに対して値が128を超えていたら白(255)にします.
まず,(img > 128)
をすると128を超えているところはTrue,そうでないところはFalseが返ってきます.こんな感じです.
[[ True True True ... True True True]
[ True True True ... True True True]
[ True True True ... False False False]
...
[False False False ... False False False]
[False False False ... False False False]
[False False False ... False False False]]
Pythonのbool型はint型のサブクラスなのでTrue = 1, False = 0
みたいに扱えます.
なので* 255
で全ての要素に255をかけることで二値化できました.
NumPy配列
ってのは便利なもんでこんな簡単に計算できるんですね.素敵ですね.
#参考#
・https://www.sejuku.net/blog/44850
・https://note.nkmk.me/python-numpy-ndarray-ndim-shape-size/
・https://code-graffiti.com/numpy-array-and-images-in-python/