👣

初心者向け-画像処理ハンズオン!by StepByCode

に公開

はじめに

こんにちは! StepByCode の活動より、画像処理ハンズオンの内容を記事化してお届けします。

PythonとOpenCVを使って、お手軽に画像を「ドット絵化」してみませんか?本記事では、写真をレトロなドット絵風に変換するツールをハンズオン形式で作成します。画像処理の第一歩として、ぜひコードを動かしながら一緒に進めてみましょう!

(この内容は、「StepByCode vol.7 初心者向け 画像処理ハンズオン!」での使用教材です。)

目標

  • PythonとOpenCVを使った画像処理の基本を理解する。
  • 画像をドット絵風に変換するスクリプトを作成する。
  • 画像処理の楽しさを体験する。

必要なもの

  • Python (推奨: 3.6以上)
  • pip (Pythonに付属しています)
  • 後述するライブラリ
  • コードを実行する環境 (VSCodeなどのPython環境/Google Colabなど)

画像処理とは?

画像処理の基本

ドット絵メーカーを作る前に、OpenCVを使った画像処理の基本的な操作を見ていきましょう。

画像とは?

コンピュータ上の画像は、小さな点の集まりでできています。この小さな点を「ピクセル」と呼びます。

カラー画像の場合、各ピクセルは通常、R (Red), G (Green), B (Blue) の3つの色の強さの組み合わせで表現されます。OpenCVでは、色の並びが B (Blue), G (Green), R (Red) の順(BGR順)になっていることが多い点に注意が必要です。

画像は、これらのピクセルの集合を縦と横の並び(配列)として扱います。PythonのNumPyライブラリの多次元配列として表現されるのが一般的です。

環境構築

まずは、ハンズオンを進めるために必要なライブラリをインストールしましょう。ご自身のPCにPython環境を構築する方(VS Codeなどを使う場合)と、Webブラウザで手軽に試したい方(Google Colabを使う場合)で手順が異なります。

環境構築 (ローカル環境 / VS Code 編)

ご自身のPCにPython環境(Python本体、pip)がインストールされている前提で進めます。VS Codeなどのエディタを使ってコードを実行したい方向けの手順です。

  1. 必要なライブラリをインストール
    コマンドプロンプト(Windows)またはターミナル(Mac, Linux)を開き、以下のコマンドを実行してください。VS Code の統合ターミナルから実行しても構いません。

    pip install opencv-python numpy matplotlib
    

    ※ 環境によっては pip3 コマンドを使う必要がある場合があります。

  2. インストールできたか確認
    インストールが終わったら、正しくライブラリが使えるか確認しましょう。VS Code で新しい .py ファイルを作成するか、Pythonインタプリタ、またはJupyter Notebook環境を開き、以下のコードを記述して実行してみてください。

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    print("環境構築完了!")
    print(f"使用するOpenCVのバージョン: {cv2.__version__}")
    

    エラーが出ずに上記のように表示されれば、環境構築は成功です!

環境構築 (Google Colab 編)

「ローカル環境のセットアップが難しい」「VS Code がうまく使えない」「Python環境でエラーが出てしまう」といった場合は、Google Colaboratory (Colab) を使ってみましょう。Webブラウザだけで Python + ライブラリの実行環境が用意できます(Googleアカウントが必要です)。

  1. Colabノートブックを開く
    Webブラウザで Google Colaboratory にアクセスします。「ノートブックを新規作成」を選択してください。

  2. 必要なライブラリをインストール
    開いたノートブックの最初のコードセルに、以下のライブラリインストールコマンドを記述し、セル左側の実行ボタン ▶️ をクリックします。Colab上では、通常のコマンドの前に ! をつけます。

    !pip install opencv-python numpy matplotlib
    
  3. インストールできたか確認
    インストールが完了したら、新しいコードセルを作成し(「+ コード」ボタン)、以下のコードを記述して実行してみてください。

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    print("環境構築完了!")
    print(f"使用するOpenCVのバージョン: {cv2.__version__}")
    

    エラーが出ずに上記のように表示されれば、Colab環境の準備は完了です!ハンズオンで使う画像ファイルは、Colabの左側メニューにあるファイルアイコン📁をクリックして表示されるサイドバーから、ファイルをドラッグ&ドロップしてアップロードできます。

