画像の増量を行う Python プログラム(Python,opencv-python を使用)(Windows 上)
【目次】
前準備
Python 3.12 のインストール
Pythonのインストールを行い、Pythonのプログラムを実行する環境を整える。扱う環境は、Windows搭載パソコンである。金子研究室では、Python 3.12.10を推奨する。
[Windows での Python 3.12 のインストール手順を見るには、ここをクリック]
Windows での Python 3.12 のインストール
以下のいずれかの方法でPython 3.12をインストールする。Pythonがインストール済みの場合、この手順は不要である。
方法 1:winget によるインストール
【インストールコマンドの実行方法】
管理者権限でコマンドプロンプトを起動する(手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。そして、コマンド全体をコマンドプロンプトにコピー&ペーストする。
--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動するとPATHが反映される。
REM Python 3.12 をシステム領域にインストール
winget install --id Python.Python.3.12 -e --scope machine --silent --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Python 3.12 のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
REM Python と Scripts を PATH 先頭に追加
powershell -NoProfile -Command "$p='C:\Program Files\Python312'; $s=\"$p\Scripts\"; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); $new=$c; if((';'+$new+';') -notlike \"*;$p;*\"){$new=$p+';'+$new}; if((';'+$new+';') -notlike \"*;$s;*\"){$new=$s+';'+$new}; if($new -ne $c){$k.SetValue('Path',$new,$t)}; $k.Close()}"
REM 現在のセッションにも反映(システムPATHを再取得して連結)
for /f "usebackq tokens=2,*" %A in (`reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path`) do set "PATH=%B"
REM pip / wheel の更新
python -m pip install --no-user -U pip wheel
if not "%ERRORLEVEL%"=="0" ( color 0c & echo pip / wheel の更新に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
方法 2:インストーラーによるインストール
- Python公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンからWindows用インストーラーをダウンロードする。
- ダウンロードしたインストーラーを実行する。
- 初期画面の下部に表示される「Add python.exe to PATH」にチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから
pythonコマンドを実行できない。 - 「Install Python 3.xx for all users」にチェックを入れ、「Install」をクリックする。
インストールの確認
コマンドプロンプトで以下を実行する。
python --version
バージョン番号(例:Python 3.12.x)が表示されればインストール成功である。「'python' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は、インストールが正常に完了していない。
画像の増量を行う Python プログラム(Python,opencv-python を使用)(Windows 上)
Python の opencv-python ライブラリのインストール
- 以下の手順を管理者権限のコマンドプロンプトで実行する
(手順:Windowsキーまたはスタートメニュー →
cmdと入力 → 右クリック → 「管理者として実行」)。 - opencv-python のインストール
* 「pip install ...」は,Pythonのライブラリをインストールするための操作
python -m pip install -U opencv-python opencv-contrib-python
画像の増量を行う Python プログラム(Python,opencv-python を使用)(Windows 上)
画像を1枚作る
- Windows で,コマンドプロンプトを実行
- エディタを起動
cd /d c:%HOMEPATH% notepad augment.py - エディタで,次のプログラムを保存
# 回転と拡大,さらにガウシアンノイズを組み合わせることで,より多様なデータセットを作成する。 # ・random_scaleでランダムな拡大率を指定する。min_scaleとmax_scaleを変更することで,拡大率の範囲を調整できる。 # ・add_gaussian_noiseという関数を定義して,ガウシアンノイズを画像に追加する。meanはノイズの平均値,stdはノイズの標準偏差を指定する。ノイズの標準偏差を大きくすると,ノイズがより強くなる。ガウシアンノイズは,自然界の多くのノイズに似ているため,画像のロバスト性を向上させる上で役立つ。 # ・min_angleとmax_angleで回転角度の範囲を指定して,その範囲内でランダムな角度を生成する。生成されたランダムな角度に基づいて画像を回転する。 import cv2 import numpy as np import random import sys def add_gaussian_noise(image, mean=0, std=25): noise = np.random.normal(mean, std, image.shape).astype(np.uint8) noisy_image = cv2.add(image, noise) return np.clip(noisy_image, 0, 255) def main(input_filename, output_filename): # 画像読み込み img = cv2.imread(input_filename) # 回転角度と拡大率の範囲を指定 min_angle, max_angle = -45, 45 min_scale, max_scale = 1.0, 1.2 # ランダムに回転角度と拡大率を決定 random_angle = random.randint(min_angle, max_angle) random_scale = random.uniform(min_scale, max_scale) # 画像の中心を取得 height, width = img.shape[:2] center = (width // 2, height // 2) # 回転と拡大のための行列を計算 rotation_scaling_matrix = cv2.getRotationMatrix2D(center, random_angle, random_scale) # 回転後の四隅の座標を計算。新しい画像のサイズを決定 corners = np.array([[0, 0], [width, 0], [0, height], [width, height]]) rotated_corners = cv2.transform(np.float32([corners]), rotation_scaling_matrix)[0] new_width = int(max(rotated_corners[:, 0]) - min(rotated_corners[:, 0])) new_height = int(max(rotated_corners[:, 1]) - min(rotated_corners[:, 1])) print(new_width, new_height) # 画像の中心を新しい画像の中心に合わせるための平行移動行列 new_center = (new_width // 2, new_height // 2) translation_matrix = np.array([[1, 0, new_center[0] - center[0]], [0, 1, new_center[1] - center[1]]], dtype=np.float32) # 新しい画像のサイズをもとに、拡大と回転後の画像を作成 new_rotation_scaling_matrix = cv2.getRotationMatrix2D(new_center, random_angle, random_scale) new_rotated_img = cv2.warpAffine(cv2.warpAffine(img, translation_matrix, (new_width, new_height)), new_rotation_scaling_matrix, (new_width, new_height)) # ガウシアンノイズを追加 noisy_rotated_img = add_gaussian_noise(new_rotated_img) # 変換後の画像を保存 cv2.imwrite(output_filename, noisy_rotated_img) if __name__ == "__main__": if len(sys.argv) != 3: print("Usage: python augment.py input_image.jpg output_noisy_rotated_image.jpg") else: input_filename = sys.argv[1] output_filename = sys.argv[2] main(input_filename, output_filename) - Python プログラムの実行
プログラムを augment.pyのようなファイル名で保存したので, 「python augment.py a.png a01.png」のようなコマンドで行う.
これは,すでにある画像ファイル a.png を用いて,a01.png という新しい画像を作る
python augment.py a.png a01.png
- 結果の確認
画像の増量を行う Python プログラム(Python,opencv-python を使用)(Windows 上)
画像を20枚作る
- Windows で,コマンドプロンプトを実行
- エディタを起動
cd /d c:%HOMEPATH% notepad augment20.py - エディタで,次のプログラムを保存
# 回転と拡大,さらにガウシアンノイズを組み合わせることで,より多様なデータセットを作成する。 # ・random_scaleでランダムな拡大率を指定する。min_scaleとmax_scaleを変更することで,拡大率の範囲を調整できる。 # ・add_gaussian_noiseという関数を定義して,ガウシアンノイズを画像に追加する。meanはノイズの平均値,stdはノイズの標準偏差を指定する。ノイズの標準偏差を大きくすると,ノイズがより強くなる。ガウシアンノイズは,自然界の多くのノイズに似ているため,画像のロバスト性を向上させる上で役立つ。 # ・min_angleとmax_angleで回転角度の範囲を指定して,その範囲内でランダムな角度を生成する。生成されたランダムな角度に基づいて画像を回転する。 import cv2 import numpy as np import random import sys def add_gaussian_noise(image, mean=0, std=0.4): noise = np.random.normal(mean, std, image.shape).astype(np.uint8) noisy_image = cv2.add(image, noise) return np.clip(noisy_image, 0, 255) def main(input_filename, output_filename, std=0.4): # 画像読み込み img = cv2.imread(input_filename) # 回転角度と拡大率の範囲を指定 min_angle, max_angle = -45, 45 min_scale, max_scale = 1.0, 1.2 # ランダムに回転角度と拡大率を決定 random_angle = random.randint(min_angle, max_angle) random_scale = random.uniform(min_scale, max_scale) # 画像の中心を取得 height, width = img.shape[:2] center = (width // 2, height // 2) # 回転と拡大のための行列を計算 rotation_scaling_matrix = cv2.getRotationMatrix2D(center, random_angle, random_scale) # 回転後の四隅の座標を計算。新しい画像のサイズを決定 corners = np.array([[0, 0], [width, 0], [0, height], [width, height]]) rotated_corners = cv2.transform(np.float32([corners]), rotation_scaling_matrix)[0] new_width = int(max(rotated_corners[:, 0]) - min(rotated_corners[:, 0])) new_height = int(max(rotated_corners[:, 1]) - min(rotated_corners[:, 1])) print(new_width, new_height) # 画像の中心を新しい画像の中心に合わせるための平行移動行列 new_center = (new_width // 2, new_height // 2) translation_matrix = np.array([[1, 0, new_center[0] - center[0]], [0, 1, new_center[1] - center[1]]], dtype=np.float32) # 新しい画像のサイズをもとに、拡大と回転後の画像を作成 new_rotation_scaling_matrix = cv2.getRotationMatrix2D(new_center, random_angle, random_scale) new_rotated_img = cv2.warpAffine(cv2.warpAffine(img, translation_matrix, (new_width, new_height)), new_rotation_scaling_matrix, (new_width, new_height)) # ガウシアンノイズを追加 noisy_rotated_img = add_gaussian_noise(new_rotated_img, 0, std) # 変換後の画像を保存 cv2.imwrite(output_filename, noisy_rotated_img) import os def get_file_extension(filename): # ファイル名と拡張子を取得 _, extension = os.path.splitext(filename) # 拡張子の先頭のピリオドを取り除く return extension[1:] def remove_file_extension(filename): # ファイル名と拡張子を取得 filename_without_extension, _ = os.path.splitext(filename) return filename_without_extension if __name__ == "__main__": if len(sys.argv) != 3: print("Usage: python augment.py input_image.jpg output_noisy_rotated_image.jpg") else: input_filename = sys.argv[1] output_filename = sys.argv[2] std = 0.4 strings = [f"{i:02}" for i in range(20)] for i in strings: main(input_filename, remove_file_extension(output_filename) + i + '.' + get_file_extension(output_filename), std) - Python プログラムの実行
プログラムを augment.pyのようなファイル名で保存したので, 「python augment.py a.png b.png」のようなコマンドで行う.
これは,すでにある画像ファイル a.png を用いて, b00.png, b01.png, b02.png ... b19.png という新しい画像を20枚作る
python augment.py a.png b.png
- 結果の確認