初心者向け-画像処理ハンズオン!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などのエディタを使ってコードを実行したい方向けの手順です。
-
必要なライブラリをインストール
コマンドプロンプト(Windows)またはターミナル(Mac, Linux)を開き、以下のコマンドを実行してください。VS Code の統合ターミナルから実行しても構いません。pip install opencv-python numpy matplotlib
※ 環境によっては
pip3
コマンドを使う必要がある場合があります。 -
インストールできたか確認
インストールが終わったら、正しくライブラリが使えるか確認しましょう。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アカウントが必要です)。
-
Colabノートブックを開く
Webブラウザで Google Colaboratory にアクセスします。「ノートブックを新規作成」を選択してください。 -
必要なライブラリをインストール
開いたノートブックの最初のコードセルに、以下のライブラリインストールコマンドを記述し、セル左側の実行ボタン ▶️ をクリックします。Colab上では、通常のコマンドの前に!
をつけます。!pip install opencv-python numpy matplotlib
-
インストールできたか確認
インストールが完了したら、新しいコードセルを作成し(「+ コード」ボタン)、以下のコードを記述して実行してみてください。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
: リサイズ後の画像
実装ステップ
- 画像を読み込む
- ドットのサイズ(例: 10ピクセルごとに1ドット)を決める
- 縮小後のサイズを計算する
- cv2.resize() で画像を縮小する (interpolation はデフォルトでOK)
- cv2.resize() で画像を元のサイズに拡大する(interpolation=cv2.INTER_NEAREST を使う!)
- 結果を表示する
- 結果を保存する
コードを書いてみよう
上記のステップをコードにしていきます。
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