JPG画像を圧縮する OpenCV + Python

2019-01-20
python%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86opencv
    

目次

概要

ブログなどにアップする画像を比較的簡単に圧縮する方法がないか探していたところ、 PythonとOpenCVで簡単に実装出来そうでした。

そこで、Python + OpenCVで画像を圧縮する方法を紹介します。

環境

  • OpenCV 3.4.3
  • Python 3.7.1
  • Mac OS X

説明

実装では imencode と imdecode を組み合わせて、画像の圧縮を実現しています。 imencode と imdecode については以下のページで詳しく解説されています。

http://opencv.jp/opencv-2svn/cpp/readingandwritingimagesand_video.html

ソース

https://gist.github.com/s-yoshiki/467598f1d41f0d0611275eccc898f9c8

#!/usr/local/bin/python3

import cv2
import numpy as np
import argparse

def compress_image(src, quality=50):
    """
    param src 画像データ
    param quality 画像クオリティ 1~100 
    return 圧縮された画像
    """

    channel = 1

    (result, encimg) = cv2.imencode('.jpg', src, [
        int(cv2.IMWRITE_JPEG_QUALITY),
        quality
    ])

    if result == False:
        return (1)

    dst = cv2.imdecode(encimg, channel)
    return (0, dst)

if __name__ == "__main__" :
    parser = argparse.ArgumentParser(description='jpg encoder given images.')
    parser.add_argument("input", type=str, help='input file')
    parser.add_argument("-q", type=str, default='50', help='quality (0 to 100)')
    parser.add_argument("-o", type=str, default='a.jpg', help='output file (default=a.png)')

    args = parser.parse_args()

    img = cv2.imread(args.input)

    (status, img) = compress_image(img, int(args.q))

    if status == 0:
        cv2.imwrite(args.o, img)
        exit(0)
    else:
        print('could not encode image!')
        exit(1)

セットアップ

上記のソースコード compress_image.py を適当なディレクトリに配置します。

以下のようにコマンドを叩くことで、圧縮された画像を生成することができます。

python3 compress_image.py ./path/to/src.jpg -o ./path/to/dst.jpg -q 80

この場合、 ./path/to/src.jpgを読み込み、80%のクオリティで ./path/to/dst.jpgに出力します。

実験

元画像サイズを527KBとした時

クオリティ サイズ
100 516KB
80 499KB
50 360KB
30 321KB
10 194KB
1 89KB
といった具合になりました。 クオリティが30以下は正直使い物になるような品質ではありませんが、50くらいなら十分使えそうです。
    
s-yoshiki
s-yoshiki
githubtwitterqiita
Web作ってますが、インタラクティブなプログラミングも好きです。
JavaScript / Vue / node.js / PHP / AWS / OpenCV

関連記事

Selenium + Python でYahooのログインや検索・メールの操作を自動化する。
環境 Selenium環境の構築 Seleniumのインストール 検証 Yahoo検索する Yahooにログイン/ログアウトする Yahooメールの操作〜ゴミ箱を空にする サンプルソース 参考 Selenium + PythonでYahoo…

macOSにOpenCV4をインストール
パッケージの情報 インストール 試す with Python3 macOS (MacBook Pro 2018 13 inchi)にhomebrewを用いてOpenCVをインストールする方法。 パッケージの情報 まず、brew search と brew info…

エンジニアなMacBookのセットアップ 開発環境の構築
ブラウザ関連 Homebrewのインストール ターミナル環境系 Hyper エディタ VSCode typora CLIツール Git 言語系 Python node.js MacBookPro…

OpenCV.jsを動かしてみる + デモ
環境 OpenCV.jsのセットアップ サンプルソース グレースケール 2値化 Cannyエッジ 輪郭抽出 ガウシアン デモ OpenCV.jsを試してみました。 環境 OpenCV.js v4.1.0 OpenCV.jsのセットアップ OpenCVをWasm…

JavaScriptで画像のヒストグラムの正規化
サンプルソース 画像のヒストグラムを正規化するコードの紹介 サンプルソース

