【Python-openCV】画像回転⇒ランダム切り抜き!AIデータの水増しに!

こんにちは、ヒガシです。

 

このページでは以下の画像に示すように、ベースとなる画像データをランダムに回転させ、そこからさらにランダムに指定サイズで画像を切り抜くという処理を連続実行する方法をご紹介していきます。

回転⇒切り抜き⇒データ水増しという処理の作業概要図

 

画像認識系の機械学習を実施する際によく使われる、Data Augmentationという画像の水増し処理のひとつですね。

 

あなたのやりたいことと一致していれば、ぜひ続きをご覧ください。

 

スポンサーリンク

処理内容の概要説明

今回は以下の画像に示す処理を何度も実行することによって画像の水増しを行っていきます。

回転⇒切り抜きする方法の解説

処理の流れとしては、以下の通りです。

①乱数を使って適当に画像を回転させる。

⇒このとき角度に応じて角が真っ黒になる。

②①で作った画像からランダムに指定サイズで切り抜く。

⇒このとき切り抜いた枠の4隅に真っ黒い場所(①の処理で欠けた領域)があると①からやり直し。

③指定の枚数水増しできるまで①②を繰り返す。

 

スポンサーリンク

回転⇒切り抜きでの画像水増しサンプルコード

それでは先ほど紹介した作業を実施してくれるサンプルコードをご紹介していきます。

#ライブラリインポート
import cv2
import os
import random
import numpy as np
#読み込む画像ファイル名
pic_name='sample.jpg'
#切り出す画像のサイズ(縦、横)
frame_size=(256,256)
#ベース画像の読み込み
pic=cv2.imread(pic_name)
h,w=pic.shape[:2]
#切り抜き後の画像保存フォルダ作成
dir_name='new_pic_dir'
os.makedirs(dir_name,exist_ok=True)
#連続切り抜き処理
cut_pic=np.zeros([frame_size[0],frame_size[1],3],np.uint8)
for i in range(10):
    #4隅が真っ黒だと繰り返す
    while max(cut_pic[0,0,:])==0 or \
          max(cut_pic[0,frame_size[1]-1,:])==0 or \
          max(cut_pic[frame_size[0]-1,0,:])==0 or \
          max(cut_pic[frame_size[0]-1,frame_size[1]-1,:])==0:
        #画像の回転
        rot_angle=random.randint(0,359)
        ROT= cv2.getRotationMatrix2D(center=(w/2,h/2),angle=rot_angle,scale=1)
        pic_r = cv2.warpAffine(pic,ROT,dsize=(w,h))
        #切り抜く際の始点(左上)
        x=random.randint(0,w-frame_size[1])
        y=random.randint(0,h-frame_size[0])
        #切り抜き処理
        cut_pic=pic_r[y:y+frame_size[1],x:x+frame_size[0],:]
    #切り抜き画像を保存
    cv2.imwrite(dir_name+'/cut_pic'+str(i).zfill(3)+'.jpg',cut_pic)
    cut_pic=np.zeros([frame_size[0],frame_size[1],3],np.uint8)

 

基本的にあなたが変更する点は、以下の2つだけでOKです。

①読み込む画像データのファイル名の指定(7行目)

②切り抜き後の画像データのサイズ指定(9行目)

 

また、もし回転角度のばらつきを指定したければ24行目の(0,359)を書き換えればOKです。(そのままだと0~359degの間でランダムに回転します。)

 

スポンサーリンク

サンプルコードの実行結果確認

それでは先ほどのコードを実行してみましょう。

 

実行前のフォルダの中身は以下のような状態です。

サンプルコード実行前のフォルダの中身

 

それでは実行してみます。

なにやら新しいフォルダが出現しましたね。

サンプルコード実行後のフォルダの中身

 

新しくできたフォルダの中身を確認してみましょう。

画像データを回転⇒切り抜きで水増しした結果

ちなみに以下がベース画像です。

使用したベース画像の紹介

処理の性質上、どうしても中心付近の画像が多くなってはしまいますが、一応ランダムに切り出されていることが確認できますね。

 

スポンサーリンク

おわりに

というわけで今回はpython-openCVを使って、画像をランダムに回転⇒切り出しすることによってデータを水増しする処理をご紹介しました。

 

AI構築の前処理としてぜひご活用ください。

 

このように、私のブログでは様々なスキルを紹介しています。

過去記事一覧

 

今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。

確実にスキルアップできるはずです。

 

最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村 IT技術ブログへ
にほんブログ村

それではまた!

コメント

タイトルとURLをコピーしました