Sederhana, streaming, kompresi gambar tanpa kerugian

8

Adakah yang tahu teknik kompresi gambar dengan karakteristik berikut:

  • tanpa kerugian
  • streaming - Saya ingin mengompres dengan cepat, piksel demi piksel.
  • memori rendah - saya mampu buffer satu baris, tetapi idealnya bahkan tidak.
  • tidak ada kamus dinamis
  • Gambar "dunia nyata" saja, jadi kinerja pada "kasus jahat" seperti papan catur tidak penting
  • Kompresi 2-3x (5x-10x akan lebih baik, tapi itu banyak yang saya tahu)
  • dapat beroperasi pada 10-16 bit piksel (tergantung pada kamera saya)

Gambar saya akan ~ 1k piksel lebar, dengan tingkat piksel ~ 20Mpix / detik. Kedalaman piksel akan berkisar antara 10 dan 16 bit per piksel (tergantung pada pilihan kamera). Asumsikan lebar piksel sub-16-bit akan diwakili dalam kata 16-bit untuk saat ini, daripada perlu diekstraksi dari bit-stream berkelanjutan.

Mungkin beberapa bentuk delta + arithmetic coding?

Martin Thompson
sumber
Apakah piksel 10 - 16 bit Anda selalu diisi dengan mengatakan, 16 bit, atau mereka dikemas?
Paul R
1
Sepertinya tidak ada banyak persyaratan khusus gambar di sana. Dengan risiko terdengar jelas, sudahkah Anda mempertimbangkan untuk mencoba algoritma kompresi streaming-data standar, seperti zlib, LZMA, dll?
Jason R
@ PaulR - pertanyaan diperbarui - piksel akan diisi.
Martin Thompson
@JasonR: Saya telah melakukan sedikit penyelidikan pada teknik "standar", tetapi kesan saya (mungkin tidak akurat?) Adalah mereka tampaknya terlalu dinamis dan cukup haus akan memori (relatif terhadap kriteria "bahkan 1K peregangan itu" :)
Martin Thompson
1
huffyuv yang disebutkan di bawah ini sangat mirip dengan saran 'delta + aritmatika' Anda sendiri. Meskipun jelas itu menggunakan huffman alih-alih pengkodean aritmatika untuk bagian pengkodean entropi. pada 8 bit / pixel biasanya mencapai sedikit di atas kompresi 2x, dengan hanya 1 line-buffer.
Tn. White

Jawaban:

4

Anda dapat mempertimbangkan menggunakan Huffyuv: http://neuron2.net/www.math.berkeley.edu/benrg/huffyuv.html

Ini tidak lebih baik dari zip sederhana, tetapi masih sedikit dioptimalkan untuk gambar.

Kompresi terkait gambar apa pun berasal dari teknik seperti Vector quantization atau Transform coding. Untuk menggunakan transformasi seperti DCT / Wavelet namun membuatnya lossless Anda dapat memikirkan JPEG-LS atau JPEG2000 untuk kompresi. Hanya saja, itu tidak mengalir dalam pengertian Anda.

Dipan Mehta
sumber
1
Huffyuv hanya membutuhkan satu penyangga garis, itu teknik dekorasi spasial (prediktor median) karena itu sederhana. Untuk tingkat kompresi yang lebih tinggi, prediktor spasial yang baik adalah kuncinya. Harapkan jumlah buffer garis yang dibutuhkan naik secara signifikan. DCT / Wavelet misalnya, membutuhkan setidaknya 4 hingga 8 baris, untuk mencapai hasil yang lebih baik daripada Huffyuv
Tn. White
2

Ini terlihat seperti apa yang Anda masukkan ke dalam kamera digital untuk RAW tanpa kerugian.

1 / Periksa kode sumber dcraw untuk melihat apa yang sudah dilakukan berbagai produsen kamera. Misalnya Pentax menggunakan beberapa skema panjang int variabel (panjang N dikodekan dengan kode huffman, lalu N bit) untuk mengkodekan delta piksel, wrt piksel sebelumnya dengan warna yang sama di mosaik Bayer; dan ini secara rutin mencapai rasio 1: 1,5 hingga 1: 2.

File 2 / DNG juga dapat dikompresi. Periksa bagaimana hal itu dilakukan dari spesifikasi Adobe ... Tidak yakin apakah itu didasarkan pada prediksi + variabel int panjang encoding yang sama (yang streaming); atau jika menggunakan JPEG-LS yang lebih maju berdasarkan LOCO (dan yang sayangnya memerlukan beberapa lintasan data).

pichenettes
sumber
1

zlib memiliki mode kompresi ("HUFFMAN_ONLY") yang cepat dan tidak memerlukan banyak memori. Untuk foto tipikal menggunakan zlib dengan libpng, saya mendapatkan rasio kompresi sekitar 1: 2. Anda dapat mencobanya dengan ImageMagick, GraphicsMagick, atau pngcrush.

convert input.ppm -quality 1 output_im.png
gm convert input.ppm -quality 1 output_gm.png
pngcrush -force -m 12 input.png output_pc.png

Semua contoh ini menggunakan filter "sub" PNG (1) yang efektif untuk foto. Untuk * Magick, "-quality 1" dan untuk pngcrush, "-m 12" berarti menggunakan filter "sub" dan kompresi "huffman_only".

Glenn Randers-Pehrson
sumber