グレースケールは明るさだけの画像
グレースケールとは、色の情報を捨てて、明るさだけを1つの数で表した画像です。多くの画像処理は、まず画像をグレーにすることから始まります。
色の3つの数が1つになるので、計算は約3分の1で済みます。物の形や明るさを調べるだけなら、色はいりません。
このレッスンのゴール
メモ
重みを使って、カラーの画像をグレーの画像に直せる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| グレースケール | 明るさだけを1つの数で表した画像 | |
| 輝度 | 人の目に感じる明るさ | |
| 重み | 数にかける割合。大きいほど効く | 299 |
| チャンネル | 1つのピクセルが持つ数の1つ | |
| 切り捨て | 小数点以下を捨てて整数にすること |
学生が入力するセルは、このプレビューでは空白です。
赤、緑、青に別々の重みをかけて足す
人の目は、緑をいちばん明るく、青をいちばん暗く感じます。そこで、グレーの値は、3つの数に別々の重みをかけて足して作ります。
重みは、赤が 0.299、緑が 0.587、青が 0.114 です。この3つを足すと 1 になるので、結果は 0 から 255 のままです。
例: (197, 157, 62) をグレーにする
| チャンネル | 値 | 重み | 値 × 重み(1000倍) |
|---|---|---|---|
| 赤 | 197 | 299 | 58903 |
| 緑 | 157 | 587 | 92159 |
| 青 | 62 | 114 | 7068 |
| 合計 | 1000 | 158130 |
学生が入力するセルは、このプレビューでは空白です。
合計を 1000 で割ると、グレーの値が出る
重みを整数にして 1000 倍にすると、計算は整数のままでできます。合計の 158130 を 1000 で割って切り捨てると、158 です。
次のコマンドは、表の合計を計算します。
重みをかけた合計を求める
docker exec jupyter python3 -c "print(299 * 197 + 587 * 157 + 114 * 62)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
単純な平均では、明るさがずれる
3つの数の平均を取れば、もっと簡単にグレーが作れそうです。しかし、この例では (197 + 157 + 62) を 3 で割って切り捨てると 138 になり、重みを使った 158 より暗くなります。
目が緑を明るく感じる分を、平均は取り入れません。
ラボでグレーにして、明るさを数える
次のスクリプトは、coins.png をグレーにして、2つの画像のモードとピクセルを表示します。さらに、明るさを4つの帯に分けて、帯ごとのピクセルの数を出します。
出力は英語です。colour は色、grey はグレー、pixels from 0 to 63 は、0 から 63 の明るさのピクセルの数です。
画像をグレーにして、帯ごとに数える
docker exec jupyter python3 steps/grey.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力から分かること
モードは RGB から L に変わります。50, 50 のピクセルは、(197, 157, 62) からグレーの 158 になります。
帯ごとの数は、63231、0、13566、3 です。暗い背景と明るいコインの2つのかたまりがあり、真ん中の帯には1つもありません。足すと 76800 で、全部のピクセルです。
3つの色をグレーにする
colours = [[255, 0, 0], [0, 255, 0], [0, 0, 255]]
for pixel in colours:
total = 299 * pixel[0] + 587 * pixel[1] + 114 * pixel[2]
print(pixel, "のグレー:", total // 1000)
# 3つ目の [0, 0, 255] を [255, 255, 255] に変えて、もう一度実行します。
# グレーは、いくつになりますか。
よくある間違い
注意
グレーにした画像から、元の色に戻せると考えがちです。3つの数が1つになるので、違う色が同じグレーになります。赤 (255, 0, 0) も、灰色 (76, 76, 76) も、グレーは 76 です。