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として決め打ちで…

最新の投稿

SQL整形ツールを作成した
特徴 使い方 FW/ライブラリ等 nuxt sql-formatter-plus Monaco Editor おまけ ソース SQL整形ツールを作成しました。 URLはこちらです。 SQL…

ファイルの1行目を表示 Linuxコマンド head
head コマンド例 headコマンドでファイルの 1行目もしくは指定した行数だけ表示する方法。 head 利用できるオプション コマンド例 の 1行目だけを表示 の 5行目までを表示 カレントディレクトリ以下の全てのtxtファイルの1行目を表示

Amazon S3 と ローカルファイルのチェックサムの比較
s3apiでEtagを取得 検証 マルチアップロード時の注意点 Amazon S3 の Etagを使ってファイルの整合性チェックをする。 s3apiでEtagを取得 S3 APIを利用するとEtagを取得します。この値はmd5のハッシュ値になります。 検証 MD…

github.io / gitlab.ioで公開されている質の高い技術ドキュメント
AWSによるクラウド入門 Pythonプログラミング入門 普通の人が資産運用で99点をとる方法とその考え方 2018年の段階で私が知らないこと github.io / gitlab.io で無料で公開されている興味深いドキュメントのmemo AWS…

10進数から2進数 2進数から10進数への変換 JavaScript
10進数から2進数 2進数から10進数 テスト 10進数から2進数、2進数から10進数への変換を行うJavaScriptのコードの紹介。 JSの場合、10進数から2進数への変換はメソッド。2進数から1…

JavaScriptの配列ショートハンド (AtCoder用)

JavaScriptでワーシャルフロイド法を実装
AtCoder ABC012 D問題 D - バスと避けられない運命 解説 実装 AtCoder ABC012 の D問題でワーシャルフロイド法が利用できる問題が出てきたので、 JavaScriptで実装しました。 AtCoder ABC012 D問題 D…

GitHub Actions で Gatsby をビルドし Amazon S3 にデプロイする
GitHub Actions について あらかじめ準備しておくもの AWS IAM ユーザを環境変数にセットする workflowの記述 ビルド バッジを利用する 終わりに 参考にしたところ Gatsbyで作った静的サイトを、GitHub Actions…

cloudinaryによる画像ファイルの管理 はじめてみる
目的 cloudinary について 他のサービスとの比較 料金プラン アカウントの登録 利用してみる ダッシュボード 画像の編集 APIベースでのアクセス 感想 参考 画像の管理や配信、さらには加工といった事ができるsaas型のcloud…

JavaScriptによる2分探索(バイナリサーチ) のサンプルコード
2分探索について ソース 参考 JavaScriptで2分探索(バイナリサーチ)を実装してみました。…

Tags

Dates

© 2020   404 motivation not found