目的
画像の回転だけであれば調べればすぐ出てきたのですが、フォルダ内すべての画像を
回転の対象にできないかと思い色々調べてまとめてみました。
ソースコード
下記のソースコードは、ファイル内にあるすべての画像を読み込んで
その画像を反時計回り一回行い、再度保存するプログラムです。
import numpy as np
import cv2
import os,glob,random
save_dir="./hogehoge"
files=glob.glob("./hugehuge./*.JPG")
n=0
for l in files:
img=cv2.imread(l)
outfile=save_dir+"/"+str(n)+".jpg"
# 反時計回りに回転させる
img=cv2.rotate(img , cv2.ROTATE_90_COUNTERCLOCKWISE)
cv2.imwrite(outfile, img)
n+=1
解説
保存先のディレクトリを指定します。
この場合、ソースコードと同じディレクトリ配下のhogehogeというフォルダに保存するようになっています。
save_dir="./hogehoge"
ソースコードと同じディレクトリ配下のhugehugeというフォルダの中の任意のファイル名の画像をfilesで定義します。
*はワイルドカードになっており、任意の文字列を指します。
例えば、*の箇所を特定のファイル名(1.jpgという画像など)にすれば、その画像だけを回転させます。
なので、このコードを実行する際はhugehugeフォルダ内のすべての画像が回転してしまうので注意してください。
files=glob.glob("./hugehuge./*.JPG")
Pythonの強みであるfilesで定義した任意の数のファイルをそれぞれlとしてfor文をまわします。
for l in files:
openCVのimreadを使い画像の読み込みです。
img=cv2.imread(l)
保存先のディレクトリを指定します。
先ほどもsave_dirで保存先のフォルダを定義しましたが、画像のファイル名は定義していないので、
今回はn=0からの連番で画像のファイル名を指定します。
なので、回転されて保存された画像のファイル名は0.jpg~n.jpgとなるわけです。
nの最大値は読み取り元のhugehugeフォルダ内の画像の枚数に依存します。
outfile=save_dir+"/"+str(n)+".jpg"
本題の画像の回転ですが、今回はopenCVのrotateを用います。
第1引数に画像、第2引数に回転の方法を指定します。
今回は反時計回りを指定しますので、cv2.ROTATE_90_COUNTERCLOCKWISEを用います。
# 反時計回りに回転させる
img=cv2.rotate(img , cv2.ROTATE_90_COUNTERCLOCKWISE)
時計周りの場合は第2引数に以下を用います。
cv2.ROTATE_90_CLOCKWISE
180度回転の場合は第2引数に以下を用います。
cv2.ROTATE_180
最後に画像の保存をopenCVのimwriteを用いて行います。
cv2.imwrite(outfile, img)
以上で解説はおしまいです。
お疲れ様でした!
参考文献
引用元