最近画像データをAIに入れていろいろやっているのですが、サイズであったりビット数であったり
制限が多いです。今日はメモとしてopencvを使った画像処理をまとめてみました。
※opencvをインストールしている前提となります。
参考にした記事①動画から1コマずつの画像に変換するコード
import cv2
import os
def save_all_frames(video_path, dir_path, basename, ext='jpg'):
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
return
os.makedirs(dir_path, exist_ok=True)
base_path = os.path.join(dir_path, basename)
digit = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))))
n = 0
while True:
ret, frame = cap.read()
if ret:
cv2.imwrite('{}{}.{}'.format(base_path, str(n).zfill(digit), ext), frame)
n += 1
else:
return
save_all_frames('動画のpath', '出力する画像のpath', 'ファイル名', 'png')
②画像をグレースケールで読み込み、リサイズするコード
import cv2
img = cv2.imread('読み込む画像のpath/ファイル名')
width,height=100,100
img = cv2.resize(img,(width, height))
cv2.imwrite('出力する画像のpath/ファイル名’)
③さらに2値化するコード
import cv2
img = cv2.imread('読み込む画像のpath/ファイル名')
width,height=100,100
img = cv2.resize(img,(width, height))
threshold = 100
ret, img_thresh = cv2.threshold(img, threshold, 255, cv2.THRESH_BINARY)
ret,img_otsu = cv2.threshold(img,0,255,cv2.THRESH_OTSU)
cv2.imshow("img_otsu",img_otsu)
cv2.imwrite("出力する画像のpath/ファイル名",img_otsu)
cv2.waitKey(0)
cv2.destroyAllWindows()
③000.png、001.pngといった連続する画像を順番にリサイズ、2値化するコード
(100個まで)
import cv2
import numpy as np
for i in range(100):
img = cv2.imread("読み込む画像のpath/{0:03d}.png".format(i), cv2.IMREAD_GRAYSCALE)
width,height=100,100
img = cv2.resize(img,(width, height))
threshold = 100
ret, img_thresh = cv2.threshold(img, threshold, 255, cv2.THRESH_BINARY)
ret,img_otsu = cv2.threshold(img,0,255,cv2.THRESH_OTSU)
#cv2.imshow("img_otsu",img_otsu)
cv2.imwrite("出力する画像のpath/%03.f"%(i)+".png",img_otsu)
Mnistとか基本データセットであることが多いので自前のデータを扱う場合はopencvはマストです!!