静止画を保存する際の画像品質(Jpeg圧縮)の調整
概要
JPEG圧縮は、画像のファイルサイズと画質をバランスを見て調整する事ができます。 圧縮率の低い画像(高品質)は視認性は上がりますが、ファイル保存容量が大きいためPCのストレージを消費します。一方で、JPEG圧縮を使用して圧縮率を高めると、ファイルサイズは小さくなりますが、視認性が下がり画像処理に影響が出ます。そのため、アプリケーションにあった圧縮率を設定する必要があります。
出力結果
画像品質:100% |
画像品質:50% |
画像品質:0% |
実行プログラムと同じディレクトリに「image_0.jpg」と「image_50.jpg」と「image_100.jpg」が生成されます。
プログラム全体
#解説1
import cv2
#解説2
# UVCカメラを開く
cap = cv2.VideoCapture(0)
#解説3
# カメラから画像を取得
ret, image = cap.read()
#解説4
# 画像をJPEG形式で保存します。第二引数のリストでJPEGの品質を指定します。
# [cv2.IMWRITE_JPEG_QUALITY, 50]は、JPEGの品質を50%に設定します。
cv2.imwrite('image_0.jpg', image, [cv2.IMWRITE_JPEG_QUALITY, 0])
cv2.imwrite('image_50.jpg', image, [cv2.IMWRITE_JPEG_QUALITY, 50])
cv2.imwrite('image_100.jpg', image, [cv2.IMWRITE_JPEG_QUALITY, 100])
# カメラを解放
cap.release()
解説
解説1: OpenCVライブラリのインポート
import cv2
OpenCVは、画像処理やコンピュータビジョンのためのオープンソースライブラリです。これを使うことで、画像の読み込み、変換、保存等、画像処理に関連する多くの機能を利用することができます。
解説2: カメラの起動
# UVCカメラを開く
cap = cv2.VideoCapture(0)
ここでは、UVCカメラを開いて、その映像を取得するためのオブジェクトを作成しています。cv2.VideoCapture(0)
という関数は、引数にUVCカメラのIDを取り、そのカメラにアクセスするためのVideoCapture
オブジェクトを返しています。ここでの0
は、通常はシステムに接続されているデフォルトのカメラ(通常は内蔵カメラ)を指しますが、使用しているカメラによって割り振られる番号が異なりますのでご注意ください。
補足:OpenCVにおけるデバイスID
デバイスが複数接続された場合、このIDは、いつも同じとは限りません。デバイスの起動やシステムへの接続順によって変わることがほとんどです。 TheImagingSource社が提供しているSDK(ICImagingControl)ではカメラ本体にシリアル番号が割り振られており、カメラ毎に設定が容易にできます。詳細は下記をご覧ください。 https://www.argocorp.com/software/sdk/ICImagingControl/Sample_program/Python_34/open-with-built-in-dialog.html
解説3: 画像の取得
# カメラから画像を取得
ret, image = cap.read()
ここではカメラから1フレームの画像を取得します。cap.read()
は、カメラから画像を読み込むためのメソッドで、retとimageのそれぞれに値を返します。ret
は画像の読み込みが成功したかどうかを示すブール値(TrueまたはFalse)、image
は取得した画像データです。
解説4: 画像の保存
cv2.imwrite('image_0.jpg', image, [cv2.IMWRITE_JPEG_QUALITY, 0])
cv2.imwrite('image_50.jpg', image, [cv2.IMWRITE_JPEG_QUALITY, 50])
cv2.imwrite('image_100.jpg', image, [cv2.IMWRITE_JPEG_QUALITY, 100])
解説3で取得した画像をJPEG形式で保存しています。cv2.imwrite()
は、第1引数にファイル名(ここでは'image.jpg')、第2引数に解説3で取得した画像データを指定します。第3引数はオプションで、画像の保存時のパラメータを指定できます。ここでは、JPEGの品質を0%,50%,100%に設定しています。
なお、第3引数はオプションcv2.IMWRITE_JPEG_QUALITY
で、画像をJPEG形式で保存する際の品質のパラメータです。この値は0から100までの整数で指定します。
補足:jpeg品質とは
ここでいう品質とは、JPEG形式で画像を保存する際の圧縮率を指します。Jpeg圧縮は、データを圧縮する際に一部の情報を失うことでデータ量を削減しています。 品質が100%(100を指定)の場合、圧縮率は最小(上記の例だと6KB)となり、画像の品質は最大となります。つまり、元の画像データからほとんど情報が失われず、画像の詳細が保たれます。ただし、ファイルサイズは大きくなります。 品質が0%(0を指定)の場合、圧縮率は最大(上記の例だと146KB)となり、画像の品質は最小となります。つまり、元の画像データから多くの情報が失われ、画像の詳細は失われます。ただし、ファイルサイズは小さくなります。 したがって、この値を設定する際には、画像の品質とファイルサイズのバランスを考慮する必要があります。
解説5: カメラの解放
# カメラを解放
cap.release()
ここでは、カメラリソースを解放しています。カメラやファイルなどのリソースを開いた後は、それらがもう必要ないときには必ず解放する必要があります。これにより、そのリソースを他のプログラムが使用できるようになります。この行がないと、プログラムが終了してもカメラが開いたままになり、他のプログラムから使用できなくなる可能性があります。