「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > OpenCV による画像圧縮の完全ガイド

OpenCV による画像圧縮の完全ガイド

2024 年 11 月 8 日に公開
ブラウズ:151

画像圧縮は、視覚的な品質を維持しながら、画像をより効率的に保存および送信できるようにする、コンピュータ ビジョンにおける重要なテクノロジです。理想的には、小さなファイルを最高の品質で提供したいと考えています。ただし、トレードオフを考慮して、どちらがより重要かを決定する必要があります。

このチュートリアルでは、理論と実践的なアプリケーションをカバーしながら、OpenCV を使用した画像圧縮について説明します。最後には、コンピューター ビジョン プロジェクト (またはその他のプロジェクト) で写真を適切に圧縮する方法を理解できるようになります。

画像圧縮とは何ですか?

画像圧縮とは、許容可能なレベルの視覚的な品質を維持しながら、画像のファイル サイズを削減することです。圧縮には主に 2 つのタイプがあります:

  1. ロスレス圧縮: 元のデータをすべて保存し、正確な画像の再構築を可能にします。
  2. 非可逆圧縮: ファイル サイズを小さくするために一部のデータを破棄し、画質が低下する可能性があります。

画像を圧縮する理由

よく聞くように「ディスク容量が安い」のであれば、なぜ画像を圧縮する必要があるのでしょうか?小規模な規模では画像圧縮はあまり重要ではありませんが、大規模な規模では非常に重要になります。

たとえば、ハード ドライブにいくつかの画像がある場合、それらを圧縮して数メガバイトのデータを保存できます。ハードドライブがテラバイト単位で測定される場合、これは大きな影響はありません。しかし、ハード ドライブに 100,000 枚の画像がある場合はどうなるでしょうか?いくつかの基本的な圧縮により、リアルタイムの時間と費用が節約されます。パフォーマンスの観点から見ても、それは同じです。 Web サイトに大量の画像があり、1 日に 10,000 人が Web サイトにアクセスする場合、圧縮が重要になります。

そうする理由は次のとおりです:

  • ストレージ要件の削減: 同じスペースにより多くの画像を保存できます
  • 高速伝送: Web アプリケーションや帯域幅に制約のあるシナリオに最適
  • 処理速度の向上: 画像が小さいほど、読み込みと処理が速くなります

画像圧縮の背後にある理論

画像圧縮技術は 2 種類の冗長性を利用します:

  1. 空間冗長性: 隣接するピクセル間の相関
  2. 色の冗長性: 隣接する領域の色の値の類似性

空間冗長性は、ほとんどの自然画像では隣接するピクセルが同様の値を持つ傾向があるという事実を利用します。これにより、スムーズなトランジションが作成されます。ある領域から別の領域への自然な流れがあるため、多くの写真は「本物のように見えます」。隣接するピクセルの値が大きく異なる場合、「ノイズの多い」画像が得られます。ピクセルを単一の色にグループ化し、画像を小さくすることで、トランジションの「滑らかさ」を低下させるためにピクセルが変更されました。

The Complete Guide to Image Compression with OpenCV

一方、

色の冗長性は、画像内の隣接する領域がどのように類似した色を共有することが多いかに焦点を当てています。青い空や緑の野原を思い浮かべてください。画像の大部分が非常に似た色の値を持っている可能性があります。グループ化して単色にしてスペースを節約することもできます。

The Complete Guide to Image Compression with OpenCV

OpenCV は、これらのアイデアに取り組むための強力なツールを提供します。たとえば、OpenCV の cv2.inpaint() 関数は、空間的冗長性を使用して、近くのピクセルからの情報を使用して画像の欠落または破損した領域を埋めます。 OpenCV では、開発者は cv2.cvtColor() を使用して、色の冗長性に関して複数の色空間間で画像を変換できます。特定の種類の画像をエンコードする場合、一部の色空間が他の色空間より効果的であるため、これは多くの圧縮技術の前処理ステップとしてある程度役立ちます。

この理論の一部を今からテストしてみます。遊んでみましょう。

画像圧縮の実践

OpenCV の Python バインディングを使用して画像を圧縮する方法を見てみましょう。このコードを書き出すかコピーします:

ここからソース コードも入手できます

import cv2
import numpy as np

def compress_image(image_path, quality=90):
    # Read the image
 img = cv2.imread(image_path)
    
    # Encode the image with JPEG compression
 encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), quality]
 _, encoded_img = cv2.imencode('.jpg', img, encode_param)
    
    # Decode the compressed image
 decoded_img = cv2.imdecode(encoded_img, cv2.IMREAD_COLOR)
    
    return decoded_img

# Example usage
original_img = cv2.imread('original_image.jpg')
compressed_img = compress_image('original_image.jpg', quality=50)

