LoginSignup
6
11

More than 3 years have passed since last update.

【python】画像処理その3 ~NumPy配列~

Last updated at Posted at 2019-11-16

画像を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]

するとこんな感じの画像ができます.

green.PNG

二値化の計算をしてみる

前回のときに二値化の計算をしました.
手順としては以下のようになります. 

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/

6
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
11