Python - NumPyで画像を配列として取得する
from PIL import Imagefrom numpy import *
im = array(Image.open('img.jpg').convert('L'))print(im.shape, im.dtype)print(im)(533, 800) uint8 [[156 159 162 …, 135 132 130] [156 155 155 …, 133 132 133] [155 153 155 …, 134 133 131] …, [ 87 88 85 …, 71 71 70] [ 86 87 87 …, 70 72 73] [ 89 95 95 …, 74 73 73]]
と表示される。最初の行のタプルは、(行数、列数、色数)を表してる。上記はグレースケールに変換しており、その場合は、色数は表示されない。uint8は、要素のデータ型。通常、画像は符号なし8ビット整数で符号化されるらしい。im自体を出力したら上記のような配列が表示された。
im = array(Image.open('img.jpg'))print(im.shape, im.dtype)これだとグレースケール変換していないので、下記のように色数も表示される。赤、緑、青という並びなんだろうか。 (533, 800, 3) uint8
im = array(Image.open('img.jpg'))print(im)これだと、色が3色があるので、配列は下記のようになっている。
[[[150 156 178] [153 159 181] [154 162 183] …, [121 137 163] [119 134 163] [116 131 162]]
[[148 156 177] [149 155 177] [149 155 177] …, [119 135 161] [118 134 160] [119 134 165]]
[[147 155 176] [147 153 175] [149 155 177] …, [120 136 162] [119 135 161] [118 132 167]]
…, [[ 88 88 86] [ 88 89 84] [ 86 86 84] …, [ 72 71 76] [ 72 71 76] [ 71 70 75]]
[[ 87 87 85] [ 87 88 83] [ 88 88 86] …, [ 69 70 74] [ 71 72 76] [ 72 73 77]]
[[ 91 90 86] [ 97 96 92] [ 96 95 93] …, [ 73 74 78] [ 72 73 77] [ 72 73 77]]]
色を反転させて保存する
これはhtmlでつかってる0-255の数字と一緒であります。各数値を255から引くことで色を反転させることができます。
from PIL import Imagefrom numpy import *
im = array(Image.open('img.jpg'))Image.fromarray(255 - im).save('img2.jpg')下記のようになりました。
配列から画像を作ってみる
下記のようにすると、白から黒に向けたグラデーションになる。[赤、緑、青]なので、赤を全部0にすると、青緑の薄いから濃いのグラデーションになる。
from PIL import Imageimport numpy as np
a = np.array([ [ [230,230,230],[210,210,210],[190,190,190],[170,170,170],[150,150,150] ], [ [230,230,230],[210,210,210],[190,190,190],[170,170,170],[150,150,150] ], [ [230,230,230],[210,210,210],[190,190,190],[170,170,170],[150,150,150] ], [ [230,230,230],[210,210,210],[190,190,190],[170,170,170],[150,150,150] ], [ [230,230,230],[210,210,210],[190,190,190],[170,170,170],[150,150,150] ],])
Image.fromarray(np.uint8(a)).save('img2.jpg')
for row in a: for col in row: col[0] = 0
Image.fromarray(np.uint8(a)).save('img3.jpg')

