📷

作って学ぶ画像処理入門 - 1. 画像のデータ構造を理解する

に公開

tl;dr

  • 対象読者: 画像処理に入門したい人向け
  • 自分で画像を描く(数値を打ち込む)ことで、画像が行列であることを理解する
  • 行列であることを理解していると、画像の内部処理のイメージが湧きやすく理解に繋がる

コードはpythonで記載していますが、簡単なコードなのでpythonを知らなくても理解できると思います。

画像のデータ構造を理解する

画像は、ピクセル(画素)と呼ばれる小さな点の集まりです。

pixel
画像を拡大するとピクセル1つ1つの色が確認できる

ピクセル1つ1つに色の情報が存在します。

pixel_color
各ピクセルに存在する色情報

この情報を1つにまとめて「行列」として表現します。

matrix
全てのピクセルの色情報を数値でまとめる → 行列

以下の3つの問題を解くことで、画像が行列であることを理解していきましょう。

  • 白黒(二値)画像
  • グレースケール画像
  • カラー(RGB)画像

問題1. 白黒画像を作成する

以下の3x3ピクセルの白黒画像をリテラルのコードで表現してください。

monochrome_img

ヒント

  • サイズは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ピクセルのグレースケール画像をデータ構造で表現してください。

gray_img

ヒント

  • 黒は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_img

ヒント

  • 色は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