[Python] opencvで画像を保存する方法
PythonでOpenCVを使用して画像を保存するには、cv2.imwrite()関数
を使います。
この関数は、指定したファイルパスに画像データを保存します。
例えば、cv2.imwrite('output.jpg', img)
のように記述し、img
には保存したい画像データを指定します。
ファイル形式は拡張子によって自動的に決定され、JPEGやPNGなどがサポートされています。
保存に成功するとTrue
を返し、失敗するとFalse
を返します。
OpenCVで画像を保存する基本的な方法
OpenCVは、画像処理やコンピュータビジョンのための強力なライブラリです。
PythonでOpenCVを使用することで、画像の読み込み、加工、保存が簡単に行えます。
特に、画像を保存する際にはcv2.imwrite()関数
を使用します。
この関数を使うことで、指定したファイル名と形式で画像を保存することができます。
この記事では、OpenCVを用いた画像の保存方法について詳しく解説し、実際のサンプルコードを通じてその使い方を紹介します。
cv2.imwrite()の使い方
cv2.imread()で画像を読み込む
画像を保存する前に、まずは画像を読み込む必要があります。
OpenCVでは、cv2.imread()関数
を使用して画像を読み込むことができます。
この関数は、指定したファイルパスから画像を読み込み、NumPy配列として返します。
import cv2
# 画像を読み込む
image = cv2.imread('input_image.jpg')
画像の表示と確認
読み込んだ画像を確認するためには、cv2.imshow()関数
を使用して画像を表示します。
表示されたウィンドウは、任意のキーを押すことで閉じることができます。
# 画像を表示する
cv2.imshow('Loaded Image', image)
cv2.waitKey(0) # 任意のキーが押されるまで待機
cv2.destroyAllWindows() # ウィンドウを閉じる
cv2.imwrite()で画像を保存する
画像を保存するには、cv2.imwrite()関数
を使用します。
この関数は、保存するファイル名と画像データを引数に取ります。
以下のコードでは、読み込んだ画像を新しいファイル名で保存します。
# 画像を保存する
cv2.imwrite('output_image.jpg', image)
保存に成功したか確認する方法
画像が正しく保存されたかどうかを確認するためには、os.path
モジュールを使用してファイルの存在をチェックします。
以下のコードでは、保存したファイルが存在するかどうかを確認します。
import os
# 保存したファイルの存在を確認する
if os.path.exists('output_image.jpg'):
print('画像が正常に保存されました。')
else:
print('画像の保存に失敗しました。')
画像の圧縮率や品質を指定する方法
JPEG形式で画像を保存する際には、圧縮率や品質を指定することができます。
cv2.imwrite()関数
の第3引数に、保存する際のオプションを指定することで、品質を調整できます。
以下の例では、品質を90に設定しています。
# 画像をJPEG形式で保存し、品質を指定する
cv2.imwrite('output_image_quality.jpg', image, [int(cv2.IMWRITE_JPEG_QUALITY), 90])
このように、OpenCVを使用することで、画像の読み込みから保存までを簡単に行うことができます。
画像の保存形式とその違い
画像を保存する際には、さまざまな形式が存在します。
それぞれの形式には特徴があり、用途に応じて使い分けることが重要です。
以下では、代表的な画像保存形式について解説します。
JPEG形式で保存する
JPEG(Joint Photographic Experts Group)形式は、写真やリアルな画像を保存するのに適した形式です。
圧縮率が高く、ファイルサイズを小さくすることができますが、圧縮に伴い画質が劣化することがあります。
# JPEG形式で画像を保存する
cv2.imwrite('output_image.jpg', image)
PNG形式で保存する
PNG(Portable Network Graphics)形式は、可逆圧縮を使用しているため、画質を損なうことなく画像を保存できます。
透明度をサポートしているため、ウェブデザインやグラフィックデザインでよく使用されます。
# PNG形式で画像を保存する
cv2.imwrite('output_image.png', image)
BMP形式で保存する
BMP(Bitmap)形式は、非圧縮の画像形式で、画質が非常に高いですが、ファイルサイズが大きくなります。
主にWindows環境で使用されることが多いですが、一般的にはあまり使用されません。
# BMP形式で画像を保存する
cv2.imwrite('output_image.bmp', image)
TIFF形式で保存する
TIFF(Tagged Image File Format)形式は、高品質な画像を保存するための形式で、可逆圧縮や非圧縮のオプションがあります。
印刷業界やアーカイブ用途でよく使用されますが、ファイルサイズが大きくなることがあります。
# TIFF形式で画像を保存する
cv2.imwrite('output_image.tiff', image)
各形式の特徴と用途
形式 | 特徴 | 用途 |
---|---|---|
JPEG | 高圧縮率、画質劣化あり | 写真、ウェブ画像 |
PNG | 可逆圧縮、透明度サポート | ウェブデザイン、グラフィック |
BMP | 非圧縮、高画質、ファイルサイズ大 | Windows環境、特定用途 |
TIFF | 高品質、可逆圧縮・非圧縮オプションあり | 印刷業界、アーカイブ用途 |
このように、画像の保存形式にはそれぞれの特徴があり、用途に応じて適切な形式を選択することが重要です。
画像の加工と保存
OpenCVを使用すると、画像をさまざまに加工した後に保存することができます。
以下では、画像のリサイズ、回転、色変換、トリミング、テキストや図形の追加について解説します。
画像のリサイズと保存
画像のリサイズは、cv2.resize()関数
を使用して行います。
新しいサイズを指定することで、画像を拡大または縮小できます。
import cv2
# 画像を読み込む
image = cv2.imread('input_image.jpg')
# 画像をリサイズする
resized_image = cv2.resize(image, (800, 600)) # 幅800px、高さ600pxにリサイズ
# リサイズした画像を保存する
cv2.imwrite('resized_image.jpg', resized_image)
画像の回転・反転と保存
画像の回転は、cv2.rotate()関数
を使用して行います。
また、画像を反転させるには、cv2.flip()関数
を使用します。
# 画像を回転する
rotated_image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE) # 90度時計回りに回転
# 回転した画像を保存する
cv2.imwrite('rotated_image.jpg', rotated_image)
# 画像を反転する
flipped_image = cv2.flip(image, 1) # 水平方向に反転
# 反転した画像を保存する
cv2.imwrite('flipped_image.jpg', flipped_image)
画像の色変換と保存
画像の色変換は、cv2.cvtColor()関数
を使用して行います。
例えば、BGRからグレースケールに変換することができます。
# 画像をグレースケールに変換する
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# グレースケール画像を保存する
cv2.imwrite('gray_image.jpg', gray_image)
画像のトリミングと保存
画像のトリミングは、NumPyのスライシングを使用して行います。
特定の領域を指定することで、その部分だけを切り出すことができます。
# 画像をトリミングする(左上から幅300px、高さ200pxの領域を切り出す)
cropped_image = image[0:200, 0:300]
# トリミングした画像を保存する
cv2.imwrite('cropped_image.jpg', cropped_image)
画像にテキストや図形を追加して保存
画像にテキストや図形を追加するには、cv2.putText()
やcv2.rectangle()
などの関数を使用します。
# 画像にテキストを追加する
cv2.putText(image, 'Hello, OpenCV!', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
# 画像に矩形を追加する
cv2.rectangle(image, (50, 100), (250, 200), (0, 255, 0), 3)
# 加工した画像を保存する
cv2.imwrite('annotated_image.jpg', image)
このように、OpenCVを使用することで、画像をさまざまに加工し、保存することができます。
これにより、画像処理の幅が広がります。
画像の保存時に発生するエラーと対処法
画像を保存する際には、さまざまなエラーが発生する可能性があります。
以下では、一般的なエラーとその対処法について解説します。
ファイルパスが無効な場合の対処法
指定したファイルパスが無効な場合、画像の保存に失敗します。
このエラーを回避するためには、以下の点を確認してください。
- 正しいパスを指定する: ファイル名やディレクトリ名に誤りがないか確認します。
- ディレクトリが存在するか確認する: 保存先のディレクトリが存在しない場合、エラーが発生します。
必要に応じてディレクトリを作成します。
import os
# 保存先のディレクトリを確認
output_dir = 'output_images'
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 画像を保存する
cv2.imwrite(os.path.join(output_dir, 'image.jpg'), image)
書き込み権限がない場合の対処法
保存先のディレクトリに書き込み権限がない場合、画像の保存に失敗します。
この場合、以下の対処法があります。
- 権限を確認する: 保存先のディレクトリに書き込み権限があるか確認します。
- 別のディレクトリを指定する: 書き込み権限があるディレクトリを指定して保存します。
画像データが正しくない場合の対処法
画像データが正しくない場合、保存処理が失敗することがあります。
これを防ぐためには、以下の点を確認します。
- 画像が正しく読み込まれているか確認する:
cv2.imread()
で画像を読み込んだ後、None
でないことを確認します。
# 画像を読み込む
image = cv2.imread('input_image.jpg')
# 画像が正しく読み込まれているか確認
if image is None:
print('画像の読み込みに失敗しました。')
else:
cv2.imwrite('output_image.jpg', image)
サポートされていないファイル形式の場合の対処法
OpenCVは特定のファイル形式に対応しています。
サポートされていない形式で保存しようとすると、エラーが発生します。
この場合の対処法は以下の通りです。
- 対応形式を確認する: OpenCVがサポートしているファイル形式を確認し、適切な形式で保存します。
- 他のライブラリを使用する: 特定の形式が必要な場合、PIL(Pillow)など他のライブラリを使用して保存することも検討します。
from PIL import Image
# PILを使用して画像を保存する例
image_pil = Image.fromarray(image)
image_pil.save('output_image.tiff') # TIFF形式で保存
これらの対処法を理解し、適切に対応することで、画像の保存時に発生するエラーを効果的に解決できます。
応用例:動画からフレームを抽出して保存
OpenCVを使用すると、動画ファイルから特定のフレームを抽出し、画像として保存することができます。
以下では、動画ファイルの読み込みからフレームの保存までの手順を解説します。
動画ファイルの読み込み
動画ファイルを読み込むには、cv2.VideoCapture()関数
を使用します。
この関数に動画ファイルのパスを指定することで、動画を読み込むことができます。
import cv2
# 動画ファイルを読み込む
video_capture = cv2.VideoCapture('input_video.mp4')
# 動画が正しく読み込まれたか確認
if not video_capture.isOpened():
print('動画の読み込みに失敗しました。')
フレームの抽出方法
動画からフレームを抽出するには、video_capture.read()メソッド
を使用します。
このメソッドは、次のフレームを取得し、成功したかどうかを示すフラグを返します。
# フレームを抽出する
success, frame = video_capture.read()
if success:
print('フレームを抽出しました。')
else:
print('フレームの抽出に失敗しました。')
フレームを画像として保存する
抽出したフレームを画像として保存するには、cv2.imwrite()関数
を使用します。
以下のコードでは、抽出したフレームをJPEG形式で保存します。
# フレームを画像として保存する
cv2.imwrite('extracted_frame.jpg', frame)
フレームの連番保存方法
動画から複数のフレームを連番で保存する場合、ループを使用してフレームを順次抽出し、保存します。
以下の例では、10フレームを保存します。
frame_count = 0
while True:
success, frame = video_capture.read()
if not success:
break # フレームが取得できなくなったら終了
# フレームを連番で保存する
cv2.imwrite(f'frame_{frame_count:03d}.jpg', frame)
frame_count += 1
フレームの保存形式を指定する
フレームを保存する際に、JPEG以外の形式で保存することも可能です。
以下の例では、PNG形式で保存しています。
# フレームをPNG形式で保存する
cv2.imwrite('frame_0.png', frame)
このように、OpenCVを使用することで、動画からフレームを抽出し、さまざまな形式で保存することができます。
これにより、動画解析やデータ収集の幅が広がります。
応用例:Webカメラからキャプチャした画像を保存
OpenCVを使用すると、Webカメラからリアルタイムで画像をキャプチャし、保存することができます。
以下では、Webカメラの接続から画像の保存までの手順を解説します。
Webカメラの接続と画像取得
Webカメラを接続するには、cv2.VideoCapture()関数
を使用します。
引数に0を指定することで、デフォルトのWebカメラを使用します。
import cv2
# Webカメラを接続する
video_capture = cv2.VideoCapture(0)
# Webカメラが正しく接続されているか確認
if not video_capture.isOpened():
print('Webカメラの接続に失敗しました。')
キャプチャした画像の表示
Webカメラから取得した画像を表示するには、video_capture.read()メソッド
を使用してフレームを取得し、cv2.imshow()関数
で表示します。
# 画像をキャプチャして表示する
success, frame = video_capture.read()
if success:
cv2.imshow('Captured Image', frame)
cv2.waitKey(0) # 任意のキーが押されるまで待機
cv2.destroyAllWindows() # ウィンドウを閉じる
else:
print('画像のキャプチャに失敗しました。')
キャプチャした画像を保存する
キャプチャした画像を保存するには、cv2.imwrite()関数
を使用します。
以下のコードでは、キャプチャした画像をJPEG形式で保存します。
# キャプチャした画像を保存する
cv2.imwrite('captured_image.jpg', frame)
保存する画像の解像度を変更する
保存する画像の解像度を変更するには、cv2.resize()関数
を使用します。
以下の例では、幅640px、高さ480pxにリサイズして保存します。
# 画像の解像度を変更する
resized_frame = cv2.resize(frame, (640, 480))
# リサイズした画像を保存する
cv2.imwrite('resized_captured_image.jpg', resized_frame)
キャプチャの自動保存機能を実装する
Webカメラからのキャプチャを自動で行い、一定間隔で画像を保存する機能を実装することも可能です。
以下の例では、5秒ごとに画像を保存します。
import time
# 自動保存機能を実装する
capture_interval = 5 # 保存間隔(秒)
frame_count = 0
while True:
success, frame = video_capture.read()
if not success:
break # フレームが取得できなくなったら終了
# 画像を保存する
cv2.imwrite(f'auto_captured_image_{frame_count:03d}.jpg', frame)
frame_count += 1
# 指定した間隔だけ待機
time.sleep(capture_interval)
このように、OpenCVを使用することで、Webカメラからリアルタイムで画像をキャプチャし、保存することができます。
これにより、監視カメラや自動撮影システムなど、さまざまな応用が可能になります。
応用例:画像の連結と保存
OpenCVを使用すると、複数の画像を連結して1つの画像として保存することができます。
以下では、横や縦に画像を連結する方法や、連結画像のサイズ調整、保存形式、圧縮率の調整について解説します。
複数画像を横に連結して保存
複数の画像を横に連結するには、cv2.hconcat()関数
を使用します。
この関数に連結したい画像のリストを渡すことで、横に連結された画像を得ることができます。
import cv2
# 画像を読み込む
image1 = cv2.imread('image1.jpg')
image2 = cv2.imread('image2.jpg')
# 画像を横に連結する
hconcat_image = cv2.hconcat([image1, image2])
# 連結した画像を保存する
cv2.imwrite('hconcat_image.jpg', hconcat_image)
複数画像を縦に連結して保存
複数の画像を縦に連結するには、cv2.vconcat()関数
を使用します。
この関数も、連結したい画像のリストを渡すことで、縦に連結された画像を得ることができます。
# 画像を縦に連結する
vconcat_image = cv2.vconcat([image1, image2])
# 連結した画像を保存する
cv2.imwrite('vconcat_image.jpg', vconcat_image)
連結画像のサイズ調整
連結した画像のサイズを調整するには、cv2.resize()関数
を使用します。
以下の例では、連結した画像のサイズを800×600にリサイズしています。
# 連結した画像のサイズを調整する
resized_hconcat_image = cv2.resize(hconcat_image, (800, 600))
# リサイズした画像を保存する
cv2.imwrite('resized_hconcat_image.jpg', resized_hconcat_image)
連結画像の保存形式を指定する
連結した画像を保存する際に、JPEG以外の形式で保存することも可能です。
以下の例では、PNG形式で保存しています。
# 連結した画像をPNG形式で保存する
cv2.imwrite('hconcat_image.png', hconcat_image)
連結画像の圧縮率を調整する
JPEG形式で保存する際には、圧縮率や品質を指定することができます。
以下の例では、品質を90に設定してJPEG形式で保存しています。
# 連結した画像をJPEG形式で保存し、品質を指定する
cv2.imwrite('hconcat_image_quality.jpg', hconcat_image, [int(cv2.IMWRITE_JPEG_QUALITY), 90])
このように、OpenCVを使用することで、複数の画像を連結し、さまざまな形式で保存することができます。
これにより、画像のコラージュやデータの視覚化など、さまざまな応用が可能になります。
まとめ
この記事では、OpenCVを使用して画像を保存する方法や、画像の加工、動画からのフレーム抽出、Webカメラからのキャプチャ、画像の連結と保存について詳しく解説しました。
これにより、画像処理の基本的な操作から応用的な技術まで幅広く学ぶことができました。
今後は、実際にOpenCVを使ってさまざまなプロジェクトに挑戦し、画像処理のスキルをさらに向上させてみてください。