edo1z blog

プログラミングなどに関するブログです

Python - NumPyで画像を配列として取得する

from PIL import Image
from 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 Image
from numpy import *

im  = array(Image.open('img.jpg'))
Image.fromarray(255 - im).save('img2.jpg')

下記のようになりました。

img2

配列から画像を作ってみる

下記のようにすると、白から黒に向けたグラデーションになる。[赤、緑、青]なので、赤を全部0にすると、青緑の薄いから濃いのグラデーションになる。

from PIL import Image
import 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')

img2.jpg img2

img3.jpg img3