金子邦彦研究室人工知能Windows で動く人工知能関係 Pythonアプリケーション,オープンソースソフトウエア)画像の増量を行う Python プログラム(Python,opencv-python を使用)(Windows 上)

画像の増量を行う Python プログラム(Python,opencv-python を使用)(Windows 上)

要約】 回転と拡大、さらにガウシアンノイズを組み合わせることで、より多様なデータセットを作成。Python プログラムを用いることで,この差魚を自動化

目次

  1. 前準備
  2. 画像の増量を行う Python プログラム(Python,opencv-python を使用)(Windows 上)

前準備

Python のインストール(Windows 上)

サイト内の関連ページ

関連する外部ページ

Python の公式ページ: https://www.python.org/

画像の増量を行う Python プログラム(Python,opencv-python を使用)(Windows 上)

Python の opencv-python のインストール

  1. Windows で,コマンドプロンプト管理者として実行

    コマンドプロンプトを管理者として実行: 別ページ »で説明

  2. opencv-python のインストール

    ※ 「pip install ...」は,Python パッケージをインストールするための操作

    python -m pip install -U opencv-python opencv-contrib-python
    

画像の増量を行う Python プログラム(Python,opencv-python を使用)(Windows 上)

画像を1枚作る

  1. Windows で,コマンドプロンプトを実行
  2. エディタを起動
    cd %HOMEPATH%
    notepad augment.py
    
  3. エディタで,次のプログラムを保存
    # 回転と拡大、さらにガウシアンノイズを組み合わせることで、より多様なデータセットを作成。
    # ・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)
    
  4. Python プログラムの実行

    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
    

    [image]
  5. 結果の確認

    [image]

    [image]

画像の増量を行う Python プログラム(Python,opencv-python を使用)(Windows 上)

画像を20枚作る

  1. Windows で,コマンドプロンプトを実行
  2. エディタを起動
    cd %HOMEPATH%
    notepad augment20.py
    
  3. エディタで,次のプログラムを保存
    # 回転と拡大、さらにガウシアンノイズを組み合わせることで、より多様なデータセットを作成。
    # ・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)
    
  4. Python プログラムの実行

    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
    

    [image]
  5. 結果の確認

    [image]

    [image]