LoginSignup
35
36

More than 5 years have passed since last update.

OpenCVを利用して画像を圧縮(encode→decode)する

Last updated at Posted at 2018-01-14

画像を任意の圧縮率で圧縮したいときのメモ。複数の画像をまとめて処理したいことが多いので入力値は画像のリストになっていることに注意。

動作環境

  • 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

test95.jpg

ファイルサイズは580kB。画像の劣化はみられない。

quality=50

test50.jpg

ファイルサイズは324kB。まだ画像の劣化はみられず。

quality=25

test25.jpg

ファイルサイズは253kB。若干ノイズが出てきたか?

quality=5

test5.jpg

ファイルサイズは134kB。かなりノイズがきつい感じ。

35
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
36