画像の読み込みと最初の操作

環境構築ができたら、いよいよ画像をコンピューターに読み込んで、その基本的な情報を確認してみましょう。これが画像処理の第一歩です!

画像ファイルの読み込み

OpenCVの cv2.imread() 関数を使って、指定したパスの画像ファイルを読み込みます。画像データはNumPy配列として扱われます。

import cv2
import matplotlib.pyplot as plt # Jupyter Notebookなどで画像を表示するために使います

# --入力画像のファイル指定--(同じディレクトリに画像を置くと簡単です)
img_path = 'input.jpg' #画像名は任意

# --画像の読み込み--
img = cv2.imread(img_path)

# --画像が正しく読み込めたか確認--
if img is None:
    print(f"エラー: 画像ファイル '{img_path}' が見つからないか、読み込めません。パスを確認してください。")
else:
    print(f"画像 '{img_path}' を読み込みました。")

ドット絵メーカー

ドット絵化の仕組み

それでは、本題のドット絵化の考え方に入りましょう。

画像をドット絵風にする基本的なアイデアは、画像を小さなマス目(ブロック)に分割し、そのブロック内の情報を集約して一つの大きな「ドット」として表現することです。

今回は、最もシンプルで効果的な方法である「縮小+拡大」という手法を使います。

縮小 (Downsampling): 元の画像を非常に小さく縮小します。
拡大 (Upsampling): 縮小して小さくなった画像を、元のサイズに戻るように拡大します。
この縮小・拡大の際に、ピクセル値を計算する方法(補間方法 - Interpolation)が重要になります。特に、拡大時には 最近傍補間 (Nearest Neighbor Interpolation) を使うのがポイントです。

最近傍補間は、拡大後のピクセルの色を、拡大元の最も近いピクセルの色でそのままコピーするという単純な方法です。これにより、拡大元の小さな1ピクセルが、拡大後の広い範囲で同じ色になり、結果としてブロックのような見た目(ドット絵風)になります。

(例: 縮小・拡大と補間の概念図)

ドット絵メーカーの実装

では、「縮小+拡大+Nearest Neighbor」の手法を使ってドット絵メーカーを実装しましょう。

OpenCVには画像のサイズを変更する cv2.resize() という便利な関数があります。これを使います。

Python

dst = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

src: 入力画像
dsize: 拡大または縮小後のサイズ (幅, 高さ) のタプル。(width, height) の順であることに注意!fx および fy が指定されない場合に指定します。
fx, fy: 拡大率または縮小率。dsize の代わりに指定できます。
interpolation: 補間方法。cv2.INTER_NEAREST (最近傍),
cv2.INTER_LINEAR (バイリニア), cv2.INTER_CUBIC (バイキュービック) などがあります。
dst: リサイズ後の画像

実装ステップ

  1. 画像を読み込む
  2. ドットのサイズ(例: 10ピクセルごとに1ドット)を決める
  3. 縮小後のサイズを計算する
  4. cv2.resize() で画像を縮小する (interpolation はデフォルトでOK)
  5. cv2.resize() で画像を元のサイズに拡大する(interpolation=cv2.INTER_NEAREST を使う!)
  6. 結果を表示する
  7. 結果を保存する

コードを書いてみよう

上記のステップをコードにしていきます。

import cv2
import numpy as np
import matplotlib.pyplot as plt

def pixelate_image(image_path, dot_size=10):
    """
    画像をドット絵風に変換する関数
    入力:
        image_path (str): 入力画像ファイルのパス
        dot_size (int): 元の画像の何ピクセルを1ドットとするか
    出力:
        numpy.ndarray or None: ドット絵化された画像 (NumPy配列)、失敗した場合はNone
    """
    # --画像の読み込み--
    img = cv2.imread(image_path)
    # --画像が正しく読み込めたか確認--
    if img is None:
        print(f"エラー: 画像ファイル '{image_path}' が見つからないか、読み込めません。パスを確認してください。")
    else:
        print(f"画像 '{image_path}' を読み込みました。")

    # --元画像のサイズを取得--
    height, width = img.shape[:2]

    # --- 縮小処理 ---
    # 縮小後のサイズを計算 (元のサイズを dot_size で割る)
    new_width = width // dot_size
    new_height = height // dot_size
    # 縮小
    img_small = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_NEAREST)

    # --- 拡大処理 ---
    # 元のサイズに戻るように拡大
    img_dot = cv2.resize(img_small, (width, height), interpolation=cv2.INTER_NEAREST)

    # ドット絵化された画像を返す
    return img_dot 

