画像の増量を行う Python プログラム(Python,opencv-python を使用)(Windows 上)
【要約】 回転と拡大、さらにガウシアンノイズを組み合わせることで、より多様なデータセットを作成。Python プログラムを用いることで,この差魚を自動化
【目次】
前準備
Python 3.10 のインストール(Windows 上)
Pythonは,プログラミング言語の1つ.
【手順】
- Windows で,コマンドプロンプトを管理者権限で起動する(例:Windowsキーを押し,「cmd」と入力し,「管理者として実行」を選択)
- 次のコマンドを実行
次のコマンドは,Python ランチャーとPython 3.10をインストールする.
【関連する外部ページ】
- Python の公式ページ: https://www.python.org/
【サイト内の関連ページ】
【関連項目】 Python
画像の増量を行う Python プログラム(Python,opencv-python を使用)(Windows 上)
Python の opencv-python のインストール
- Windows で,コマンドプロンプトを管理者権限で起動する(例: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 プログラムの実行
Python プログラムの実行
- Windows では python (Python ランチャーは py)
- Ubuntu では python3
【サイト内の関連ページ】 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 プログラムの実行
Python プログラムの実行
- Windows では python (Python ランチャーは py)
- Ubuntu では python3
【サイト内の関連ページ】 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
- 結果の確認