0

Pythonを使用して、RAMにロードしたり処理したりせずに(CPUを節約するために)画像(可能な場合は圧縮形式)から単一のピクセルを直接取得する(取得するだけで、変更しない)方法はありますか? )?


詳細:

私のアプリケーションは、画像の巨大なデータベースを持ち、画像のみを対象としています。

したがって、私が選択したのは、イメージをハードドライブに直接保存することです。これにより、DBMSの追加のワークロードが回避されます。

ただし、もう少し最適化したいと思います。メモリにロードせずに、画像から1つのピクセルに直接アクセスする方法(アプリケーションが実行する画像に対する唯一のアクション)があるかどうか疑問に思っています。

PILピクセルアクセスはそれを可能にしますか?または別の方法はありますか?

画像のエンコードは私自身の選択なので、いつでも変更できます。現在、PNGまたはJPGを使用しています。生で保存することもできますが、可能であれば画像を少し圧縮したままにしておきたいと思います。しかし、ハードドライブはCPUやRAMよりも安いと思うので、それを行うために画像をRAWのままにする必要がある場合でも、それでも良い方法だと思います。

ありがとうございました。

アップデート

ですから、恐れていたように、PNGなどの可変圧縮形式では不可能なようです。

私の質問を洗練させたい:

  • ヘッダーを読み取るだけで任意の部分にアクセスできる一定の圧縮形式(必ずしも画像形式に固有ではありません。プログラムでアクセスします)はありますか?
  • 技術的には、Pythonを使用してファイルからバイトに効率的に(高速でノンブロッキングで)アクセスする方法は?

解決

おかげさまで、すべての行でランレングスエンコーディングを使用し、すべての行を最大行と同じ長さにパディングすることで、説明した機能を正常に実装できました。

このように、各行の固定列数を説明するヘッダーを事前に準備することで、最初にfile.readline()を使用してヘッダーデータを取得し、次にfile.seek(headersize + fixedsize * y、0)を使用して行に簡単にアクセスできます。 )ここで、yは現在選択されている行です。

ファイルは圧縮されており、メモリ内では1行のみをフェッチします。すべてのRLE値を反復処理するだけでピクセルが正確にどこにあるかを計算できるため、アプリケーションはそれを解凍する必要さえありません。したがって、CPUサイクルも非常に簡単です。

4

2 に答える 2

1

ファイルを評価するには、メモリにロードする必要があります。ただし、ファイル形式によっては、ファイルの一部のみを読み取る方法を理解できる場合があります。たとえば、PNGファイルは8バイトのサイズのヘッダーを指定します。ただし、圧縮のため、チャンクは可変です。ただし、すべてのピクセルをraw形式で保存する場合は、ファイルのアドレスと適切なオフセットを計算できるため、各ピクセルに直接アクセスできます。PNG、JPEGが生データをどのように処理するかを予測することは不可能です。

ファイルの構造によっては、効率的なハッシュを計算できる場合があります。これを実際に調べたい場合は、たくさんの研究があると思います。たとえば、http://ieeexplore.ieee.org/xpl/login.jsp?tp =&arnumber = 899541

「この論文では、画像ハッシュ関数と呼ばれる可能性のある新しい画像インデックス作成手法を紹介します。このアルゴリズムは、ランダム化された信号処理戦略を使用して、画像をランダムなバイナリ文字列に非可逆的に圧縮し、圧縮による画像の変化に対して堅牢であることが示されています。 、幾何学的歪み、およびその他の攻撃」

于 2012-10-25T22:01:27.310 に答える
1

圧縮されたファイル形式を維持したい場合は、各画像を小さな長方形に分割して別々に保存できます。長方形に固定サイズを使用すると、必要な長方形を簡単に計算できます。ピクセル値が必要な場合は、その長方形がどの長方形にあるかを計算し、その画像ファイルを開いて、座標をオフセットして適切なピクセルを取得します。

これは、単一のピクセルへのアクセスを完全に最適化するわけではありませんが、大きな画像全体を開くよりもはるかに効率的です。

于 2012-10-25T22:30:54.390 に答える