【要約】 回転と拡大、さらにガウシアンノイズを組み合わせることで、より多様なデータセットを作成。Python プログラムを用いることで,この差魚を自動化
【目次】
【サイト内の関連ページ】
【関連する外部ページ】
Python の公式ページ: https://www.python.org/
コマンドプロンプトを管理者として実行: 別ページ »で説明
※ 「pip install ...」は,Python パッケージをインストールするための操作
python -m pip install -U opencv-python opencv-contrib-python
画像を1枚作る
cd %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 開発環境(Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, Spyder, PyCharm, PyScripterなど)も便利である.
Python のまとめ: 別ページ »にまとめ
プログラムを augment.pyのようなファイル名で保存したので, 「python augment.py a.png a01.png」のようなコマンドで行う.
これは,すでにある画像ファイル a.png を用いて,a01.png という新しい画像を作る
python augment.py a.png a01.png
画像を20枚作る
cd %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 開発環境(Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, Spyder, PyCharm, PyScripterなど)も便利である.
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