2011-07-31 11 views
1

私はImage Compression (Lossy and Non-lossy)のウェブページを読んでいました。画像圧縮アルゴリズムに関する混乱

これは私の問題です。私はopencvを使って顔検出に関するプロジェクトを成功させました。しかし、私のプロジェクトガイドは満足できません。私のプロジェクトはキャプチャデバイス[webcam]からフレームをキャプチャし、これらのフレーム内の顔を検出し、Windowsで検出フレームを出力する機能です。私が知りたいのですがどのようなので

- -

私のプロジェクトガイドは、私はどちらかの画像圧縮やモーフィングなどのいくつかのアルゴリズムを実装するが、図書館のように重い使い方を見に幸せではなかったしたいことが可能ですCまたはC++ - 画像圧縮アルゴリズムを使用してコード化するには?はいの場合、コードサイズは大きくないでしょうか? (私のプロジェクトはマイナーなものと思われます)

CLEを使用してRLE圧縮を使いたい場合はどうすればいいですか?

+2

は「CまたはC++ -image圧縮アルゴリズムを使用してコードすることが可能です」。ええ、はい。 – Lagerbaer

+0

で書かれていますどう思いますかJPEGは複雑です - 理論はFFTの数学を知っていれば比較的簡単ですが、フォーマットは複雑です – Tempo

答えて

2

独自のイメージ圧縮を作成するか、標準のイメージ圧縮を実装したいですか? (これは何らかのクラス/割り当てのためのものだと仮定します。)

ランレングスなどの単純なイメージを少し圧縮することができます。色数。漫画やグラフィックスですが、実際の写真スタイルの画像ではうまくいかないため、JPEGやウェーブレットのような複雑な損失のあるテクニックが発明されたのです。

+0

のようなファイル形式について知る1つの必要がありませんどのくらい> – Tempo

+0

BMPは、自明である - 画像圧縮ライブラリはBMP、JPGなどのようなファイル形式について知っている1必要ないどのくらいのBMP、JPGなど –

1

非常に可能で、RLE圧縮は非常に簡単です。多くのコードを使用しない、RLEに対する比較的簡単なアプローチを見たい場合は、packbitsのバージョンを実装してください。 http://michael.dipperstein.com/rle/index.html(伝統的なRLEとパックビッツの両方のためのソースコードで実装が含まれています)

ところで、あなたは、ノイズの多いデータで、実際に以上で終わる可能性に留意してください:ここで

は、同様に別のリンクですデータはRLEスキームを使用して圧縮されていません。ほとんどの「現実の」画像では、ローパスフィルタリングが適用され、信号対雑音比が比較的高い(つまり、40dbを超える)場合、1.5:1〜1.7:1の圧縮比が必要です。

ロスレス圧縮のもう1つの選択肢は、ハフマン符号化である...そのアルゴリズムは、一般に、RLE圧縮アルゴリズムで符号化されたときに、そのような種類の画像で発生する可能性のあるデータ展開を防止するという点で、 。

最後に、カラー画像かグレースケール画像かどうかは言及していません...カラー画像の場合は、平面カラーの画像で各カラーチャンネルを圧縮すると、連続したRGBデータを圧縮しようとするのではなく、

0

空間の塗りつぶしカーブまたは空間インデックスを使用して色の減少に基づいて圧縮を実装したいとします。 siは2dの複雑さを1dの複雑さに減らし、quadtreeのように見え、フラクタルのように見えます。あなたはニックのヒルベルト曲線quadtree空間インデックスのブログを探してみたい!

もう1つ興味深いRLEエンコードアイデアがあります:Lossless hierarchical run length encoding。多分それはあなたのための何かですか?

0

ここに行くにはRLEが最適です。「最も単純な」圧縮アルゴリズムでさえも重要ではなく、色空間変換、離散サイン/コサイン変換、エントロピーなどの詳細な知識が必要です。

pix_jp.jpg RLEに戻る... :

cv::Mat img = cv::imread("lenna.png"); 
for(int i=0; i < img.rows; i++) 
    for(int j=0; i < img.cols; j++) 
     // You can now access the pixel value with cv::Vec3b 
     std::cout << img.at<cv::Vec3b>(i,j)[0] << " " << img.at<cv::Vec3b>(i,j)[1] << " " << img.at<cv::Vec3b>(i,j)[2] << std::endl; 

行に類似した画素の数をカウントし、任意のデータ構造に格納し(vectorで多分< #Occurences, Vec3b >タプル?)。あなたが最終的vectorを持っていたら、前述の(多分、単純なcompressedImage構造体の)vector出来上がりは、あなただけの画像を圧縮してどこかにあなたのイメージのサイズを保存することを忘れないでください。ファイルに保存するには、boost::serializeかそれに類似するものを使用することをお勧めします。

最終的な構造体は次のように何かを見て可能性があります

コーディング
struct compressedImage { 
    int height; 
    int width; 
    vector< pair<int, Vec3b> > data; 
}; 

ハッピー!

0

あなたは抽象ラスタタイプする必要がある場合は、GDAL C++ライブラリを使用することができます。ここでは、デフォルトで、または要求ラスタ形式でサポートされてのリスト:

http://gdal.org/formats_list.html