画像のヒストグラムを表示する Chart.js JavaScript canvas
ヒストグラム算出のサンプルコード インストール ヒストグラム表示クラス ヒストグラム算出 デモ 出力結果 参考 画像のヒストグラムをJavaScriptで算出してグラフとして表示してみます。 ヒストグラム算出のサンプルコード ヒストグラムの表示にChart.js…

画像のプーリング処理 canvas + JavaScript
プーリング処理について サンプルソース デモ 参考文献 JavaScriptで画像のプーリング処理を行ってみました。 プーリング処理について プーリングは畳み込みに似た処理で、CNN…

画像の減色処理 サンプルコードとデモ JavaScript + canvas
減色処理について デモ ソース 画像の減色処理を行ってみた。 サンプルコードとデモの紹介。 環境は JavaScript + Canvas。 減色処理について 通常、Canvas上での画像のRGBそれぞれの値は0〜255までの256^…

画像のHSV変換 JavaScript + canvas
デモ ソース 参考 画像のHSV変換を行うサンプルコードとデモの紹介 デモ 以下のリンクでデモを動かしています。 https://s-yoshiki.github.io/Gasyori100knockJS/#/questions/ans5 デモの内容はRGB…

大津の二値化で画像を2値化 JavaScript + canvas 【画像処理】
デモ サンプルソース 大津の2値化 大津の二値化で画像を2値化するサンプルコード https://tech-blog.s-yoshiki.com/2019/04/1115/ ↑のサンプルコードでは閾値を128として決め打ちで…

最新の投稿

Python poetryでパッケージ開発 PyPIで公開 Pytestでテスト CIをGitHub Actionsで回す
Poetry でパッケージ開発 pytest でユニットテストを実施しカバレッジを算出する パッケージをビルドし PyPI で公開する 検証環境にデプロイする 本番環境にデプロイする GitHub Actions で CI を回す codecovの設定 GitHub…

Perlでconstant(定数)をhashのキーに使う
ハマった事象 解決方法 1 括弧をつける 2 & をつける 参考にしたサイト Perlでconstant(定数)をhash…

php-fpmのステータスページを表示 Apache & htaccess
試した環境 php-fpm の pm.status_path について php-fpmのconfの設定 .htaccess の設定 アクセスしてみる 参考にしたサイト Apache環境で php-fpm のステータスページを htaccess…

DBクライアントツールはDBeaverをおすすめしたい
DBeaver について 特徴 対応DB 対応OS 利用環境 アーカイブ インストール windows mac Linux コネクションの作成 SQLを実行する その他 CloudBeaverについて 今までいくつかのDB…

CentOS8 に Oracle12.2 clientをインストールする
実施した環境 セットアップ clientツールの 準備 インストール 環境変数にパスを通す 実行 libnsl.so.1: cannot open shared object file と表示される場合 CentOS8 に Oracle12.2 client…

フェールセーフやフェールソフト・フールプルーフ 障害対策用語の整理

JSで32ビット符号付き整数に対してのビット演算でハマった
具体例 参考にしたサイト JSでサブネットマスクの計算を行おうとしたとき、ビット演算でハマりました。その時のメモです。 JSでサブネットマスクの計算 JSでビット演算子を利用する場合 3…

Gitにプロキシを設定する
プロキシを設定する 確認 Gitでプロキシを通しておくメモです。 プロキシを設定する 以下のコマンドでproxyを通します。 ※ がプロキシのURL…

JSでIPアドレスがサブネットマスクで指定した範囲内にあるか判定する
IPアドレスが指定した範囲内にあるかどうか判定 参考にしたサイト JSでIPアドレス(IPv4)が指定したサブネットの範囲に含まれるか判定するロジックを作った時の記録です。 IPアドレスが指定した範囲内にあるかどうか判定 処理としては、IP…

プログラムの数値計算で発生する誤差の種類 丸め誤差・打ち切り誤差・桁落ち
はじめに 誤差の種類 丸め誤差 打ち切り誤差 桁落ち 情報落ち 桁溢れ誤差 参考にしたサイト コンピュータで出てくる誤差はいくつかありますが、 それらをコードに落として整理しました。 はじめに 例えば の計算の答えは 0.6666666666…

Tags

Dates

© 2021   404 motivation not found