📷
作って学ぶ画像処理入門 - 1. 画像のデータ構造を理解する
tl;dr
- 対象読者: 画像処理に入門したい人向け
- 自分で画像を描く(数値を打ち込む)ことで、画像が行列であることを理解する
- 行列であることを理解していると、画像の内部処理のイメージが湧きやすく理解に繋がる
コードはpythonで記載していますが、簡単なコードなのでpythonを知らなくても理解できると思います。
画像のデータ構造を理解する
画像は、ピクセル(画素)と呼ばれる小さな点の集まりです。
画像を拡大するとピクセル1つ1つの色が確認できる
ピクセル1つ1つに色の情報が存在します。
各ピクセルに存在する色情報
この情報を1つにまとめて「行列」として表現します。
全てのピクセルの色情報を数値でまとめる → 行列
以下の3つの問題を解くことで、画像が行列であることを理解していきましょう。
- 白黒(二値)画像
- グレースケール画像
- カラー(RGB)画像
問題1. 白黒画像を作成する
以下の3x3ピクセルの白黒画像をリテラルのコードで表現してください。
ヒント
- サイズは3 x 3
- 白は0、黒は1で表す
回答
以下のデータ構造で表現できます。
[
[1, 0, 1],
[0, 1, 0],
[1, 0, 1]
]
以下のコードで実際に画像を表示できます(notebook環境を想定)。
import matplotlib.pyplot as plt
def show_image(img, cmap=None):
"""
画像を表示する関数
:param img: 画像データ (2次元または3次元の配列)
:param cmap: カラーマップ (モノクロやグレースケールの場合に使用)
"""
plt.imshow(img, cmap=cmap)
plt.axis('off') # 軸を非表示
plt.show()
# 3 x 3のモノクロ画像の作成
monochrome_img = [[1, 0, 1],
[0, 1, 0],
[1, 0, 1]]
# 画像の表示
show_image(monochrome_img, "binary")
問題2. グレースケール画像を作成する
以下の3x3ピクセルのグレースケール画像をデータ構造で表現してください。
ヒント
- 黒は0、白は255で表す
※上限が255なのは1バイト(=8ビット)で表現できる最大値が255なため
回答
左上が255(白)、右下が0(黒)、その間は等間隔になっています。
[
[255, 192, 128],
[192, 128, 64],
[128, 64, 0]
]
import matplotlib.pyplot as plt
def show_image(img, cmap=None):
"""
画像を表示する関数
:param img: 画像データ
:param cmap: カラーマップ
"""
plt.imshow(img, cmap=cmap)
plt.axis('off')
plt.show()
# 3 x 3のグレースケール画像の作成
gray_img = [[255, 192, 128],
[192, 128, 64],
[128, 64, 0]]
# 画像の表示
show_image(gray_img, "gray")
問題3. カラー画像を作成する
以下の3x3ピクセルのカラー画像をデータ構造で表現してください。
ヒント
- 色はRGBで表す
- [R, G, B]
回答
カラー画像になると、1ピクセルあたり3つの値を使用するため、3次元の配列になります。
赤: [255, 0, 0], 緑: [0, 255, 0], 青: [0, 0, 255]
[
[[0, 255, 0], [255, 0, 0], [0, 0, 255]], # 緑、赤、青
[[255, 0, 0], [0, 0, 255], [255, 0, 0]], # 赤、青、赤
[[0, 0, 255], [255, 0, 0], [0, 255, 0]]] # 青、赤、緑
]
import matplotlib.pyplot as plt
def show_image(img, cmap=None):
"""
画像を表示する関数
:param img: 画像データ
:param cmap: カラーマップ
"""
plt.imshow(img, cmap=cmap)
plt.axis('off')
plt.show()
# 3 x 3のカラー画像の作成
color_img = [[[0, 255, 0], [255, 0, 0], [0, 0, 255]], # 緑、赤、青
[[255, 0, 0], [0, 0, 255], [255, 0, 0]], # 赤、青、赤
[[0, 0, 255], [255, 0, 0], [0, 255, 0]]] # 青、赤、緑
# 画像の表示
show_image(color_img)
実際の画像との繋がり
画像が行列であることを理解すると、身近な画像を行列としてイメージできるようになります。
サイズ
ここまで3x3ピクセルという非常に小さな画像を扱ってきましたが、実際の画像はこれを単に拡大したものです。
- フルHD画面: 1920x1080ピクセル
- スマホで撮影した画像: 4000x3000ピクセル
白黒画像の使用例
最初に扱った白黒画像は、以下のような場面で使用されています。
- QRコードやバーコード: 黒と白のパターンで情報を符号化
- 文書スキャン・OCR: テキスト認識の前処理として文書を白黒に変換
- 輪郭検出: 物体の境界を検出する画像処理の基礎処理
グレースケール画像の使用例
グレースケール画像は、以下のような場面で使用されています。
- 医療診断: X線やMRI画像は基本的にグレースケールで、組織の密度差を明暗で表現
- テクスチャ分析: 物体の表面の凹凸などの特徴抽出
- 画像処理の前処理: グレースケールに変換して計算負荷を軽減
カラー画像の使用例
カラー画像は、以下のような場面で使用されています。
- ディスプレイ技術: 液晶やOLEDディスプレイは、RGB値に基づいて各ピクセルの色を制御
- デジタルカメラ: カメラのイメージセンサーは基本的にRGBの光量を別々に記録
- コンピュータグラフィックス: ゲームや映画などの3DCGはRGB色空間での表現が基本
Discussion