# --- 関数の使い方 ---
input_image_path = 'input.jpg'     # 変換したい画像ファイル (読み込み)
output_image_path = 'output_dot.png' # 保存する画像ファイル名
dot_pixel_size = 15              # ドット1つのサイズを調整してみよう (例: 5, 10, 15, 20...)

# ドット絵化を実行
dot_image = pixelate_image(input_image_path, dot_pixel_size)

# 結果を表示
if dot_image is not None:
    # Matplotlibで表示するためにBGRからRGBに変換
    dot_image_rgb = cv2.cvtColor(dot_image, cv2.COLOR_BGR2RGB)
    plt.imshow(dot_image_rgb)
    plt.title(f'Pixelated Image (Dot Size: {dot_pixel_size})')
    plt.axis('off') # 軸非表示
    plt.show()

    # 結果を画像ファイルとして保存
    cv2.imwrite(output_image_path, dot_image)
    print(f"ドット絵画像を '{output_image_path}' に保存しました。")

このコードを実行すると、指定した input.jpg がドット絵化され、表示され、output_dot.png として保存されます。

ドットサイズを変えてみよう

コードの中の dot_pixel_size の値を色々変えて実行してみてください。

dot_pixel_size を小さくする → ドットが細かくなり、元の画像に近い見た目になる
dot_pixel_size を大きくする → ドットが粗くなり、よりドット絵らしい見た目になる
様々な画像とドットサイズで試して、お好みのドット絵を見つけてみましょう!

応用・発展

今回の「縮小+拡大+Nearest Neighbor」はドット絵化の一番シンプルな方法です。他にも様々な方法や応用が考えられます。

  • ブロック内の平均色を使う: 各ブロックのピクセル色の平均値を計算し、その色でブロックを塗りつぶすことで、より元の画像の色合いに近いドット絵になります。
  • 特定の色パレットを使う: ドットの色を、あらかじめ用意した少ない色数(例えばレトロゲームのようなパレット)の中から選ぶようにすることで、さらに雰囲気のあるドット絵になります。
  • 他の画像処理を組み合わせる: ドット絵化の前後に、画像の明るさやコントラストを調整したり、シャープネスをかけたりといった処理を組み合わせることも可能です。

OpenCVには他にもたくさんの画像処理機能があります。

  • 色空間の変換 (cv2.cvtColor)
  • 画像のぼかしや鮮鋭化などのフィルタリング (cv2.GaussianBlur, cv2.filter2D など)
  • エッジ(輪郭)の検出 (cv2.Canny, cv2.Sobel など)
  • 顔や物体の検出
  • 画像の切り抜きや回転

などなど、様々なことができます。OpenCVのドキュメントを覗いてみると、きっと面白い機能が見つかるはずです。

簡単な関数もGithubリポジトリにアップロードしているので興味ある方はぜひ動かしてみてください!

まとめ

この記事では、PythonとOpenCVを使って画像の「ドット絵メーカー」を作成しました。

画像の読み込み、表示、情報取得といったOpenCVの基本を学びました。
「縮小+拡大+Nearest Neighbor補間」という手法で画像をドット絵化できることを理解しました。

実際にコードを書いて、好きな画像をドット絵に変換してみました。
OpenCVを使うと、このように数行のコードで面白い画像処理が実現できます。ぜひ今回の内容を入り口に、様々な画像処理に挑戦してみてください!

Pythonや画像処理に関する入門書籍、オンラインコースなども参考にしてみてください。

最後までお読みいただきありがとうございました!
楽しかったらぜひ「いいね」やコメントをお願いします!

Discussion