画像はピクセルの数の配列
デジタル画像は、ピクセルと呼ぶ小さな点を、縦と横に並べたものです。1つのピクセルは数で表されるので、画像は数の配列として読めます。
この見方ができると、明るさを調べる、傷を探す、物を数えるといった作業を、コードで自動にできます。たとえば検品のカメラは、写真の数を読んで、いちばん明るい点を探します。
このレッスンのゴール
メモ
画像を数の配列として読み、大きさとピクセルの値を取り出せる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| ピクセル | 画像を作る1つの点。1つ以上の数を持つ | |
| 大きさ | 幅と高さ。ピクセルの数で表す | 320 × 240 |
| モード | 1つのピクセルが持つ数の並べ方 | RGB |
| チャンネル | 1つのピクセルが持つ数の1つ。色の成分 | |
| 配列 | 数を行と列に並べた表 | |
| 座標 | ピクセルの場所を示す、行と列の番号 |
学生が入力するセルは、このプレビューでは空白です。
画像は行と列に並んだ数の表
画像は、横に並ぶ列と、縦に並ぶ行でできています。行と列が交わる1点がピクセルです。
幅が320、高さが240の画像には、320 × 240 で 76800 個のピクセルがあります。1つのピクセルが持つ数の並べ方を、モードと呼びます。
モードで1つのピクセルの数が変わる
| モード | チャンネルの数 | 1つのピクセルの例 | 意味 |
|---|---|---|---|
| L | 1 | 158 | グレー。0 が黒、255 が白 |
| RGB | 3 | (197, 157, 62) | カラー。赤、緑、青の強さ |
| RGBA | 4 | (197, 157, 62, 255) | カラーと、透明の度合い |
学生が入力するセルは、このプレビューでは空白です。
ラボの画像を1枚開いて調べる
ラボには、コインを並べた画像 coins.png があります。次のコマンドは、その大きさとモードと、2つのピクセルを表示します。
スクリプトが出す言葉は英語です。size は大きさ、mode はモード、pixel at は、その場所のピクセルです。grey mean は、グレーにしたときの平均の明るさです。
画像の大きさとピクセルを見る
docker exec jupyter python3 steps/look.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力の数の読み方
大きさは 320 と 240、モードは RGB です。10, 10 のピクセルは (35, 35, 35) で、ほぼ黒の背景です。50, 50 は (197, 157, 62) で、コインの金色です。
グレーの平均は 57.6 です。画像の大部分が暗い背景だからです。
ピクセルの場所は行と列で指す
数の配列では、ピクセルを grid[行][列] で取り出します。番号は 0 から数え、行は上から、列は左から数えます。
Pillow の getpixel は、順番が逆です。getpixel((x, y)) は、列、行の順に書きます。同じ場所でも、書き方が2つあります。
同じ場所を2つの書き方で指す
| 道具 | 書き方 | 指す場所 | 順番 |
|---|---|---|---|
| リスト | grid[1][3] | 上から2行目、左から4列目 | 行、列 |
| NumPy | numbers[1, 3] | 上から2行目、左から4列目 | 行、列 |
| Pillow | getpixel((3, 1)) | 上から2行目、左から4列目 | 列、行 |
学生が入力するセルは、このプレビューでは空白です。
いちばん明るいピクセルを探す
road = [[70, 72, 110], [68, 245, 112], [71, 109, 108]]
best = road[0][0]
where = [0, 0]
for row in range(len(road)):
for column in range(len(road[0])):
if road[row][column] > best:
best = road[row][column]
where = [row, column]
print("いちばん明るい値:", best)
print("場所(行, 列):", where)
# 245 を 20 に変えて、もう一度実行します。
# 場所は、どこになりますか。
よくある間違い
注意
行と列の順番は、どの道具でも同じと考えがちです。実際は、リストと NumPy は行、列で、Pillow の getpixel は列、行です。道具を変えたら、順番をまず確かめます。
画像の大きさがデータの量を決める
1つのピクセルの数が1バイトなら、RGB の画像は、ピクセルの数の3倍の数を持ちます。大きな画像ほど、読む数も計算も増えます。
coins.png の数の個数は、次のコマンドで確かめられます。
ピクセルの数と、数の個数
docker exec jupyter python3 -c "print(320 * 240, 320 * 240 * 3)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。