# Display results
cv2.imshow('Original', original_img)
cv2.imshow('Compressed', compressed_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

# Calculate compression ratio
original_size = original_img.nbytes
compressed_size = compressed_img.nbytes
compression_ratio = original_size / compressed_size
print(f"Compression ratio: {compression_ratio:.2f}")

この例には、2 つのパラメータを取る compress_image 関数が含まれています:

  • 画像パス (画像が配置されている場所)
  • 品質 (希望する画像の品質)

次に、元の画像をoriginal_imgに読み込みます。次に、同じ画像を 50% 圧縮して、新しいインスタンス (compressed_image) にロードします。

次に、元の画像と圧縮された画像を並べて表示します。

次に圧縮率を計算して表示します。

この例では、OpenCV で JPEG 圧縮を使用して画像を圧縮する方法を示します。品質パラメータは、ファイル サイズと画質のトレードオフを制御します。

実行しましょう:

The Complete Guide to Image Compression with OpenCV

最初に画像を見てみると、ほとんど違いがわかりません。ただし、ズームインすると品質の違いがわかります:

The Complete Guide to Image Compression with OpenCV

そしてウィンドウを閉じてファイルを見ると、ファイルのサイズが大幅に縮小していることがわかります:

The Complete Guide to Image Compression with OpenCV

また、さらに下げると、品質を 10% に変更できます

compressed_img = compress_image('sampleimage.jpg', quality=10)

そして結果はさらに劇的です:

The Complete Guide to Image Compression with OpenCV

ファイル サイズの結果もさらに大幅に大きくなります:

The Complete Guide to Image Compression with OpenCV

これらのパラメータを非常に簡単に調整して、品質とファイル サイズの間で望ましいバランスを実現できます。

圧縮品質の評価

圧縮の影響を評価するには、次のような指標を使用できます:

  1. 平均二乗誤差 (MSE)

平均二乗誤差 (MSE) は、2 つの画像が互いにどの程度異なっているかを測定します。イメージを圧縮する場合、MSE は、圧縮されたイメージが元のイメージと比較してどの程度変更されたかを判断するのに役立ちます。

これは、2 つの画像内の対応するピクセルの色の違いをサンプリングし、それらの差を 2 乗して平均することによって行われます。結果は 1 つの数値になります。MSE が低いほど、圧縮されたイメージがオリジナルに近いことを意味します。比較すると、MSE が高いということは、品質の低下がより顕著であることを意味します。

これを測定するための Python コードをいくつか示します:

def calculate_mse(img1, img2):
    return np.mean((img1 - img2) ** 2)

mse = calculate_mse(original_img, compressed_img)
print(f"Mean Squared Error: {mse:.2f}")

デモ画像の圧縮は次のようになります:

The Complete Guide to Image Compression with OpenCV

  1. ピーク信号対雑音比 (PSNR)

ピーク信号対雑音比 (PSNR) は、圧縮後に画像の品質がどの程度劣化したかを示す尺度です。これは多くの場合、目で見ることができますが、設定された値が割り当てられます。元の画像と圧縮された画像を比較し、その差を比率で表します。

PSNR 値が高いほど、圧縮された画像の品質がオリジナルに近く、品質の低下が少ないことを意味します。 PSNR が低いほど、劣化が目立ちやすくなります。 PSNR は MSE と併用されることが多く、PSNR は高いほど優れているという解釈しやすいスケールを提供します。

これを測定する Python コードを次に示します:

def calculate_psnr(img1, img2):
 mse = calculate_mse(img1, img2)
    if mse == 0:
        return float('inf')
 max_pixel = 255.0
    return 20 * np.log10(max_pixel / np.sqrt(mse))

psnr = calculate_psnr(original_img, compressed_img)
print(f"PSNR: {psnr:.2f} dB")

デモ画像の圧縮は次のようになります:

The Complete Guide to Image Compression with OpenCV

圧縮後の画像を「目視」して品質に問題がないことを判断します。ただし、大規模な場合は、スクリプトでこれを実行する方が、標準を設定し、画像がそれに従うようにするためのはるかに簡単な方法です。

他のテクニックをいくつか見てみましょう:

高度な圧縮技術

より高度な圧縮のために、OpenCV はさまざまなアルゴリズムをサポートしています:

  1. PNG 圧縮:

画像を PNG 形式に変換すると、多くの利点があります。次のコード行を使用すると、ニーズに応じて圧縮を 0 から 9 まで設定できます。 0 は圧縮がまったくないことを意味し、9 は最大です。 PNG は「ロスレス」形式であるため、最大圧縮しても画像はそのまま残ることに注意してください。大きなトレードオフは、ファイル サイズと圧縮時間です。

OpenCV で PNG 圧縮を使用するコードは次のとおりです:

cv2.imwrite('compressed.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 9])

結果は次のとおりです:

The Complete Guide to Image Compression with OpenCV

注: この場合のように、PNG ファイルのサイズが実際には大きいことに気づく場合があります。画像の内容により異なります。

  1. WebP 圧縮:

画像を .webp 形式に変換することもできます。これは、人気が高まっている新しい圧縮方法です。私は何年もブログの画像にこの圧縮を使用してきました。

次のコードでは、画像を webp ファイルに書き込み、圧縮レベルを 0 から 100 まで設定できます。0 であるため、PNG のスケールとは逆になります。これは、代わりに quality を設定しているためです。 圧縮。 0 に設定すると、ファイル サイズが小さくなり、損失が大きくなり、品質が最低となるため、この小さな違いは重要です。 100 が最高品質です。これは、最高の画質を持つ大きなファイルを意味します。

これを実現するための Python コードは次のとおりです:

cv2.imwrite('compressed.webp', img, [cv2.IMWRITE_WEBP_QUALITY, 80])

結果は次のとおりです:

The Complete Guide to Image Compression with OpenCV

これら 2 つの手法は、大量のデータを圧縮するのに最適です。スクリプトを作成して、数千または数十万の画像を自動的に圧縮できます。

結論

画像圧縮は素晴らしいです。これは、特にスペースを節約したり処理速度を向上させたりする場合に、さまざまな点でコンピューター ビジョン タスクに不可欠です。ハード ドライブの容量を減らしたり、帯域幅を節約したい場合には、コンピューター ビジョン以外にも多くの使用例があります。画像圧縮は非常に役立ちます。

その背後にある理論を理解し、それを適用することで、プロジェクトで強力な効果を得ることができます。

効果的な圧縮の鍵は、ファイル サイズの削減とアプリケーションにとって許容可能なビジュアル品質の維持の間のスイート スポットを見つけることであることを覚えておいてください。

お読みいただきありがとうございます。コメントやご質問がございましたら、お気軽にお問い合わせください。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/jeremycmorgan/the-complete-guide-to-image-compression-with-opencv-2bld?1 侵害がある場合は、削除するために[email protected]に連絡してください。それ
最新のチュートリアル もっと>
  • PDO_ODBC を使用して Access から UTF-8 アクセント付き文字を正しく取得する方法
    PDO_ODBC を使用して Access から UTF-8 アクセント付き文字を正しく取得する方法
    PDO_ODBC 経由で Access から UTF-8 アクセント記号付き文字を取得できませんPHP ODBC、特に PDO_ODBC 経由で Access データベースからデータを取得しようとすると、非標準です文字が正しくインポートされず、特殊文字の代わりに疑問符が表示されるなどの問題が発生する...
    プログラミング 2024 年 11 月 8 日に公開
  • Java の登場 新機能 ?
    Java の登場 新機能 ?
    Java 23 が正式にリリースされました。これは非 LTS (長期サポート) リリースです。短期間のバージョンではありますが、Java 23 にはエキサイティングな改善、バグ修正が満載されており、また、注意を払う必要がある削除された機能やオプションも含まれています。 新機能と、それが JDK 21...
    プログラミング 2024 年 11 月 8 日に公開
  • jQuery を使用してキーボードの Enter キーを検出する方法: 包括的なガイド
    jQuery を使用してキーボードの Enter キーを検出する方法: 包括的なガイド
    jQuery を使用したキーボード Enter キーの検出: 総合ガイドインタラクティブな Web アプリケーションを構築する場合、ユーザー入力の検出は非常に重要です。一般的なタスクの 1 つは、Enter キーの押下をキャプチャすることです。この記事では、jQuery を使用してこれをシームレスに...
    プログラミング 2024 年 11 月 8 日に公開
  • 文字列と文字列
    文字列と文字列
    弦 小文字の文字列は、JavaScript の プリミティブ データ型です。 この型で作成された文字列はオブジェクトではありませんが、JavaScript は自動的に文字列を String オブジェクトでラップします (これを「ボックス化」と呼びます)。 let imAString...
    プログラミング 2024 年 11 月 8 日に公開
  • C++ と Python で出力文字列を右揃えにする方法
    C++ と Python で出力文字列を右揃えにする方法
    右揃えで出力文字列をフォーマットするテキスト ファイルを操作する場合、データを一貫して揃えることで読みやすさと分析を向上させることができます。 C では、出力文字列を右揃えでフォーマットするにはどうすればよいのかという疑問が生じます。Python のフォーマット構文を使用すると、解決策は簡単です。l...
    プログラミング 2024 年 11 月 8 日に公開
  • ハクトーバーフェスト第 2 週
    ハクトーバーフェスト第 2 週
    2 週目では、問題の検索に費やす時間が減りました。今回は、Mattermost のドキュメント Web サイトのダーク モードで発生したバグで、特定のボタンの色が正しくなくなりました。 Docusaurus のことは知っています。他のドキュメントや、それをベースに構築されたコース教材サイトの一部を見...
    プログラミング 2024 年 11 月 8 日に公開
  • Python の Try/Except と If/Else: どちらのアプローチがより効果的ですか?
    Python の Try/Except と If/Else: どちらのアプローチがより効果的ですか?
    Try/Except と If/Else: どちらのアプローチが好ましいですか?Python で例外を扱う場合、開発者は多くの場合ジレンマに直面します。有効性をテストするか、アクションを試行して結果として生じる例外を処理するかどうか。この記事では、各アプローチのニュアンスを詳しく掘り下げ、意思決定に...
    プログラミング 2024 年 11 月 8 日に公開
  • Git リモート ブランチ
    Git リモート ブランチ
    今週、他の人のリポジトリに機能を追加する必要がありました。具体的には、CLI ツールのデフォルト パラメータを含むデフォルト設定 TOML ファイルをユーザーの $HOME フォルダ内に追加する必要がありました。 readMeMaker リポジトリに貢献しました: https://github.co...
    プログラミング 2024 年 11 月 8 日に公開
  • 単純な操作の場合、ストリームは常に従来のコレクションよりも遅いですか?
    単純な操作の場合、ストリームは常に従来のコレクションよりも遅いですか?
    Java 8 ストリームのパフォーマンスと従来のコレクションあなたは最近 Java 8 に挑戦し、そのストリーム API のパフォーマンスを従来のコレクションと比較する非公式のベンチマークを実施しました。テストには、整数のリストのフィルター処理、偶数の平方根の抽出、結果の Double リストへの保...
    プログラミング 2024 年 11 月 8 日に公開
  • 母国語を追加できる言語 API。
    母国語を追加できる言語 API。
    2016 年 4 月に、私は大好きな部族「イゲデ語」のための辞書プロジェクトを作成するというアイデアを思いつきました。ネイティブスピーカーではありません。 これが私にイゲデ言語から 5,000 語以上の単語を書いて英語に翻訳するきっかけになりました。これは間違いなく、私がこれまでに取り組んだ、ある...
    プログラミング 2024 年 11 月 8 日に公開
  • Playwright、TypeScript、JavaScript を使用した自動化
    Playwright、TypeScript、JavaScript を使用した自動化
    TypeScript を使用した劇作家 | JavaScriptのインストール Playwright は、Puppeteer チームとの協力による Microsoft の最新の Web ベースの API 自動化ツールです。Puppeteer は、DevTools プロトコルまたは WebDriver...
    プログラミング 2024 年 11 月 8 日に公開
  • Pythonの整数は何桁になるのでしょうか?
    Pythonの整数は何桁になるのでしょうか?
    整数内の桁数を数えるPython では、整数には長さという固有の概念がありません。ただし、整数の桁数を決定する必要がある場合は、いくつかの方法を検討できます。文字列に変換する1 つの簡単な方法は次のとおりです。整数を文字列に変換し、結果の文字列の長さをカウントします。例:length = len(s...
    プログラミング 2024 年 11 月 8 日に公開
  • Z-Index を使用すると、擬似要素がヘッダー要素の上に表示されるのはなぜですか?
    Z-Index を使用すると、擬似要素がヘッダー要素の上に表示されるのはなぜですか?
    Z-Index と擬似要素: ケーススタディCSS では、z-index プロパティは要素の積み重ね順序を指定します。ページで、どの要素が他の要素の「前」または「後ろ」に表示されるかを決定します。ただし、::before や ::after などの疑似要素に関しては、z-index との相互作用が単...
    プログラミング 2024 年 11 月 8 日に公開
  • タグを削除する前に頑固な HTML 特殊文字を削除するにはどうすればよいですか?
    タグを削除する前に頑固な HTML 特殊文字を削除するにはどうすればよいですか?
    頑固な HTML 特殊文字の除去strip_tags 関数は、HTML タグの削除には優れていますが、次のような厄介な HTML 特殊文字には対処できません。非改行スペースの場合は「©」、著作権記号の場合は「©」です。これは、クリーンな RSS フィードを作成する際の障害となる可能性があります。この...
    プログラミング 2024 年 11 月 8 日に公開
  • GoでAES ECBモード暗号化を復号化する方法?
    GoでAES ECBモード暗号化を復号化する方法?
    Go での AES ECB 暗号化AES ECB モード暗号化では、平文の各ブロックが個別に暗号化されますが、単純ですが安全ではない可能性のある暗号化です。方法。 Go では、次のコードを使用して AES ECB 復号化を実行できます:package main import ( "...
    プログラミング 2024 年 11 月 8 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3