画像を任意の圧縮率で圧縮したいときのメモ。複数の画像をまとめて処理したいことが多いので入力値は画像のリストになっていることに注意。
動作環境
- Ubuntu 16.04
- Python 3.5.2
- numpy 1.13.3
- opencv-python 3.2
概要
とりあえず使用したい場合は以下を利用
import cv2
def imgEncodeDecode(in_imgs, ch, quality=5):
"""
入力された画像リストを圧縮する
[in] in_imgs: 入力画像リスト
[in] ch: 出力画像リストのチャンネル数 (OpenCV形式)
[in] quality: 圧縮する品質 (1-100)
[out] out_imgs: 出力画像リスト
"""
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), quality]
out_imgs = []
for img in in_imgs:
result, encimg = cv2.imencode('.jpg', img, encode_param)
if False == result:
print('could not encode image!')
exit()
decimg = cv2.imdecode(encimg, ch)
out_imgs.append(decimg)
return out_imgs
画像をメモリ上で圧縮する(encode)
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), quality]
result, encimg = cv2.imencode('.jpg', img, encode_param)
qualityには1-100の数値を入力する。高いほど高品質で、低いほど高圧縮になる。詳細はドキュメントを参照されたい。
圧縮されたメモリ上の画像を復元する(decode)
decimg = cv2.imdecode(encimg, ch)
encimgはencodeで作成されたオブジェクト、chにはOpenCV形式の画像チャンネルフラグ(CV_LOAD_IMAGE_*
やIMREAD_*
)を使用する。詳細はドキュメントを参照されたい。
使用例
img = cv2.imread(args.jpeg[0])
img = imgEncodeDecode([img], ch, 95)
cv2.imwrite('test.jpg', img[0])
quality=95
ファイルサイズは580kB。画像の劣化はみられない。
quality=50
ファイルサイズは324kB。まだ画像の劣化はみられず。
quality=25
ファイルサイズは253kB。若干ノイズが出てきたか?
quality=5
ファイルサイズは134kB。かなりノイズがきつい感じ。