🤖
画像処理前提知識(画像データとは何かについて)
はじめに
画像処理について自分なりに学習したことのまとめです。
画像についての情報は色々散らばっていて集め難いので基本的な画像処理の流れを一連の記事にまとめることを目標に作成します。
筆者はPythonを用いて学習しています。
認識違いなどを発見されましたらご指摘いただけますと幸いです。
1.画像データとは
画像処理の前提知識としてまず画像データがどういったデータであるかという内容を記します。
画像データとは端的に換言すると"それぞれが独自に色情報を持った同一サイズの点を縦横に並べた配列"です。色情報についてはいくつか表記方法が存在するのでこの後に記載。
一例として色情報が明るさのみ(最も暗いと黒、最も明るいと白)の1チャンネルで表されるグレースケールの画像を生成します。
先ほど配列と述べた通りPythonにおいてはnumpyを用いて画像を配列として表現することができます。
import numpy as np
import matplotlib.pyplot as plt
#0~255の整数をランダムで持つ(50, 50)の配列を作成
img = np.random.randint(0, 255, (50, 50))
#配列を数字状態で表示
print(img)
#配列を画像として表示
plt.imshow(img, 'gray')
plt.show()
上記のコードを実行することで(50, 50)のnumpy配列の数字の大きさに対応した明るさを持つ画像を生成することができます。この画像は縦横それぞれ50 x 50の250ピクセルで構成されており、各ピクセルは0~255の256通り(8bit)の明るさを持っていると表現することができます。
このピクセルの集合がデータとしての画像の正体です。
ピクセルの合計数は画素数と呼ばれます。
2.色情報
- グレースケール
先ほど利用した所謂白黒の形式です。下二つの形式とは異なり情報が明るさのみであることから、明るさの数字を縦横に並べた二次元データで表現することができます。 - RGB
一色でデータを構成していたグレースケールと異なり光の三原色である赤、緑、青の3色それぞれの明るさ情報を持ったピクセルで表現された画像です。8bit画像の場合3色それぞれが256通りの数字を持ち得るため、1ピクセルに表示される色の選択肢は の16,777,216通り、つまり約1680万色になります。256^3
グレースケールと異なり1つのピクセルが3色の情報を持たなければならないため、データとしては同じ形の二次元配列を赤、緑、青それぞれの色が持っている形で表現され、色は配列の3つ目の要素であるチャンネルとして扱われます。
先ほどのコード同様にmatplotlibでの画像表示を行うとするならばnumpyの配列が(縦のピクセル数,横のピクセル数,チャンネル数)となっている必要があります。 - HSV
HSVもRGBと同様に2次元配列を3チャンネル持つ3次元データです。RGBとの違いは色の表現方法です。HSVではチャンネルそれぞれが色を持つのではなく、色相(Hue)、彩度(Saturation)、明度(Value)の3つの数値を組み合わせて色が決定されます。3つの数値について大まかな解説をすると以下のようになります。
-色相:可視光を波長基準で360°に配置したもの。砕けた言い方をすると、赤っぽい、青っぽいなど大まかな色を決める要素。
-彩度:色の鮮やかさ。数字が小さいとグレースケールに近づき、大きいと色相で選んだ色に近づく。
-明度:色の明るさ。数字が小さいと黒っぽい色になり、大きいと白っぽい色になる。
HSVとRGBでは同じように色を表現することが可能で、OpenCV等のライブラリを用いるとコード1行で行き来が可能です。
3.まとめ
今回の記事ではコンピューターで扱われる画像データが内部的にはどのような形をしているか、またどういった要素で我々の目に見える形が表現されているかをまとめました。
次回は画像処理における前処理についてまとめます。
Discussion