Görüntü sıkıştırma algoritmaları. JPEG benzeri şemalarda uyarlanabilir niceleme matrisleri oluşturma

  • 28.06.2019
  • öğretici

UPD. Tek aralıklı biçimlendirmeyi kaldırmak zorunda kaldım. Güzel bir gün, habraparser ön ve kod etiketlerinin içindeki biçimlendirmeyi algılamayı bıraktı. Tüm metinler bir karmaşaya dönüştü. Habr yönetimi bana yardım edemedi. Şimdi düzensiz, ama en azından okunabilir.

Hiç bir jpg dosyasının nasıl çalıştığını bilmek istediniz mi? Şimdi çözelim! Favori derleyicinizi ve altıgen düzenleyicinizi ısıtın, hadi şunu çözelim:

Özel olarak daha küçük bir çizim aldı. Bu, Google'ın tanıdık ama yoğun biçimde sıkıştırılmış favicon'udur:

Açıklamanın basitleştirilmiş olduğu ve sağlanan bilgilerin tam olmadığı konusunda sizi hemen uyarıyorum, ancak o zaman spesifikasyonu anlamak kolay olacaktır.

Kodlamanın nasıl gerçekleştiğini bilmeden bile dosyadan bir şeyler çıkartabiliriz.
- işaretleyiciyi başlat. Her zaman tüm jpg dosyalarının başındadır.
Bayt takip eder. . Bu, bir yorum bölümünün başlangıcını işaretleyen bir işaretçidir. Sonraki 2 bayt - bölüm uzunluğu (bu 2 bayt dahil). Yani sonraki iki - yorumun kendisi. Bunlar ":" ve ")" karakter kodlarıdır, yani. normal gülen Hex editörünün sağ tarafındaki ilk satırda görebilirsiniz.

biraz teori

Adım adım çok kısa:
Bu verilerin kodlanabileceği sırayı düşünelim. İlk başta Y kanalının tüm görüntü için kodlandığını, ardından Cb'nin ve ardından Cr'nin kodlandığını varsayalım. Herkes çevirmeli ağda resim yüklemeyi hatırlar. Bu şekilde kodlanmış olsalardı, ekranda görünmeden önce tüm görüntünün yüklenmesini beklememiz gerekirdi. Dosyanın sonunun kaybolması da rahatsız edici olacaktır. Muhtemelen başka iyi sebepler de vardır. Bu nedenle, kodlanmış veriler küçük parçalar halinde dönüşümlü olarak düzenlenir.

Her Y ij , Cb ij , Cr ij bloğunun Huffman kodlarıyla kodlanmış bir DCT katsayıları matrisi olduğunu hatırlatmama izin verin. Dosyada aşağıdaki sırayla bulunurlar: Y 00 Y 10 Y 01 Y 11 Cb 00 Cr 00 Y 20

Dosya okuma

Yorumu çıkardıktan sonra şunu anlamak kolay olacaktır:
  • Dosya, önünde işaretleyiciler bulunan sektörlere bölünmüştür.
  • Belirteçler, ilk bayt ile birlikte 2 bayt uzunluğundadır.
  • Hemen hemen tüm sektörler, uzunluklarını işaretçiden sonraki 2 baytta saklar.
Kolaylık sağlamak için işaretleri vurgulayın:
FF D8 FF FE 00 04 3A 29 FF DB 00 43 00 A0 6E 78



FF FF FF FF FF FF FF FF FF FF FF FF FF FF DB 00
43 01 AA B4 B4 F0 D2 F0 FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF C0 00 11 08 00 10 00 10 03 01 22 00 02
11 01 03 11 01 FF C4 00 15 00 01 01 00 00 00 00
00 00 00 00 00 00 00 00 00 03 02 FF C4 00 1A
10 01 00 02 03 01 00 00 00 00 00 00 00 00 00 00
00 01 00 12 02 11 31 21 FF C4 00 15 01 01 01 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 01FF
C4 00 16 11 01 01 01 00 00 00 00 00 00 00 00 00
00 00 00 00 11 00 01 FF DA 00 0C 03 01 00 02 11
03 11 00 3F 00AE E7 61 F2 1B D5 22 85 5D 04 3C
82 C8 48 B1 DC BF FF D9

İşaretleyici: DQT - niceleme tablosu.

FF DB 00 43 00 A0 6E 78
8C 78 64 A0 8C 82 8C B4 AA A0 BE F0 FF FF F0 DC
DC F0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF

Bölüm başlığı her zaman 3 bayttır. Bizim durumumuzda, bu . Başlık şunlardan oluşur:
Uzunluk: 0x43 = 67 bayt
Tablodaki değerlerin uzunluğu: 0 (0 - 1 bayt, 1 - 2 bayt)
[_0] Tablo Kimliği: 0
Kalan 64 baytın 8x8 tabloyu doldurması gerekir.



Tablo değerlerinin doldurulduğu sıraya daha yakından bakın. Bu sıraya zikzak sıra denir:

İşaretleyici : SOF0 - Temel DCT

Bu işaretçiye SOF0 adı verilir; bu, görüntünün temel yöntemde kodlandığı anlamına gelir. Çok yaygın. Ancak internette, önce düşük çözünürlüklü bir görüntü, ardından normal bir resim yüklendiğinde, bildiğiniz aşamalı yöntem daha az popüler değildir. Bu, tam indirmeyi beklemeden orada gösterilenleri anlamanızı sağlar. Spesifikasyon birkaç tane daha tanımlıyor, bana öyle geliyor ki, çok yaygın yöntemler değil.

FF C0 00 11 08 00 10 00 10 03 01 22 00 02
11 01 03 11 01

Uzunluk: 17 bayt.
Hassasiyet: 8 bit Temel yöntemde her zaman 8. Anladığım kadarıyla kanal değerlerinin bit derinliği bu.
Resim Yüksekliği: 0x10 = 16
Desen Genişliği: 0x10 = 16
Bileşen sayısı: 3. Çoğu zaman Y, Cb, Cr'dir.

1. bileşen:
Kimlik: 1
Yatay incelme (H 1): 2
[_2] Dikey incelme (V 1): 2
Niceleme tablosu kimliği: 0

2. bileşen:
Kimlik: 2
Yatay incelme (H 2): 1
[_1] Dikey incelme (V 2): 1

3. bileşen:
Kimlik: 3
Yatay incelme (H 3): 1
[_1] Dikey incelme (V 3): 1
Niceleme tablosu tanımlayıcısı: 1

Şimdi bir görüntünün ne kadar inceltildiğini nasıl belirleyeceğinize bakın. H max \u003d 2 ve V max \u003d 2 buluyoruz. Kanal i, yatay olarak H max /H i kez ve dikey olarak V max /V i kez kırılacaktır.

İşaretleyici: DHT (Huffman şeması)

Bu bölüm, Huffman kodlaması ile elde edilen kodları ve değerleri saklar.

FF C4 00 15 00 01 01 00 00 00 00
00 00 00 00 00 00 00 00 00 00 03 02

uzunluk: 21 bayt.
sınıf: 0 (0 - DC katsayı tablosu, 1 - AC katsayı tablosu).
[_0] tablo kimliği: 0
Huffman kod uzunluğu: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Kod sayısı:
Kod sayısı, o uzunluktaki kod sayısı anlamına gelir. Bölümün, kodların kendilerini değil, yalnızca kodların uzunluklarını kaydettiğini unutmayın. Kodları kendimiz bulmalıyız. Yani 1 uzunluk ve 1 uzunluk 2 kodumuz var. Toplamda 2 kod var, bu tabloda başka kod yok.
Her kodun kendisiyle ilişkilendirilmiş bir değeri vardır ve bunlar dosyanın yanında listelenir. Değerler tek bayt olduğundan 2 bayt okuyoruz.
- 1. kodun değeri.
- 2. kodun değeri.

Huffman Kodlarından Bir Ağaç İnşa Etmek

DHT bölümünde aldığımız tablodan bir ikili ağaç oluşturmamız gerekiyor. Ve zaten bu ağaç tarafından her kodu tanıyacağız. Değerler tabloda listelendikleri sıraya göre eklenir. Algoritma basittir: Nerede olursak olalım, her zaman soldaki dala bir değer eklemeye çalışırız. Ve eğer meşgulse, o zaman sağa. Ve orada yer yoksa, o zaman yukarıdaki seviyeye döneriz ve oradan deneriz. Kodun uzunluğuna eşit bir seviyede durmanız gerekir. Sol dallar 0, sağ - 1 değerine karşılık gelir.
Yorum:
Her seferinde en baştan başlamaya gerek yok. Katma değer - yukarıdaki seviyeye geri dönün. Doğru şube var mı? Evet ise, tekrar yukarı çıkın. Değilse, doğru bir dal oluşturun ve oraya gidin. Ardından, oradan sonraki değeri eklemek için aramaya başlayın.

Bu örnekteki tüm tablolar için ağaçlar:


UPD (teşekkür ederim): İlk ağacın düğümleri (DC, id =0) 0x03 ve 0x02 değerlerine sahip olmalıdır.

Dairelerde - kodların değerleri, dairelerin altında - kodların kendileri (bunları yukarıdan her düğüme giderek aldığımızı açıklayacağım). Bu tür kodlarla (bunun ve diğer tabloların) şeklin içeriği kodlanmıştır.

İşaretleyici : SOS (Taramanın Başlangıcı)

Belirteçteki bayt "EVET! Son olarak, doğrudan kodlanmış görüntünün bölümünü ayrıştırmaya gittik! Ancak bölüm sembolik olarak SOS olarak adlandırılır.

  FF DA 00 0C 03 01 00 02 11
03 11 00 3F 00

Başlığın uzunluğu (bölümün tamamı değil): 12 bayt.
Tarama bileşenlerinin sayısı. Y, Cb, Cr için birer tane olmak üzere 3 tane var.

1. bileşen:
Görüntü bileşen numarası: 1 (Y)
DC katsayıları için Huffman tablo kimliği: 0
[_0] AC katsayıları için Huffman tablo kimliği: 0

2. bileşen:
Görüntü bileşen numarası: 2 (Cb)

[_1]

3. bileşen:
Görüntü bileşen numarası: 3 (Cr)
DC katsayıları için Huffman tablo kimliği: 1
[_1] AC katsayıları için Huffman tablo kimliği: 1

Bu bileşenler döngüsel olarak değişir.

Başlık kısmının bittiği yer burasıdır, buradan sona (işaretleyici) kodlanmış veriler.


0

DC katsayısını bulma.
1. Bit dizisini okuma (2 bayt ile karşılaşırsak, bu bir işaretleyici değil, sadece bir bayttır). Her bitten sonra, okunan bit'e bağlı olarak 0 veya 1 dalı boyunca Huffman ağacı (karşılık gelen tanımlayıcı ile) boyunca hareket ederiz. Son düğümdeysek dururuz.
10 1011101110011101100001111100100

2. Düğümün değerini alıyoruz. 0'a eşitse, katsayı 0'dır, tabloya yazın ve diğer katsayıları okumaya devam edin. Bizim durumumuzda - 02. Bu değer, katsayının bit cinsinden uzunluğudur. Yani, sonraki 2 biti okuduk, bu katsayı olacak.
10 10 11101110011101100001111100100

3. İkili gösterimde değerin ilk basamağı 1 ise, olduğu gibi bırakın: DC_coef = value. Aksi takdirde, şunu dönüştürün: DC_coef = değer-2 değer uzunluğu +1 . Katsayıyı zikzak - sol üst köşenin başında tabloya yazıyoruz.

AC katsayılarını bulma.
1. Madde 1'e benzer şekilde, DC katsayısını bulma. Sıralamayı okumaya devam ediyoruz:
10 10 1110 1110011101100001111100100

2. Düğümün değerini alıyoruz. 0'a eşitse, matrisin kalan değerlerinin sıfırlarla doldurulması gerektiği anlamına gelir. Ardından bir sonraki matris kodlanır. Bu noktaya kadar okuyup bu konuda kişisel olarak bana yazan ilk birkaç kişi karmada bir artı alacak. Bizim durumumuzda, düğümün değeri 0x31'dir.
İlk kemirme: 0x3 - matrise kaç tane sıfır eklememiz gerekiyor. Bunlar 3 sıfır katsayı.
İkinci kemirme: 0x1 - bit cinsinden katsayı uzunluğu. Sonraki kısmı okuyun.
10 10 1110 1 110011101100001111100100

3. DC katsayısını bulmanın 3. noktasına benzer.

Zaten anladığınız gibi, kodun sıfır değerine rastlayana veya matris dolana kadar AC katsayılarını okumanız gerekir.
Bizim durumumuzda, şunları alacağız:
10 10 1110 1 1100 11 101 10 0 0 0 1 11110 0 100
ve matris:





Değerlerin aynı zikzak deseninde doldurulduğunu fark ettiniz mi?
Bu sırayı kullanmanın nedeni basittir - v ve u değerleri ne kadar büyük olursa, ayrık kosinüs dönüşümündeki S vu katsayısı o kadar az önemlidir. Bu nedenle, yüksek sıkıştırma oranlarında, önemsiz katsayılar sıfıra ayarlanır, böylece dosya boyutu küçülür.

[-4 1 1 1 0 0 0 0] [ 5 -1 1 0 0 0 0 0]
[ 0 0 1 0 0 0 0 0] [-1 -2 -1 0 0 0 0 0]
[ 0 -1 0 0 0 0 0 0] [ 0 -1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [-1 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

[-4 2 2 1 0 0 0 0]
[-1 0 -1 0 0 0 0 0]
[-1 -1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

Oh, kodlanmış DC katsayılarının DC katsayılarının kendileri değil, önceki tablonun (aynı kanalın) katsayıları arasındaki farkları olduğunu söylemeyi unuttum! Matrisleri düzeltmeniz gerekiyor:
2. için DC: 2 + (-4) = -2
3. için DC: -2 + 5 = 3
4. için DC: 3 + (-4) = -1

[-2 1 1 1 0 0 0 0] [ 3 -1 1 0 0 0 0 0] [-1 2 2 1 0 0 0 0]
………

Şimdi sipariş ver. Bu kural dosyanın sonuna kadar geçerlidir.

… ve Cb ve Cr için matrise göre:

[-1 0 0 0 0 0 0 0]
[ 1 1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

Her biri yalnızca bir matris olduğundan, DC katsayılarına dokunulmadan bırakılabilir.

Bilgi işlem

niceleme

Matrisin niceleme aşamasından geçtiğini hatırlıyor musunuz? Matrisin elemanları, niceleme matrisinin elemanları ile terim terim çarpılmalıdır. Doğru olanı seçmek için kalır. İlk olarak, ilk bileşeni taradık, görüntü bileşeni = 1. Bu kimliğe sahip görüntü bileşeni, 0'lık bir niceleme matrisi kullanır (ikiden ilkine sahibiz). Yani çarpma işleminden sonra:


[ 0 120 280 0 0 0 0 0]
[ 0 -130 -160 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

Benzer şekilde, 3 tane daha Y-kanalı matrisi elde ederiz ...

[-320 110 100 160 0 0 0 0] [ 480 -110 100 0 0 0 0 0]
[ 0 0 140 0 0 0 0 0] [-120 -240 -140 0 0 0 0 0]
[ 0 -130 0 0 0 0 0 0] [ 0 -130 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [-140 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

[-160 220 200 160 0 0 0 0]
[-120 0 -140 0 0 0 0 0]
[-140 -130 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

… ve Cb ve Cr için matrise göre.

[-170 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 180 210 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

Ters Ayrık Kosinüs Dönüşümü

Formül zor olmamalı*. S vu, sonuçtaki katsayı matrisimizdir. u - sütun, v - satır. s yx - doğrudan kanal değerleri.

* Genel olarak konuşursak, bu tamamen doğru değildir. 16x16'lık bir çizimi deşifre edip ekranda gösterebildiğimde 600x600'lük bir resim çektim (bu arada bu en sevdiğim albüm Mind.In.A.Box - Lost Alone'un kapağıydı). Hemen çalışmadı - çeşitli hatalar ortaya çıktı. Yakında doğru yüklenen resme hayran olabilirim. Tek hayal kırıklığı indirme hızıydı. 7 saniye sürdüğünü hala hatırlıyorum. Ancak bu şaşırtıcı değil, yukarıdaki formülü düşüncesizce kullanırsanız, o zaman bir pikselin bir kanalını hesaplamak için 128 kosinüs, 768 çarpma ve orada bazı eklemeler bulmanız gerekir. Bir düşünün - bir pikselin yalnızca bir kanalı için neredeyse bin zor işlem! Neyse ki, burada optimizasyon için yer var (birçok denemeden sonra, yükleme süresini 15ms'lik zamanlayıcı doğruluk sınırına indirdim ve bundan sonra resmi 25 kat daha büyük bir fotoğrafla değiştirdim. Belki bunu ayrı bir makalede yazarım. ).

Y kanalının sadece ilk matrisini hesaplamanın sonucunu yazacağım (değerler yuvarlanmıştır):


[ 87 72 50 36 37 55 79 95]
[-10 5 31 56 71 73 68 62]
[-87 -50 6 56 79 72 48 29]

Ve diğer 2:
Cb Cr
[ 60 52 38 20 0 -18 -32 -40] [ 19 27 41 60 80 99 113 120]
[ 48 41 29 13 -3 -19 -31 -37] [ 0 6 18 34 51 66 78 85]
[ 25 20 12 2 -9 -19 -27 -32] [-27 -22 -14 -4 7 17 25 30]
[ -4 -6 -9 -13 -17 -20 -23 -25] [-43 -41 -38 -34 -30 -27 -24 -22]
[ -37 -35 -33 -29 -25 -21 -18 -17] [-35 -36 -39 -43 -47 -51 -53 -55]
[ -67 -63 -55 -44 -33 -22 -14 -10] [ -5 -9 -17 -28 -39 -50 -58 -62]
[ -90 -84 -71 -56 -39 -23 -11 -4] [ 32 26 14 -1 -18 -34 -46 -53]
[-102 -95 -81 -62 -42 -23 -9 -1] [ 58 50 36 18 -2 -20 -34 -42]

  1. Ah, hadi yemek yiyelim!
  2. Evet hiç girmiyorum ne diyorsunuz.
  3. YCbCr renk değerleri elde edildikten sonra geriye şu şekilde RGB'ye dönüştürmek kalır: YCbCrToRGB(Y ij , Cb ij , Cr ij) , Y ij , Cb ij , Cr ij - alınan matrislerimiz.
  4. Kanalları incelttiğimiz için 4 Y matrisi ve her biri bir Cb ve Cr ve 4 Y pikselin her biri bir Cb ve Cr'ye karşılık gelir. Bu nedenle, şöyle hesaplayın: YCbCrToRGB(Y ij , Cb , Cr )
1 ve 4'ü seçerseniz, sizin için mutluyum. Ya doğru yaptın ya da yakında yemeğin tadını çıkaracaksın.

YCbCr'den RGB'ye dönüştürücü

R = Y + 1.402 * Kr
G = Y - 0.34414 * Cb - 0.71414 * Cr
B = Y + 1.772 * Cb
Her birine 128 eklemeyi unutmayın. Değerler aralığın dışına çıkıyorsa sınır değerleri atayın. Formül basittir, ancak aynı zamanda işlemci süresinin bir kısmını da tüketir.

Örneğimizin sol üst 8x8 karesi için R, G, B kanalları için sonuç tabloları:
255 248 194 148 169 215 255 255
255 238 172 115 130 178 255 255
255 208 127 59 64 112 208 255
255 223 143 74 77 120 211 255
237 192 133 83 85 118 184 222
177 161 146 132 145 162 201 217
56 73 101 126 144 147 147 141
0 17 76 126 153 146 127 108

231 185 117 72 67 113 171 217
229 175 95 39 28 76 139 189
254 192 100 31 15 63 131 185
255 207 115 46 28 71 134 185
255 241 175 125 112 145 193 230
226 210 187 173 172 189 209 225
149 166 191 216 229 232 225 220
72 110 166 216 238 231 206 186

255 255 249 203 178 224 255 255
255 255 226 170 140 187 224 255
255 255 192 123 91 138 184 238
255 255 208 139 103 146 188 239
255 255 202 152 128 161 194 232
255 244 215 200 188 205 210 227
108 125 148 172 182 184 172 167
31 69 122 172 191 183 153 134

Son

Genel olarak, bir JPEG uzmanı değilim, bu yüzden tüm soruları yanıtlayamıyorum. Tam kod çözücümü yazdığımda, çoğu zaman anlaşılmaz çeşitli sorunlarla uğraşmak zorunda kaldım. Ve görüntü yanlış görüntülendiğinde, nerede hata yaptığımı bilmiyordum. Belki bitleri yanlış yorumladı veya DCT'yi yanlış kullandı. Adım adım bir örneği gerçekten kaçırdım, bu yüzden bu makalenin kod çözücü yazarken yardımcı olacağını umuyorum. Sanırım temel yöntemin açıklamasını kapsıyor, ancak yine de bununla başa çıkamazsınız. İşte bana yardımcı olan bazı bağlantılar:

Algoritma, 1991 yılında Joint Photographic Expert Group tarafından 24 bit ve gri tonlamalı görüntüleri sıkıştırmak için geliştirilmiştir. Bu algoritma iki seviyeli görüntüleri çok iyi sıkıştırmaz, ancak yakın piksellerin benzer renklere sahip olma eğiliminde olduğu sürekli tonlu görüntüleri çok iyi işler. Genellikle göz bu yöntemle 10 veya 20 kez sıkıştırıldığında herhangi bir fark görmez.

Algoritma, 8x8 piksel boyutunda, örtüşmeyen görüntü bloklarından oluşan bir matrise uygulanan DCT'ye dayanmaktadır. DCT, bu blokları belirli frekansların genliklerine göre ayrıştırır. Sonuç, katsayıların çoğunun sıfıra yakın olma eğiliminde olduğu ve kaba bir sayısal biçimde temsil edilebilecek bir matristir, yani. restorasyon kalitesinde önemli bir kayıp olmaksızın nicelleştirilmiş bir biçimde.

Algoritmanın çalışmasını daha ayrıntılı olarak ele alalım. Tam renkli 24 bit bir görüntüyü sıkıştırdığınızı varsayalım. Bu durumda, aşağıdaki çalışma aşamalarını alıyoruz.

Aşama 1. Aşağıdaki ifadeyi kullanarak görüntüyü RGB uzayından YCbCr uzayına çeviriyoruz:

Ters dönüşümün, ters matrisi esasen bir YUV uzayı olan bir vektörle çarparak kolayca elde edilebileceğini hemen not edelim:

.

Adım 2 Orijinal görüntüyü 8x8 matrislere böldük. Her bileşen için ayrı ayrı - 8 bitten üç DCT çalışma matrisi oluşturuyoruz. Yüksek sıkıştırma oranlarında, bir 8x8 blok 4:2:0 formatında YCbCr bileşenlerine ayrıştırılır, yani. Cb ve Cr bileşenleri satır ve sütunlardaki noktalardan alınır.

Aşama 3 DCT'yi 8x8 piksel görüntü bloklarına uygulama. Resmi olarak, bir 8x8 blok için doğrudan DCT şu şekilde yazılabilir:

nerede . DCT, JPEG algoritmasının "kalbi" olduğundan, pratikte mümkün olduğu kadar çabuk hesaplanması arzu edilir. Hesapları hızlandırmak için basit bir yaklaşım, kosinüs fonksiyonlarını önceden hesaplamak ve hesaplamanın sonuçlarını tablo haline getirmektir. Ayrıca, farklı frekanslara sahip kosinüs fonksiyonlarının ortogonalliği göz önüne alındığında, yukarıdaki formül şu şekilde yazılabilir:

.

İşte bu alandaki blok sütunları temsil etmek için 8 boyutlu bir alanı tanımlayan 8x8'lik bir matris. Matris, transpoze edilmiş bir matristir ve blok satırları dışında aynı şeyi yapar. Sonuç, matris formunda şu şekilde yazılan ayrılabilir bir dönüşümdür.

Burada, hesaplaması çarpma işlemlerini ve hemen hemen aynı sayıda eklemeyi gerektiren, yukarıdaki formülü kullanan doğrudan hesaplamalardan önemli ölçüde daha az olan DCT'nin sonucudur. Örneğin, 512x512 piksellik bir görüntüyü dönüştürmek için aritmetik işlemler gereklidir. 3 parlaklık bileşeni göz önüne alındığında, 12.582,912 aritmetik işlemin değerini elde ederiz. Hızlı Fourier Dönüşümü algoritması kullanılarak çarpma ve toplama sayısı daha da azaltılabilir. Sonuç olarak, bir 8x8 bloğu dönüştürmek için 54 çarpma, 468 toplama ve bit kaydırma yapmanız gerekecek.

DCT'nin bir sonucu olarak, sol üst köşedeki katsayıların görüntünün düşük frekanslı bileşenine ve sağ altta yüksek frekanslı olana karşılık geldiği bir matris elde ederiz.

4. Adım niceleme. Bu adımda, bilgilerin bir kısmı atılır. Burada, matristeki her sayı "niceleme tablosundan" özel bir sayıya bölünür ve sonuç en yakın tam sayıya yuvarlanır:

.

Ayrıca, her Y, Cb ve Cr matrisi için kendi niceleme tablolarınızı ayarlayabilirsiniz. JPEG standardı, kendi niceleme tablolarına bile izin verir, ancak bunun, genel dosya boyutunu artıracak olan sıkıştırılmış verilerle birlikte kod çözücüye geçirilmesi gerekecek. Kullanıcının 64 katsayıyı bağımsız olarak seçmesinin zor olduğu açıktır, bu nedenle JPEG standardı niceleme matrisleri için iki yaklaşım kullanır. Birincisi, JPEG standardının önerilen iki niceleme tablosu içermesidir: biri luma için diğeri krominans için. Bu tablolar aşağıda gösterilmiştir. İkinci yaklaşım, kullanıcı tarafından belirtilen bir parametreye bağlı olarak bir nicemleme tablosunu sentezlemektir (anında hesaplamak). Tablonun kendisi formüle göre oluşturulmuştur.

Kuantizasyon adımında sıkıştırma oranı kontrol edilir ve en büyük kayıp meydana gelir. Büyük katsayılı nicemleme tabloları ayarlayarak daha fazla sıfır ve sonuç olarak daha büyük bir sıkıştırma oranı elde edeceğimiz açıktır.

Algoritmanın spesifik etkileri de niceleme ile ilişkilidir. Kuantizasyon adımının büyük değerlerinde kayıplar o kadar büyük olabilir ki görüntü düz 8x8 karelere bölünür. Buna karşılık, yüksek frekanslardaki kayıplar, keskin bir renk geçişi ile konturlar etrafında dalgalı bir "nimbus" oluştuğunda, "Gibbs etkisi" olarak adlandırılan şekilde kendini gösterebilir.

Adım 5 8x8 matrisini "zikzak" tarama kullanarak 64 elemanlı bir vektöre çeviriyoruz (Şekil 2).

Pirinç. 2. Zigzag tarama

Sonuç olarak, vektörün başında kural olarak sıfır olmayan katsayılar yazılacak ve sonunda sıfır zincirleri oluşacaktır.

6. Adım Vektörü, çıktısında tür çiftlerini (atlama, sayı) aldığımız değiştirilmiş RLE algoritmasını kullanarak dönüştürüyoruz; burada "atlama", atlanan sıfırların sayacıdır ve "sayı", girilmesi gereken değerdir. sonraki hücre. Örneğin, 1118 3 0 0 0 -2 0 0 0 0 1 … vektörü (0, 1118) (0,3) (3,-2) (4.1) … .

Dönüştürülen bileşenin ilk sayısının esasen 8x8 bloğunun ortalama parlaklığına eşit olduğuna ve DC katsayısı olarak adlandırıldığına dikkat edilmelidir. Benzer şekilde tüm görüntü blokları için. Bu durum, DC katsayılarının, mutlak değerleri saklanmazsa, ancak mevcut bloğun DC katsayısı ile önceki bloğun DC katsayısı arasındaki fark şeklinde göreceli olanları ve ilk bloğun etkin bir şekilde sıkıştırılabileceğini göstermektedir. katsayısı olduğu gibi saklanır. Bu durumda DC katsayılarının sıralaması, örneğin aşağıdaki gibi yapılabilir (Şekil 3). AC katsayıları olarak adlandırılan kalan katsayılar değişmeden kalır.

7. Adım Elde edilen çiftleri sabit bir tablo ile tek tip olmayan Huffman kodları kullanarak daraltırız. Ayrıca DC ve AC katsayıları için farklı kodlar kullanılır, yani. Huffman kodları ile farklı tablolar.

Pirinç. 3. DC katsayılarını sıralama şeması

Pirinç. 4. JPEG algoritmasının blok şeması

Bu algoritmadaki görüntü yeniden oluşturma işlemi tamamen simetriktir. Yöntem, gözle görülür görsel kayıp olmadan görüntüleri 10-15 kat sıkıştırmanıza olanak tanır.

Bu standardı geliştirirken, bu algoritmanın görüntüleri oldukça hızlı bir şekilde sıkıştırması gerektiği gerçeği bize rehberlik etti - ortalama bir görüntüde bir dakikadan fazla değil. Bu 1991'de! Ve donanım uygulaması nispeten basit ve ucuz olmalıdır. Bu durumda algoritmanın çalışma süresi açısından simetrik olması gerekiyordu. İkinci şartın yerine getirilmesi, 24 bitlik görüntüler çeken dijital kameraların ortaya çıkmasını mümkün kıldı. Algoritma asimetrik olsaydı, cihaz "yeniden şarj olana" - görüntüyü sıkıştırana kadar uzun süre beklemek tatsız olurdu.

JPEG algoritması bir ISO standardı olmasına rağmen dosya formatı sabitlenmemiştir. Bunu kullanarak üreticiler kendi uyumsuz formatlarını yaratırlar ve bu nedenle algoritmayı değiştirebilirler. Böylece, ISO tarafından önerilen algoritmanın iç tabloları, kendileri tarafından değiştirilir. Belirli uygulamalar için JPEG çeşitleri de vardır.

Kayıplı arşivleme algoritmalarıyla ilgili sorunlar

Görüntüleri arşivlemek için kullanılan ilk algoritmalar geleneksel algoritmalardı. Yedekleme sistemlerinde, dağıtım oluştururken vb. kullanılanlar ve kullanılanlar. Bu algoritmalar bilgileri değişmeden arşivledi. Bununla birlikte, son zamanlarda ana eğilim, yeni görüntü sınıflarının kullanılması olmuştur. Eski algoritmalar artık arşivleme gereksinimlerini karşılamıyor. “Bir bakışta” bariz fazlalıkları olmasına rağmen, birçok görüntü pratik olarak sıkıştırılmadı. Bu, yeni bir tür algoritma oluşturulmasına yol açtı - bilgi kaybıyla sıkıştırma. Kural olarak, arşivleme oranı ve sonuç olarak bunlardaki kalite kaybı derecesi ayarlanabilir. Bu durumda, görüntülerin boyutu ve kalitesi arasında bir uzlaşmaya varılır.

Bilgisayar grafiklerinin ciddi sorunlarından biri, görüntü kalitesi kaybını değerlendirmek için yeterli bir kriterin henüz bulunamamasıdır. Ve sürekli olarak kaybolur - sayısallaştırma sırasında, sınırlı bir renk paletine dönüştürürken, baskı için başka bir renk temsil sistemine dönüştürürken ve özellikle bizim için önemli olan, kayıplarla arşivleme yaparken. Basit bir kritere örnek verebiliriz: piksel değerlerinin standart sapması (L 2 ölçü veya ortalama kare - RMS):

Buna göre, parlaklık yalnızca %5 oranında azaltıldığında görüntü büyük ölçüde zarar görecektir (göz bunu fark etmeyecektir - farklı monitörler için parlaklık ayarı çok daha fazla değişir). Aynı zamanda, "kar" içeren görüntüler - tek tek noktaların, soluk şeritlerin veya "harelerin" renginde keskin bir değişiklik "neredeyse değişmemiş" olarak kabul edilecektir (Nedenini açıklayın?). Diğer kriterlerin dezavantajları da vardır.

Örneğin, maksimum sapmayı düşünün:

Bu önlem, tahmin edebileceğiniz gibi, tek tek piksellerin atılmasına karşı son derece hassastır. Onlar. görüntünün tamamında yalnızca bir pikselin değeri önemli ölçüde değişebilir (ki bu gözle neredeyse algılanamaz), ancak bu ölçüye göre görüntü ciddi şekilde bozulacaktır.

Şu anda pratikte kullanılan ölçü, sinyal-gürültü oranının ölçüsü (tepe-tepe sinyal-gürültü oranı - PSNR) olarak adlandırılır.

Bu ölçü aslında standart sapmaya benzer, ancak ölçeğin logaritmik ölçeği nedeniyle kullanımı biraz daha uygundur. Standart sapma ile aynı dezavantajlara sahiptir.

Görüntü kalitesindeki kayıp en iyi şekilde gözlerimiz tarafından değerlendirilir. Arşivleme, orijinal ve sıkıştırılmamış görüntüleri gözle ayırt etmenin imkansız olduğu mükemmel olarak kabul edilir. İyi - hangi resimlerin arşivlendiğini anlayabildiğinizde, yalnızca iki bitişik resmi karşılaştırabilirsiniz. Sıkıştırma oranındaki bir artışla, kural olarak, bu algoritmanın karakteristik yan etkileri fark edilir hale gelir. Uygulamada, mükemmel kalite tutma ile bile, görüntüde düzenli olarak belirli değişiklikler yapılabilir. Bu nedenle, daha sonra yüksek kalitede basılacak veya görüntü tanıma programları tarafından işlenecek görüntülerin sıkıştırılması için kayıplı arşivleme algoritmaları önerilmez. Bu tür görüntülerde hoş olmayan etkiler, daha önce de söylediğimiz gibi, basit bir görüntü ölçekleme ile bile ortaya çıkabilir. JPEG algoritması

JPEG, en yeni ve oldukça güçlü algoritmalardan biridir. Tam renkli görüntüler için pratikte fiili standarttır. Algoritma, parlaklığın ve rengin nispeten düzgün bir şekilde değiştiği 8x8 alanlarla çalışır. Sonuç olarak, böyle bir bölgenin matrisini kosinüs cinsinden bir çift seriye genişletirken (aşağıdaki formüllere bakın), yalnızca ilk katsayıların anlamlı olduğu ortaya çıkıyor. Böylece, görüntüdeki renk değişikliklerinin düzgünlüğü nedeniyle JPEG'de sıkıştırma gerçekleştirilir.

Algoritma, bir grup fotoğraf uzmanı tarafından özellikle 24 bit görüntüleri sıkıştırmak için geliştirildi. JPEG - Ortak Fotoğraf Uzman Grubu - ISO - Uluslararası Standardizasyon Örgütü içindeki bir bölüm. Algoritmanın adı ["jei" peg] olarak okunur. Genel olarak, algoritma, bazı yeni katsayılar matrisi elde etmek için görüntü matrisine uygulanan ayrı bir kosinüs dönüşümüne (bundan sonra DCT olarak anılacaktır) dayanmaktadır. Orijinal görüntüyü elde etmek için ters bir dönüşüm uygulanır.

DCT, görüntüyü belirli frekansların genliklerine ayrıştırır. Böylece, dönüştürürken, birçok katsayının sıfıra yakın veya eşit olduğu bir matris elde ederiz. Ek olarak, insan görüşünün kusurlu olması nedeniyle, görüntü kalitesinde gözle görülür bir kayıp olmadan katsayıları daha kabaca tahmin etmek mümkündür.

Bunun için katsayıların nicelenmesi kullanılır. En basit durumda, bu sağa doğru aritmetik bir bit düzeyinde kaymadır. Bu dönüşüm bazı bilgileri kaybeder, ancak büyük sıkıştırma oranları elde edilebilir.

Algoritma nasıl çalışır?

Öyleyse, algoritmayı daha ayrıntılı olarak ele alalım. Diyelim ki 24 bitlik bir görüntüyü sıkıştırıyoruz.

Aşama 1.

Görüntüyü, noktanın renginin kırmızı (Kırmızı), yeşil (Yeşil) ve mavi (Mavi) bileşenlerinden sorumlu bileşenlerle birlikte RGB renk uzayından YCrCb renk uzayına (bazen YUV olarak adlandırılır) çeviriyoruz.

İçinde Y parlaklık bileşenidir ve Cr, Cb renkten sorumlu bileşenlerdir (kromatik kırmızı ve kromatik mavi). İnsan gözünün renge karşı parlaklıktan daha az duyarlı olması nedeniyle, Cr ve Cb bileşenleri için dizileri büyük kayıplarla ve buna bağlı olarak büyük sıkıştırma oranlarıyla arşivlemek mümkün hale gelir. Benzer bir dönüşüm televizyonda uzun süredir kullanılmaktadır. Renkten sorumlu sinyallere daha dar bir frekans bandı atanır.

Basitleştirilmiş, RGB renk alanından YCrCb renk alanına çeviri geçiş matrisi kullanılarak temsil edilebilir:

Ters dönüşüm, YUV vektörünün ters matrisle çarpılmasıyla yapılır.

Adım 2

Orijinal görüntüyü 8x8 matrislere böldük. Her bileşen için ayrı ayrı - 8 bitten üç DCT çalışma matrisi oluşturuyoruz. Yüksek sıkıştırma oranlarında bu adım biraz daha zor olabilir. Görüntü Y bileşenine bölünür - ilk durumda olduğu gibi ve Cr ve Cb bileşenleri için matrisler çizgi ve sütun boyunca yazılır. Onlar. orijinal 16x16 matrisinden yalnızca bir çalışan DCT matrisi elde edilir. Bu durumda, görülmesi kolay olduğu gibi, görüntünün renk bileşenleri hakkında faydalı bilgilerin 3 / 4'ünü kaybeder ve hemen iki kat sıkıştırma elde ederiz. Bunu YCrCb uzayında çalışarak yapabiliriz. Uygulamanın gösterdiği gibi, bu, elde edilen RGB görüntüsünü çok fazla etkilemez.

Aşama 3

Her çalışma matrisine DCT uygularız. Bu durumda, sol üst köşedeki katsayıların görüntünün düşük frekans bileşenine ve sağ altta - yüksek frekans bileşenine karşılık geldiği bir matris elde ederiz.

Basitleştirilmiş bir biçimde, bu dönüşüm aşağıdaki gibi temsil edilebilir:

4. Adım

Kuantizasyon yapıyoruz. Prensipte, bu basitçe çalışma matrisinin niceleme matrisi elemanına elemana bölünmesidir. Her bileşen için (Y, U ve V), genel durumda, kendi niceleme matrisi q (bundan sonra MC olarak anılacaktır) belirtilir. Bu adımda sıkıştırma oranı kontrol edilir ve en büyük kayıp meydana gelir. MC'yi büyük katsayılarla ayarlayarak daha fazla sıfır ve sonuç olarak daha büyük bir sıkıştırma oranı elde edeceğimiz açıktır.

Algoritmanın spesifik etkileri de niceleme ile ilişkilidir. Gama katsayısının yüksek değerlerinde, düşük frekanslardaki kayıplar o kadar büyük olabilir ki görüntü 8x8 karelere bölünür. Yüksek frekanslardaki kayıplar, keskin bir renk geçişi ile konturların etrafında bir tür "nimbus" oluştuğunda, "Gibbs etkisi" olarak adlandırılan şekilde kendini gösterebilir.

Adım 5.

8x8 matrisini “zikzak” tarama kullanarak 64 elemanlı bir vektöre çeviriyoruz, yani. (0,0), (0,1), (1,0), (2,0)...

Böylece, vektörün başlangıcında, düşük frekanslara ve sonunda - yüksek frekanslara karşılık gelen matrisin katsayılarını alırız.

6. Adım

Grup kodlama algoritmasını kullanarak vektörü sararız. Bu durumda, "atla"nın atlanan sıfırların sayacı olduğu ve "sayı"nın bir sonraki hücreye yazılması gereken değer olduğu türde (atlama, sayı) çiftler elde ederiz. Böylece, 42 3 0 0 0 -2 0 0 0 0 1 ... vektörü (0.42) (0.3) (3,-2) (4.1) ... çiftleri halinde katlanır.

7. Adım

Ortaya çıkan çiftleri Huffman kodlaması ile sabit bir tablo ile katlıyoruz.

Bu algoritmadaki görüntü yeniden oluşturma işlemi tamamen simetriktir. Yöntem, bazı görüntüleri ciddi kayıplar olmadan 10-15 kat sıkıştırmanıza izin verir.


JPEG algoritmasında kullanılan işlem ardışık düzeni.

Algoritmanın önemli olumlu yönleri şunlardır:

  1. Sıkıştırma oranını ayarlar.
  2. izin günü renkli bir görüntüde nokta başına 24 bit olabilir.
Algoritmanın dezavantajları şunlardır:
  1. Sıkıştırma oranını artırmak, görüntüyü ayrı karelere (8x8) böler. Bunun nedeni, kuantizasyon sırasında düşük frekanslarda büyük kayıpların meydana gelmesidir ve orijinal verileri geri yüklemek imkansız hale gelir.
  2. Gibbs efekti görünür - keskin renk geçişlerinin sınırları boyunca haleler.
Daha önce de belirtildiği gibi, JPEG nispeten yakın zamanda standart hale getirildi - 1991'de. Ancak o zaman bile daha az kalite kaybıyla daha güçlü sıkıştıran algoritmalar vardı. Gerçek şu ki, standart geliştiricilerin eylemleri, o sırada var olan teknolojinin gücü ile sınırlıydı. Yani, kişisel bir bilgisayarda bile, algoritma ortalama bir görüntü üzerinde bir dakikadan daha az çalışmak zorundaydı ve donanım uygulaması nispeten basit ve ucuz olmalıdır. Algoritmanın simetrik olması gerekiyordu (açma zamanı yaklaşık olarak arşivleme zamanına eşittir).

İkinci gereklilik, dijital kameralar gibi oyuncakları mümkün kıldı - PCMCIA arayüzlü 10-20 MB flash kartta 24 bit fotoğraflar çeken küçük bir video kamera boyutundaki cihazlar. Daha sonra bu kart dizüstü bilgisayarınızın yuvasına takılır ve ilgili program görüntüleri okumanızı sağlar. Algoritma asimetrik olsaydı, cihaz “yeniden şarj olana” - görüntüyü sıkıştırana kadar uzun süre beklemenin hoş olmayacağı doğru değil mi?

JPEG'in pek hoş olmayan bir başka özelliği de, ekrandaki yatay ve dikey şeritlerin genellikle kesinlikle görünmez olması ve yalnızca hareli desen biçiminde yazdırıldığında görünebilmesidir. Görüntünün yatay ve dikey şeritlerine eğik bir baskı deseni uygulandığında oluşur. Bu sürprizler nedeniyle JPEG, yüksek katsayılar ayarlayarak baskıda aktif kullanım için önerilmez. Ancak, insan görüntüleme amaçlı görüntüleri arşivlerken, şu anda vazgeçilmezdir.

JPEG'in uzun bir süre yaygın olarak kullanılması, belki de yalnızca 24 bit görüntülerle çalışması gerçeğiyle engellendi. Bu nedenle geleneksel bir monitörde kabul edilebilir kalitede bir resmin 256 renk paletinde görüntülenebilmesi için uygun algoritmaların kullanılması ve dolayısıyla belirli bir süre gerekliydi. Oyunlar gibi seçici bir kullanıcıyı hedefleyen uygulamalarda bu tür gecikmeler kabul edilemez. Ek olarak, örneğin 8 bit GIF biçiminde, 24 bit JPEG'e dönüştürülmüş ve ardından görüntülemek için GIF'e dönüştürülmüş resimleriniz varsa, her iki dönüştürmede de iki kez kalite kaybı olur. Ancak, arşiv boyutundaki kazanç genellikle o kadar büyüktür (3-20 kat!) ve kalitedeki kayıp o kadar küçüktür ki, görüntüleri JPEG formatında depolamak çok verimlidir.

Bu algoritmanın modifikasyonları hakkında birkaç söz söylenmelidir. JPEG bir ISO standardı olmasına rağmen, dosya formatı sabitlenmemiştir. Bunu kullanarak üreticiler kendi uyumsuz formatlarını yaratırlar ve bu nedenle algoritmayı değiştirebilirler. Böylece, ISO tarafından önerilen algoritmanın iç tabloları, kendileri tarafından değiştirilir. Ek olarak, kayıp derecesi belirlenirken hafif bir karışıklık vardır. Örneğin, test ederken, “mükemmel” kalite, “%100” ve “10 puan”ın önemli ölçüde farklı resimler verdiği ortaya çıkıyor. Aynı zamanda “%100” kalite kayıpsız sıkıştırma anlamına gelmez. Belirli uygulamalar için JPEG çeşitleri de vardır.

ISO Standardı JPEG, bilgisayar ağlarında görüntü alışverişinde nasıl daha yaygın olarak kullanılmaya başlandı. JPEG algoritması Quick Time, PostScript Level 2, Tiff 6.0 formatlarında desteklenmektedir ve şu anda multimedya sistemlerinde önemli bir yer tutmaktadır.

Algoritma Özellikleri JPEG:

Görüntü sınıfı: Keskin renk geçişleri olmayan tam renkli 24 bit veya gri tonlamalı görüntüler (fotoğraflar).

Simetri: 1

Özellikler: Bazı durumlarda, algoritma görüntüdeki keskin yatay ve dikey kenarların etrafında bir "halo" oluşturur (Gibbs etkisi). Ek olarak, yüksek derecede sıkıştırma ile görüntü 8x8 piksellik bloklara bölünür.

Fraktal Algoritma

Yöntem fikri

Fraktal arşivleme, görüntüyü daha kompakt bir biçimde - yinelenen işlevler sisteminin (Yinelenen İşlev Sistemi - bundan sonra IFS olarak anılacaktır) katsayılarını kullanarak temsil etmemize dayanır. Arşivleme sürecinin kendisini düşünmeden önce, IFS'nin bir görüntüyü nasıl oluşturduğuna bakalım, yani. dekompresyon süreci.

Kesin olarak konuşursak, IFS, bizim durumumuzda bir görüntüyü diğerine dönüştüren bir dizi üç boyutlu afin dönüşümdür. Üç boyutlu uzaydaki noktalar (x_koordinatı, y_koordinatı, parlaklık) dönüşüme tabi tutulur.

Bu süreç en açık şekilde Barnsley tarafından “Fractal Image Compression” adlı kitabında gösterilmiştir. Orada, orijinal görüntünün görüntülendiği bir ekrandan ve görüntüyü başka bir ekrana yansıtan bir mercek sisteminden oluşan bir Fotokopi konsepti tanıtıldı:

  • Lensler görüntünün bir bölümünü yansıtabilir serbest çalışma yeni görüntüdeki başka herhangi bir yere.
  • alanlar, hangisinde görüntüler yansıtılır kesişme.
  • lens olabilir parlaklığı değiştir ve kontrastı azalt.
  • lens olabilir çevir ve döndür görüntü parçanız.
  • Lens meli derecelendirmek(azalt) görüntü parçanızı.

Lensleri yerleştirerek ve özelliklerini değiştirerek ortaya çıkan görüntüyü kontrol edebiliriz. Makinenin çalışmasının bir yinelemesi, projeksiyon yardımıyla orijinal görüntüden yenisinin oluşturulması ve ardından yenisinin ilk olarak alınması gerçeğinden oluşur. Yinelemeler sürecinde değişmeyi bırakacak bir görüntü alacağımız iddia ediliyor. Yalnızca lenslerin konumuna ve özelliklerine bağlı olacaktır ve orijinal görüntüye bağlı olmayacaktır. Bu görüntünün adı " sabit nokta" veya cazibe merkezi bu IFS. Karşılık gelen teori, her IFS için tam olarak bir sabit nokta olduğunu garanti eder.

Mercek eşleme daraltıcı olduğundan, her mercek açıkça tanımlar kendine benzer imajımızdaki alanlar. Kendi kendine benzerlik sayesinde, herhangi bir büyütmede karmaşık bir görüntü yapısı elde ederiz. Bu nedenle, yinelenen işlevler sisteminin tanımladığı sezgisel olarak açıktır. fraktal(kesinlikle - kendine benzer matematiksel nesne).

En ünlüsü, IFS'nin yardımıyla elde edilen iki görüntüdür: “Sierpinski üçgeni” ve “Barnsley eğreltiotu”. "Sierpinski üçgeni" üç tarafından ve "Barnsley eğreltiotu" dört afin dönüşümle (veya bizim terminolojimizde "mercekler") verilir. Her dönüşüm, kelimenin tam anlamıyla okunan baytlarla kodlanırken, onların yardımıyla oluşturulan görüntü birkaç megabayt alabilir.

Alıştırma: Görüntünün tamamını kaplayacak şekilde birleşecek ve her biri görüntünün tamamına benzeyen 4 alanı belirtin (eğreltiotu sapını unutmayın).

Yukarıdan, arşivleyicinin nasıl çalıştığı ve neden bu kadar zaman aldığı açıkça ortaya çıkıyor. Aslında fraktal sıkıştırma, bir görüntüde kendine benzer alanların aranması ve bunlar için afin dönüşümlerin parametrelerinin belirlenmesidir.

=>
En kötü durumda, bir optimizasyon algoritması uygulanmazsa, farklı boyutlardaki tüm olası görüntü parçalarını numaralandırmak ve karşılaştırmak gerekecektir. Küçük görüntüler için bile, ayrılığı hesaba katarak, sıralanacak astronomik sayıda seçenek elde edeceğiz. Ayrıca, örneğin yalnızca belirli sayıda ölçekleme yoluyla dönüşüm sınıflarının keskin bir şekilde daraltılması bile, zaman açısından gözle görülür bir kazanç sağlamaz. Ayrıca, görüntünün kalitesi kaybolur. Fraktal sıkıştırma alanındaki araştırmaların büyük çoğunluğu artık yüksek kaliteli bir görüntü elde etmek için gereken arşivleme süresini azaltmayı hedefliyor.

Tanım.

nerede a,b,c,d,e,f gerçek sayılar ve denir iki boyutlu afin dönüşüm.

Tanım. Dönüşüm, formda gösterilebilir

a, b, c, d, e, f, p, q, r, s, t, u reel sayılardır ve üç boyutlu afin dönüşüm olarak adlandırılır.

Tanım. X uzayında bir dönüşüm olsun. sabit nokta(çekici) dönüşümün.

Tanım. Bir metrik uzayda (X, d) bir dönüşümün, eğer bir sayı varsa, daraltıcı olduğu söylenir. s: öyle ki

Yorum: Resmi olarak, fraktal sıkıştırma için herhangi bir daralma eşlemesi kullanabiliriz, ancak gerçekte katsayılar üzerinde oldukça güçlü kısıtlamalarla birlikte yalnızca üç boyutlu afin dönüşümleri kullanılır.

Teorem. (Sıkıştırma dönüşümü hakkında)

Tam bir metrik uzayda olsun (X, D). O zaman bu dönüşümün tam olarak bir sabit noktası vardır ve herhangi bir nokta için dizi için yakınsar.

Bu teoremin daha genel bir formülasyonu yakınsamayı garanti eder.

Tanım. resim birim karede tanımlanan ve 0'dan 1'e kadar değerler alan bir S fonksiyonudur veya

Üç boyutlu afin dönüşüm şu şekilde yazılabilir:

ve Kartezyen kare x'in kompakt bir alt kümesinde tanımlanır. Sonra yüzeyin bir kısmını çevirecek S bir vardiya ile bulunan alana (e,f) ve matris tarafından verilen döndürme

Ancak değeri yorumlarsak S karşılık gelen noktaların parlaklığı olarak azalacaktır. P kez (dönüşüm büzülmeli olmalıdır) ve bir vardiyaya dönüşecek Q.

Tanım. sonlu nüfus W etki alanları üzerinde tanımlanan üç boyutlu afin dönüşümleri daraltmak ve , denir yinelenen işlevler sistemi ( IFS).

Yinelenen işlevlerden oluşan bir sistem, benzersiz bir şekilde sabit bir noktayla - bir görüntüyle ilişkilendirilir. Bu nedenle, sıkıştırma işlemi sistemin katsayılarının bulunmasından oluşur ve açma işlemi, elde edilen görüntü sabitlenene kadar (sabit nokta IFS) sistemin yinelenmesinden oluşur. Pratikte 7-16 tekrar yeterlidir. Bölgeler olarak anılacaktır sıralama, ve alanlar ihtisas.

Algoritma oluşturma

Yukarıdan da anlaşılacağı gibi, fraktal algoritma tarafından sıkıştırmada ana görev, karşılık gelen afin dönüşümleri bulmaktır. En genel durumda, herhangi bir boyut ve şekildeki görüntü alanlarını çevirebiliriz, ancak bu durumda, şu anda bir süper bilgisayarda bile işlenemeyen farklı parçaların ayıklanması için astronomik sayıda seçenek elde ederiz.

İÇİNDE algoritmanın eğitim versiyonu , aşağıda belirtilen alan üzerinde aşağıdaki kısıtlamalar yapılmıştır:

  1. Tüm bölgeler kenarları görüntünün kenarlarına paralel olan karelerdir. Bu sınırlama oldukça şiddetlidir. Aslında, tüm geometrik şekil çeşitlerine sadece karelerle yaklaşacağız.
  2. Bir alan alanını bir sıralama alanına dönüştürürken, boyut küçülür tam olarak iki kez. Bu, hem kompresörü hem de dekompresörü büyük ölçüde basitleştirir. küçük alanları ölçekleme görevi önemsiz değildir.
  3. Tüm alan blokları karelerdir ve sabit boyut. Görüntü, tek tip bir ızgara ile bir dizi etki alanı bloğuna bölünür.
  4. Domain alanları alınır hem X hem de Y'de "bir noktadan", bu da aramayı hemen 4 kat azaltır.
  5. Bir etki alanı etki alanını bir rütbeye dönüştürürken, küp döndürülebilir sadece 0 0 , 90 0 , 180 0 veya 270 0'da. Yansıtma da izin verilir. Toplam olası dönüşüm sayısı (boş sayılır) 8'dir.
  6. Dikey olarak ölçekleme (sıkıştırma) (parlaklık) yapılır sabit sayıda kez- 0.75'te.
Bu kısıtlamalar şunları sağlar:
  1. Yeterince büyük görüntülerde bile nispeten az sayıda işlem gerektiren bir algoritma oluşturun.
  2. Bir dosyaya yazılacak verileri temsil etmek çok kompakttır. IFS'deki her afin dönüşüm için ihtiyacımız var:
  • etki alanı bloğunun ofsetini ayarlamak için iki sayı. Giriş görüntülerini 512x512 ile sınırlarsak, sayı başına 8 bit yeterli olacaktır.
  • Bir etki alanı bloğunu bir sıra bloğuna dönüştürürken simetri dönüşümünü belirtmek için üç bit.
  • Çeviri sırasında parlaklık kaymasını ayarlamak için 7-9 bit.
Blok boyutu bilgileri dosya başlığında saklanabilir. Böylece, afin dönüşümü başına 4 bayttan daha az harcadık. Blok boyutunun ne olduğuna bağlı olarak, görüntüde kaç blok olacağını hesaplayabilirsiniz. Böylece, sıkıştırma derecesinin bir tahminini alabiliriz.

Örneğin, blok boyutu 8 piksel olan 512x512 piksellik 256 renkli bir gri tonlamalı dosya için afin dönüşümler 4096 (512/8x512/8) olacaktır. Her biri 3.5 bayt gerektirir. Bu nedenle, orijinal dosya 262144 (512x512) bayt (başlık hariç) işgal ederse, katsayılı dosya 14336 bayt alacaktır. Arşivleme katsayısı - 18 kez. Aynı zamanda, katsayılı bir dosyanın da yedekli olabileceğini ve LZW gibi kayıpsız bir arşivleme yöntemi kullanılarak arşivlenebileceğini dikkate almıyoruz.

Önerilen kısıtlamaların olumsuz yönleri:

  1. Tüm alanlar kare olduğundan, şekil olarak karelerden uzak (gerçek görüntülerde oldukça yaygın olan) nesnelerin benzerliğini kullanmak imkansızdır.
  2. Benzer şekilde, benzerlik katsayısı 2'den çok farklı olan görüntüdeki nesnelerin benzerliğini kullanamayacağız.
  3. Algoritma, aralarındaki açı 90 0'ın katı olmayan görüntüdeki nesnelerin benzerliğini kullanamaz.
Bu ücret sıkıştırma hızı ve katsayıları bir dosyaya paketleme kolaylığı için.

Paketleme algoritmasının kendisi, tüm etki alanı bloklarının numaralandırılmasına ve karşılık gelen her bir sıra bloğunun seçimine indirgenir. Aşağıda bu algoritmanın bir diyagramı bulunmaktadır.

for (tüm aralık blokları) (
min_mesafe = MaksimumMesafe;
r ij= image->CopyBlock(i,j);
for (tüm etki alanı blokları) ( // Döndürmeler ve neg.
akım=Mevcut koordinatlar dönüşümler;
D=image->CopyBlock(mevcut);
akım_mesafe = R ij.L2mesafe(D);
if(geçerli_mesafe< min_distance) {
// En iyi oranlar daha kötüyse:
min_mesafe = akım_mesafe;
en iyi=mevcut;
}
) //Sonraki aralık
Save_Coectives_to_file(en iyi);
) //Sonraki alan

Yukarıdaki algoritmadan görülebileceği gibi, her bir rank bloğu için onu tüm olası etki alanı bloklarıyla (simetri dönüşümü geçirmiş olanlar dahil) kontrol ederiz, en küçük L ölçüsüne sahip varyantı buluruz. 2 (en küçük standart sapma) ve bu dönüşümün katsayılarını bir dosyaya kaydedin. Katsayılar (1) bulunan bloğun koordinatları, (2) simetri dönüşümünü (dönüş, bloğun yansıması) karakterize eden 0 ila 7 arasında bir sayı ve (3) bu blok çifti için parlaklıktaki kaymadır. Parlaklık kayması şu şekilde hesaplanır:

,

nerede r ij- sıralama bloğunun piksel değerleri ( r), fakat D ij- alan bloğunun piksel değerleri ( D). Bu durumda, önlem şu şekilde kabul edilir:

.

L'nin karekökünü hesaplamıyoruz 2 ölçün ve bölmeyin n, dönüştürme verileri monoton olduğundan ve ekstremumu bulmamıza engel olmayacağından, ancak her blok için iki işlem daha az gerçekleştirebileceğiz.

Gri tonlamalı 256 renkli 512x512 piksel ve blok boyutu 8 piksel olan bir görüntüyü sıkıştırmak için ihtiyacımız olan işlem sayısını hesaplayalım:

Böylece sıkıştırma algoritmasının işlem sayısını oldukça hesaplanabilir (birkaç saat içinde de olsa) değerlere indirmeyi başardık.

Görüntü sıkıştırma algoritmasının şeması

Fraktal sıkıştırma algoritmasının dekompresyonu son derece basittir. Sıkıştırma aşamasında katsayıları elde edilen üç boyutlu afin dönüşümlerinin birkaç yinelemesini gerçekleştirmek gerekir.

Kesinlikle herhangi bir görüntü (örneğin, kesinlikle siyah) ilk görüntü olarak alınabilir, çünkü karşılık gelen matematiksel aparat bize IFS yinelemeleri sırasında elde edilen görüntü dizisinin hareketsiz bir görüntüye (orijinal olana yakın) yakınsamasını garanti eder. Bunun için genellikle 16 iterasyon yeterlidir.

Dosyadan tüm blokların katsayılarını okuyun;
İstenilen boyutta siyah bir görüntü oluşturun;
Kadar(görüntü hareketsiz olmayacak)(
İçin(her aralık (R))(
D=image->CopyBlock(D_coord_for_R);
için(her piksel( ben, j) blokta(
r ij = 0.75 D ben + Ö R;
) //Sonraki piksel
) //Sonraki blok
)//Sonuna kadar

Blokların katsayılarını kaydettiğimizden beri r ij(belirttiğimiz gibi, bizim özel durumumuzda aynı büyüklükteki karelerdir) art arda, bir afin dönüşüm kullanarak görüntüyü art arda bölme ızgarasının kareleriyle doldurduğumuz ortaya çıktı.

Hesaplanabileceği gibi, gri tonlamalı görüntünün restorasyon sırasında piksel başına işlem sayısı alışılmadık derecede küçüktür (N işlem “+”, 1 işlem “*”, burada N yineleme sayısıdır, yani 7-16). Bu nedenle, fraktal algoritma için görüntü açma, örneğin 64 "+" ve 64 "? ” (RLE adımları ve Huffman kodlaması hariç!). Aynı zamanda, fraktal algoritma için çarpma, her blok için bir rasyonel sayı ile gerçekleşir. Bu, ilk olarak, kayan nokta aritmetiğinden önemli ölçüde daha hızlı olan tamsayılı rasyonel aritmetiği kullanabileceğimiz anlamına gelir. İkinci olarak, bir vektörü bir sayı ile çarpmak, genellikle işlemci mimarisinde (SGI işlemciler, Intel MMX...) yerleşik olarak bulunan, JPEG durumunda gerekli olan iki vektörün skaler ürününden daha basit ve daha hızlı bir işlemdir. Tam renkli bir görüntü için, her iki algoritma da başka bir renk uzayına dönüştürmeyi kullandığından durum niteliksel olarak değişmez.

Kayıpların tahmini ve düzenleme yolları

Algoritmanın basitleştirilmiş versiyonunun özetinde birçok önemli konu gözden kaçmış. Örneğin, algoritma görüntünün herhangi bir parçası için benzer bir görüntü bulamazsa ne olur? Yeterince açık olan çözüm, bu parçayı daha küçük parçalara bölmek ve onları aramaya çalışmaktır. Aynı zamanda, bu prosedürün süresiz olarak tekrarlanamayacağı açıktır, aksi takdirde gerekli dönüşümlerin sayısı o kadar çok olur ki, algoritma bir sıkıştırma algoritması olmaktan çıkar. Bu nedenle, görüntünün bir kısmında kaybolmaya izin veriyoruz.

Fraktal sıkıştırma algoritması ve diğer kayıplı sıkıştırma algoritmaları için, sıkıştırma derecesini ve kayıp derecesini kontrol etmenin mümkün olacağı mekanizmalar çok önemlidir. Bugüne kadar, yeterince büyük bir bu tür yöntemler seti geliştirilmiştir. İlk olarak, sıkıştırma oranının sabit bir değerden düşük olmamasını sağlayarak afin dönüşümlerin sayısını sınırlamak mümkündür. İkinci olarak, işlenmekte olan parça ile en iyi yaklaşımı arasındaki farkın belirli bir eşik değerinin üzerinde olduğu bir durumda, bu parçanın zorunlu olarak bölünmesi gerekebilir (bunun için mutlaka birkaç “mercek” oluşturulur). Üçüncüsü, örneğin dört noktadan daha küçük parçaların parçalanmasını yasaklamak mümkündür. Bu koşulların eşiklerini ve önceliğini değiştirerek, bit eşleştirmeden herhangi bir sıkıştırma derecesine kadar olan aralıktaki görüntü sıkıştırma oranı üzerinde çok esnek bir kontrole sahip olacağız. Bu esnekliğin en yakın "rakip" olan JPEG algoritmasından çok daha yüksek olacağını unutmayın.

Fraktal algoritmanın özellikleri :

Sıkıştırma Oranları: 2-2000 (Kullanıcı Tanımlı)

Görüntü sınıfı: Keskin renk geçişleri olmayan tam renkli 24 bit veya gri tonlamalı görüntüler (fotoğraflar). Daha büyük öneme sahip alanların (algı için) daha zıt ve keskin olması ve daha az öneme sahip alanların - düşük kontrastlı ve bulanık olması arzu edilir.

Simetri: 100-100000

Özellikler: Sıkıştırmayı açarken görüntüyü serbestçe ölçeklendirebilir, "merdiven efekti" görünümü olmadan 2-4 kat artırabilir. Sıkıştırma seviyesi arttıkça görüntüdeki blokların kenarlarında “bloklu” bir efekt belirir.

Özyinelemeli (dalga) algoritma

Özyinelemeli sıkıştırmanın İngilizce adı dalgacıktır. Rusça'ya dalga sıkıştırması ve patlamaları kullanan sıkıştırma olarak çevrilir. Bu tür arşivleme uzun zamandır bilinmektedir ve doğrudan bölgelerin uyumunu kullanma fikrinden kaynaklanmaktadır. Algoritma, yumuşak geçişlerle renkli ve siyah beyaz görüntülere odaklanır. Röntgen gibi resimler için idealdir. Sıkıştırma oranı ayarlanır ve 5-100 arasında değişir. Keskin kenarlarda, özellikle çapraz olarak geçenlerde daha yüksek bir katsayı ayarlamaya çalıştığınızda, bir "merdiven efekti" belirir - birkaç piksel boyutunda farklı parlaklıktaki adımlar.

Algoritmanın fikri, farkı dosyaya kaydetmemizdir - görüntüdeki komşu blokların ortalama değerleri arasındaki sayı, genellikle 0'a yakın değerler alır.

yani iki sayı a 2i Ve a 2i +1 her zaman olarak temsil edilebilir B 1 ben=(a 2i +a 2i +1 )/2 ve B 2 ben=(a 2i -a 2i +1 )/2. Benzer şekilde sıra a içiftler halinde bir diziye çevrilebilir B 1.2 ben.

Belirli bir örneğe bakalım: 8 piksel parlaklık değerinden oluşan bir diziyi sıkıştıralım ( a i): (220, 211, 212, 218, 217, 214, 210, 202). Aşağıdaki dizileri alacağız B 1 ben, Ve B 2 ben: (215.5, 215, 215.5, 206) ve (4.5, -3, 1.5, 4). değerlere dikkat edin B 2 ben0'a yeterince yakın. B 1 ben nasıl a i. Bu eylem, özyinelemeli olarak gerçekleştirilir, bu nedenle algoritmanın adı. (215.5, 215, 215.5, 206): (215.25, 210.75) (0.25, 4.75). Elde edilen katsayıları, tam sayılara yuvarlanmış ve sıkıştırılmış, örneğin, sabit tablolarla Huffman algoritmasını kullanarak bir dosyaya koyabiliriz.

Dönüşümümüzü zincire yalnızca iki kez uyguladığımızı unutmayın. Gerçekte, dalgacık dönüşümünü 4-6 kez uygulayabiliriz. Ayrıca, düzgün olmayan adım Huffman algoritma tabloları kullanılarak ek sıkıştırma elde edilebilir (yani, tablodaki en yakın değer için Huffman kodunu kaydetmemiz gerekir). Bu teknikler, fark edilir sıkıştırma oranları elde etmenizi sağlar.

Egzersiz:(215, 211) (0, 5) (5, -3, 2, 4) zincirini dosyadan geri yükledik (örneğe bakın). Dalga sıkıştırma algoritmasının yeniden oluşturacağı sekiz piksel parlaklık değerinden oluşan bir dizi oluşturun.

İki boyutlu veriler için algoritma benzer şekilde uygulanır. Parlaklıkları olan 4 noktalı bir karemiz varsa a 2i, 2j,a 2 ben +1 , 2j,a 2i, 2j+1, Ve a 2 ben +1 , 2 j +1, sonra

İlk B1 B2
resim B3 B4

Bu formülleri kullanarak, 512x512 piksellik bir görüntü için, ilk dönüşümden sonra, 256x256 eleman boyutunda 4 matris elde edeceğiz:

-- İlki, tahmin edebileceğiniz gibi, görüntünün küçültülmüş bir kopyasını saklayacaktır. İkincisi - yatay boyunca piksel değerleri çiftlerinin ortalama farklılıkları. Üçüncüsü - dikey boyunca piksel değerleri çiftlerinin ortalama farklılıkları. Dördüncüsü - köşegen boyunca piksel değerlerindeki ortalama fark. İki boyutlu duruma benzeterek, dönüşümümüzü tekrarlayabilir ve ilk matris yerine 128x128 boyutunda 4 matris elde edebiliriz. Dönüşümümüzü üçüncü kez tekrarlayarak, 4 matris 64x64, 3 matris 128x128 ve 3 matris 256x256 ile sonuçlanacağız. Uygulamada, bir dosyaya yazarken, son satırda () elde edilen değerler genellikle ihmal edilir (hemen dosya boyutunun yaklaşık üçte biri kadar bir kazanç elde edilir - 1- 1/4 - 1/16 - 1/64 ...).

Bu algoritmanın avantajları arasında, görüntüyü ağ üzerinden iletirken görüntünün kademeli olarak "gelişme" olasılığını kolayca gerçekleştirmenize izin vermesi gerçeği yer alır. Ayrıca, aslında görüntünün başında küçük bir kopyasını sakladığımız için, “kaba” görüntüyü başlığa göre göstermek daha kolaydır.

JPEG ve fraktal algoritmadan farklı olarak bu yöntem, örneğin 8x8 piksel gibi bloklarla çalışmaz. Daha doğrusu 2x2, 4x4, 8x8 vb. bloklarla çalışıyoruz. Ancak, bu blokların katsayılarını bağımsız olarak saklamamız nedeniyle, görüntüyü “mozaik” karelere bölmekten oldukça kolay kaçınabiliriz.

Dalga algoritmasının özellikleri:

Sıkıştırma Oranları: 2-200 (Kullanıcı Tanımlı)

Görüntü sınıfı: Fraktal ve JPEG gibi.

Simetri: ~1.5

Özellikler: Ek olarak, yüksek derecede sıkıştırma ile görüntü ayrı bloklara ayrılır.

Çözüm

Sonuç olarak, yukarıda tartışılan çeşitli görüntü sıkıştırma algoritmalarının parametrelerini özetleyen tablolara bakalım.

algoritma Sıkıştırmanın meydana geldiği görüntünün özellikleri
RLE Ardışık özdeş renkler: 2 2 2 2 2 2 15 15 15
LZW Aynı alt diziler: 2 3 15 40 2 3 15 40
huffman Farklı renk frekansı: 2 2 3 2 2 4 3 2 2 2 4
CCITT-3 Görüntüde beyaz rengin baskınlığı, tek renkle dolu geniş alanlar
özyinelemeli Pürüzsüz renk geçişleri ve keskin kenarlar yok
JPEG Keskin sınırlar yok
fraktal Görüntü Öğeleri Arasındaki Benzerlik
algoritma K-sen sıkıştırma zaman içinde simetri Ne için
odaklı
kayıplar Boyut
RLE 32, 2, 0.5 1 3.4 bit Değil 1B
LZW 1000, 4, 5/7 1.2-3 1-8 bit Değil 1B
huffman 8, 1.5, 1 1-1.5 8 bit Değil 1B
CCITT-3 213(3), 5, 0.25 ~1 1 bit Değil 1B
JBIG 2-30 kez ~1 1 bit Değil 2B
Kayıpsız JPEG 2 kez ~1 24 bit gri Değil 2B
JPEG 2-20 kez ~1 24 bit gri Evet 2B
özyinelemeli sıkıştırma 2-200 kez 1.5 24 bit gri Evet 2B
fraktal 2-2000 kez 1000-10000 24 bit gri Evet 2.5D

Uygulama alanı

JPEG algoritması, parlaklık ve renkte yumuşak geçişlerle gerçekçi sahneler içeren fotoğrafları ve resimleri sıkıştırmak için en uygundur. JPEG en yaygın olarak dijital fotoğrafçılıkta ve interneti kullanarak görüntüleri depolamak ve iletmek için kullanılır.

Öte yandan, JPEG, komşu pikseller arasındaki keskin kontrastın gözle görülür yapaylıklara yol açtığı çizimleri, metinleri ve işaret grafiklerini sıkıştırmak için çok az kullanışlıdır. Bu tür görüntüler, TIFF, GIF veya PNG gibi kayıpsız biçimlerde kaydedilmelidir.

JPEG (ve sıkıştırmayı bozmanın diğer yöntemleri), çok aşamalı işleme sırasında görüntüleri sıkıştırmak için uygun değildir, çünkü ara işleme sonuçları her kaydedildiğinde görüntülerde bozulmalar ortaya çıkacaktır.

JPEG, astronomik veya tıbbi görüntülerin sıkıştırılması gibi minimum kaybın bile kabul edilemez olduğu durumlarda kullanılmamalıdır. Bu gibi durumlarda, JPEG standardı tarafından sağlanan Kayıpsız JPEG sıkıştırma modu (ancak çoğu popüler codec bileşeni tarafından desteklenmez) veya JPEG-LS sıkıştırma standardı önerilebilir.

Sıkıştırma

Sıkıştırıldığında, görüntü RGB renk alanından YCbCr'ye (YUV) dönüştürülür. JPEG standardının (ISO / IEC 10918-1), YCbCr seçimini hiçbir şekilde düzenlemediği, diğer dönüşüm türlerine (örneğin, üçten farklı birkaç bileşenle) ve dönüştürme olmadan sıkıştırmaya izin verdiği belirtilmelidir. (doğrudan RGB'ye), ancak JFIF (JPEG Dosya Değişim Formatı, 1991'de C-Cube Microsystems tarafından önerilen ve şimdi fiili standart) belirtimi RGB-> YCbCr dönüşümünün kullanımını içerir.

RGB->YCbCr dönüşümünden sonra, renkten sorumlu Cb ve Cr görüntü kanalları için, parlaklık kanalı Y'nin her 4 piksel (2x2) bloğunun atanması gerçeğinden oluşan “desimasyon” (alt örnekleme) gerçekleştirilebilir. Cb ve Cr'nin ortalama değerleri ("4:2:0"). Aynı zamanda, her 2x2 blok için 12 değer (4 Y, 4 Cb ve 4 Cr) yerine sadece 6 kullanılır (her biri 4 Y ve bir ortalama Cb ve Cr). Sıkıştırmadan sonra geri yüklenen görüntünün kalitesi için daha yüksek gereksinimler varsa, inceltme yalnızca bir yönde gerçekleştirilebilir - dikey ("4:4:0" şeması) veya yatay ("4:2:2") veya gerçekleştirilmez hiç ("4:4:4").

Standart ayrıca 2x2 blok için değil, ardışık dört (dikey veya yatay) piksel için, yani 1x4, 4x1 bloklar (4:1:1 şema) ve 2x4 ve 4x2 için ortalama Cb ve Cr ile inceltmeye izin verir. (şema "4:1:0"). Cb ve Cr için farklı türlerde desimasyon kullanmak da mümkündür, ancak pratikte bu tür şemalar çok nadiren kullanılır.

Ayrıca parlaklık bileşeni Y ile Cb ve Cr renginden sorumlu bileşenler 8x8 piksellik bloklara bölünmüştür. Bu tür blokların her biri ayrı bir kosinüs dönüşümüne (DCT) tabi tutulur. Elde edilen DCT katsayıları nicelenir (genellikle Y, Cb ve Cr için farklı niceleme matrisleri kullanılır) ve run ve Huffman kodları kullanılarak paketlenir. JPEG standardı ayrıca çok daha verimli aritmetik kodlamanın kullanılmasına izin verir, ancak patent kısıtlamaları nedeniyle (JPEG standardında açıklanan aritmetik QM kodlayıcının patenti IBM'e aittir), pratikte nadiren kullanılır. Son sürümlerdeki popüler libjpeg kitaplığı, aritmetik kodlama desteği içerir, ancak bu yöntemle sıkıştırılmış görüntülerin görüntülenmesi sorunlu olabilir çünkü birçok görüntüleyici bunları çözmeyi desteklemez.

DCT katsayılarını nicelemek için kullanılan matrisler, JPEG dosyasının başlığında saklanır. Genellikle, yüksek frekans katsayılarının düşük frekanslı katsayılardan daha güçlü nicemlemeye tabi tutulacağı şekilde inşa edilirler. Bu, görüntüdeki ince detayların kabalaşmasına yol açar. Sıkıştırma oranı ne kadar yüksek olursa, tüm katsayıların nicelenmesi o kadar güçlü olur.

Bir görüntüyü JPEG dosyası olarak kaydettiğinizde, 1 ila 100 veya 1 ila 10 gibi bazı rastgele birimlerde bir kalite ayarı belirtirsiniz. Daha büyük bir sayı genellikle daha iyi kalite (ve daha büyük bir sıkıştırılmış dosya) anlamına gelir. Bununla birlikte, en yüksek kaliteyi kullanırken bile (yalnızca bunlardan oluşan bir niceleme matrisine karşılık gelir), geri yüklenen görüntü, hem DCT uygulamasının sonlu doğruluğu hem de yuvarlama ihtiyacı ile ilişkili olan orijinal görüntüyle tam olarak eşleşmeyecektir. Y, Cb, Cr değerleri ve en yakın tam sayıya DCT katsayıları. DCT kullanmayan Kayıpsız JPEG sıkıştırma modu, geri yüklenen ve orijinal görüntüler arasında tam bir eşleşme sağlar, ancak düşük verimliliği (sıkıştırma oranı nadiren 2'yi geçer) ve yazılım geliştiricilerin desteğinin olmaması, Kayıpsız'ın popülerliğine katkıda bulunmadı. JPEG.

Çeşitli JPEG sıkıştırma şemaları

JPEG standardı, kodlanmış verileri temsil etmenin iki ana yolunu sunar.

Mevcut codec bileşenlerinin çoğu tarafından desteklenen en yaygın olanı, kodlanmış görüntü bloğunun soldan sağa, yukarıdan aşağıya sıralı geçişini varsayan sıralı (sıralı JPEG) veri gösterimidir. Yukarıda açıklanan işlemler, her bir kodlanmış görüntü bloğu üzerinde gerçekleştirilir ve kodlama sonuçları, tek bir "tarama" biçiminde çıktı akışına yerleştirilir, yani sıralı olarak geçirilen ("taranmış") bir kodlanmış veri dizisidir. görüntü. Ana veya "temel" (temel) kodlama modu yalnızca böyle bir gösterime izin verir. Genişletilmiş (genişletilmiş) mod, sıralı ile birlikte aşamalı (aşamalı JPEG) veri gösterimine de izin verir.

Aşamalı JPEG durumunda, sıkıştırılmış veriler çıktı akışına, her biri tüm görüntüyü artan ayrıntılarla tanımlayan bir dizi tarama olarak yazılır. Bu, her taramada tam bir DCT katsayıları seti değil, sadece bazılarını kaydederek elde edilir: ilk - düşük frekans, sonraki taramalarda - yüksek frekans ("spektral seçim" yöntemi, yani spektral örnekler ) veya ardışık olarak, taramadan taramaya, DCT katsayılarının iyileştirilmesi (“ardışık yaklaşım” yöntemi, yani ardışık yaklaşımlar). Verilerin bu aşamalı gösterimi, JPEG dosyasının küçük bir bölümünü aktardıktan sonra görüntünün tamamını görmenizi sağladığından, düşük hızlı iletişim kanalları kullanılarak sıkıştırılmış görüntülerin iletilmesi sırasında özellikle yararlıdır.

Açıklanan her iki şema (hem sıralı hem de aşamalı JPEG) DCT'ye dayanmaktadır ve temelde orijinaliyle tamamen aynı olan restore edilmiş bir görüntü elde edilmesine izin vermez. Bununla birlikte, standart, DCT kullanmayan, ancak doğrusal bir tahmin edici (kayıpsız, yani "kayıpsız", JPEG) temelinde oluşturulan sıkıştırmaya da izin verir; bu, tam bir bit-bit eşleşmesini garanti eder. orijinal ve restore edilmiş görüntüler. Aynı zamanda, fotoğraf görüntüleri için sıkıştırma oranı nadiren 2'ye ulaşır, ancak bazı durumlarda garantili bozulma olmaması talep edilir. Adlarındaki benzerliğe rağmen, doğrudan JPEG ISO/IEC 10918-1 ile ilgili olmayan ISO/IEC 14495-1 tarafından açıklanan JPEG-LS sıkıştırma yöntemi kullanılarak gözle görülür şekilde daha yüksek sıkıştırma oranları elde edilebilir (ITU T.81 Tavsiyesi) ) standart (ITU T.87 Tavsiyesi).

Sözdizimi ve yapı

JPEG dosyası diziyi içerir işaretçiler, her biri 0xFF baytı ile başlayan, işaretçinin başlangıcını ve bir tanımlayıcı baytı belirtir. Bazı işaretleyiciler yalnızca bu bayt çiftinden oluşurken, diğerleri, işaretçinin bilgi bölümünün uzunluğuyla (bu alanın uzunluğu dahil, ancak başlangıç ​​iki baytı hariç) iki baytlık bir alandan oluşan ek veriler içerir. işaretleyici, yani 0xFF ve tanımlayıcı) ​​ve verilerin kendisi. Bu dosya yapısı, gerekli verileri (örneğin, satırın uzunluğu, satır sayısı ve sıkıştırılmış görüntünün renk bileşenlerinin sayısı) içeren bir işaretçiyi hızlı bir şekilde bulmanızı sağlar.

Temel JPEG işaretçileri
İşaretleyici bayt Uzunluk Amaç Yorumlar
YANİ BEN 0xFFD8 Numara Görüntü başlangıcı
SOF0 0xFFC0 değişken boyut Çerçeve başlangıcı (temel, DCT) Görüntünün, DCT ve Huffman kodu kullanılarak temel modda kodlandığını gösterir. İşaretçi, satır sayısını ve görüntü satırının uzunluğunu (işaretleyicinin başlangıcından itibaren sırasıyla 5 ve 7 ofset değerine sahip iki baytlık alanlar), bileşenlerin sayısını (noktadan 8'lik bir ofsetteki bayt alanı) içerir. işaretçinin başlangıcı), bileşen başına bit sayısı (işaretleyicinin başlangıcından itibaren 4'lük bir ofsetli bayt alanı) ve bileşenlerin oranı (örneğin, 4:2:0).
SOF1 0xFFC1 değişken boyut Çerçevenin başlangıcı (genişletilmiş, DCT, Huffman kodu) Görüntünün DCT ve Huffman kodu kullanılarak genişletilmiş modda kodlandığını gösterir. İşaretleyici, görüntünün satır sayısını ve satır uzunluğunu, bileşenlerin sayısını, bileşen başına bit sayısını ve bileşenlerin oranını (örneğin 4:2:0) içerir.
SOF2 0xFFC2 değişken boyut Çerçevenin başlangıcı (aşamalı, DCT, Huffman kodu) Görüntünün DCT ve Huffman kodu kullanılarak aşamalı modda kodlandığını gösterir. İşaretleyici, görüntünün satır sayısını ve satır uzunluğunu, bileşenlerin sayısını, bileşen başına bit sayısını ve bileşenlerin oranını (örneğin 4:2:0) içerir.
DHT 0xFFC4 değişken boyut Huffman tabloları içerir Bir veya daha fazla Huffman tablosu belirtir.
DQT 0xFFDB değişken boyut Kuantizasyon tablolarını içerir Bir veya daha fazla niceleme tablosu belirtir.
DRI 0xFFDD 4 bayt Tekrar aralığını belirtir RST işaretleri arasındaki aralığı belirtir n makro bloklarda.
s.o.s. 0xFFDA değişken boyut Taramayı Başlat Soldan sağa yukarıdan aşağıya baypas yönü ile görüntünün ilk veya sonraki taramasının başlangıcı. Temel kodlama modu kullanılmışsa, bir tarama kullanılır. Aşamalı modları kullanırken, çoklu taramalar kullanılır. SOS işaretçisi, görüntünün bilgilendirici (başlık) ve kodlanmış (aslında sıkıştırılmış veri) bölümleri arasında ayrılır.
RST n 0xFFD n Numara tekrar başlat Her birine eklendi r makroblok, nerede r- DRI işaretçisi yeniden başlatma aralığı. DRI işaretçisinin yokluğunda kullanılmaz. n, düşük 3 bit kod işaretçisi, 0'dan 7'ye döngü.
UYGULAMA n 0xFFE n değişken boyut Uygulamaya göre ayarla Örneğin, bir JPEG dosyasının EXIF'i, meta verileri TIFF tabanlı bir yapıda depolamak için APP1 işaretçisini kullanır.
COM 0xFFFE değişken boyut Bir yorum Yorum metnini içerir.
EOI 0xFFD9 Numara Resmin kodlanmış bölümünün sonu.

Avantajlar ve dezavantajlar

JPEG sıkıştırmanın dezavantajları, yüksek sıkıştırma oranlarında geri yüklenen görüntülerde karakteristik bozulmaların görünümünü içerir: görüntü 8x8 piksel boyutunda bloklara dağılır (bu etki, özellikle parlaklıkta yumuşak değişiklikler olan görüntü alanlarında belirgindir), yüksek olan alanlarda uzamsal frekans (örneğin, görüntünün kontrast konturları ve sınırları üzerinde) artefaktlar gürültü haleleri şeklinde görünür. JPEG standardının (ISO/IEC 10918-1, Ek K, madde K.8) blok artefaktlarını bastırmak için özel filtrelerin kullanımını sağladığına dikkat edilmelidir, ancak pratikte bu tür filtreler, yüksek verimliliklerine rağmen pratikte değildir. Kullanılmış. Bununla birlikte, eksikliklere rağmen, JPEG, oldukça yüksek (göründüğü sırada var olan alternatiflere kıyasla) sıkıştırma oranı, tam renkli görüntü sıkıştırma desteği ve nispeten düşük hesaplama karmaşıklığı nedeniyle çok yaygınlaştı.

JPEG sıkıştırma performansı

JPEG standardına göre sıkıştırma işlemini hızlandırmak için, özellikle DCT hesaplanırken geleneksel olarak hesaplamaların paralelleştirilmesi kullanılır. Tarihsel olarak, bu yaklaşımı kullanarak sıkıştırma sürecini hızlandırmaya yönelik ilk girişimlerden biri, 32-bit genel amaçlı yazmaçları kullanarak hesaplamaları etkili bir şekilde paralelleştirmeyi mümkün kılan orijinal bir DCT yaklaşımı öneren Kasperovich ve Babkin tarafından 1993 tarihli bir makalede anlatılmıştır. Intel 80386 işlemciler. daha üretken hesaplama şemaları, x86 mimarisi işlemci komut setinin SIMD uzantılarını kullandı. Paralel hesaplamayı yalnızca DCT için değil, aynı zamanda JPEG sıkıştırmanın diğer aşamaları (renk alanı dönüştürme, çalışma düzeyi, istatistiksel kodlama, vb.) ) ve 8x8 kodlanmış veya kodu çözülmüş görüntünün her bloğu için. Makale ilk kez [ bir kaynak?] JPEG standardına göre sıkıştırma ve kod çözme performansını önemli ölçüde hızlandıran CUDA teknolojisi kullanılarak JPEG algoritmasının tüm aşamalarının paralelleştirilmesinin uygulanması sunulmaktadır.

2010 yılında PLANETS projesinden bilim adamları, İsviçre Alpleri'ndeki özel bir sığınağa yerleştirilen özel bir kapsüle JPEG formatını okumak için talimatlar yerleştirdiler. Bu, 21. yüzyılın başında popüler olan dijital formatlar hakkında gelecek nesiller için bilgileri korumak için yapıldı.

Ayrıca bakınız

notlar

Bağlantılar

  • JFIF 1.02 spesifikasyonu (metin dosyası)
  • JPEG optimizasyonu. Bölüm 1 , Bölüm 2 , Bölüm 3 .
Eski güzel JPEG, birçok inkar edilemez avantajına rağmen, hala önemli sınırlamalara sahiptir. Bunları kaldırmak için, gelişimi uzun süredir devam eden yeni bir görüntü sıkıştırma yöntemi adı verildi. JPEG2000 artık resmi olarak tanınan bir format haline geldiğine göre, bu, çeşitli yazılım üreticileri tarafından aktif desteğinin başlangıcı olmalıdır.

Bir bilgisayarda grafiklerle çalışan pek çok kişi şu soruyla ilgileniyor: PC belleğinde çok etkileyici bir yer kaplayan bir görüntü, diskte çok daha küçük bir boyuta nasıl sıkıştırılabilir? Yayıncılık faaliyetimin başlangıcında, "sıkıştırma" kelimesinin benim için çok gizemli ve şaşırtıcı olduğunu hatırlıyorum... Gerçekten de, görüntü sıkıştırma nasıl çalışır - sonuçta, şimdi Web'i, dijital fotoğrafçılığı veya onsuz renkli baskı?

Yani sıkıştırma. Kalite kaybına neden olabilir veya olmayabilir. Son durum, RLE (Çalışma Uzunluğu Kodlaması, çalışma uzunluklarının kodlanması, sonuç olarak hangi tür çiftlerinin ( atlamak, değer, nerede atlamak ardışık sıfırların sayısıdır ve değer- onları takip eden değer) ve LZW (Lempel-Ziff-Welch yöntemiyle sıkıştırma), PSD, GIF ve TIFF formatlarında uygulanır. RAR ve ZIP gibi arşivleyiciler tarafından yaygın olarak kullanılırlar. Ortalama kayıpsız sıkıştırma oranı 2-3 katıdır.

Görüntüyü daha güçlü bir şekilde sıkıştırmanız gerekiyorsa, kalite kaybı olmadan yapamazsınız. İlkeler nelerdir? İlk olarak, herhangi bir görüntü, kaldırılması resmin kalitesinde gözle görülür bir değişikliğe yol açmayacak belirli bir fazlalık içerir. İkincisi, insan gözü parlaklıktaki değişikliklere renkten daha duyarlıdır. Bu nedenle, görüntünün farklı kanalları için farklı sıkıştırma oranları kullanılır - bilgi kaybolur, ancak bu görsel olarak fark edilmez. Ek olarak, gözün küçük görüntü öğelerine duyarlılığı düşüktür, bu da kaliteden ödün vermeden bunların çıkarılmasını mümkün kılar. Bu şekilde görüntüyü (kalite bozulması zaten fark edilebilir olsa bile) kabul edilebilir bir eşiğe kadar sıkıştırabilirsiniz. Her özel durum için kalite bozulma derecesi belirlenir. Yazdırma için, yalnızca minimum bozulmalar kabul edilebilir ve İnternet'te yayınlamak için (amaca bağlı olarak) - çok daha fazlası.

Kayıplı sıkıştırma yöntemleri arasında en popüler olanı, 30x sıkıştırmada bile yeterli görüntü kalitesini koruyan JPEG'dir. Bu arada, çoğu modern veri sıkıştırma yönteminde (örneğin, mp3 olarak bilinen Layer-4 ve MPEG), JPEG'e benzer mekanizmalar uygulanmaktadır. Bu biçime daha yakından bir göz atalım, özellikle de çok uzun zaman önce olmayan en son uygulaması olan JPEG2000 nihayet onaylandığından, geliştirmesinin on yılı boyunca JPEG / MPEG'e yapılan tüm eklemeleri içerir.

JPEG

Sıkıştırma algoritmasının adı, ITU (Uluslararası Telekomünikasyon Birliği) ve ISO (Uluslararası Standardizasyon Örgütü) uzmanları tarafından oluşturulan bir girişim grubu olan Joint Photographic Expert Group'un kısaltmasıdır. Adında Joint önekinin bulunmasının nedeni budur. 1992'de JPEG, grafikler için uluslararası standart olarak ilan edildi.

JPEG sıkıştırması her zaman kaliteyi kaybeder. Bu durumda, her zaman bir seçenek vardır: hacim pahasına kaliteyi tercih etmek (dosya boyutu yaklaşık üç kez sıkıştırılacaktır) veya tam tersi, hala tanınabilir kalacağı minimum görüntü boyutunu elde etmek için ( sıkıştırma oranı 100'e ulaşabilir). Ortaya çıkan görüntü ile orijinal arasındaki kalite farkının hala fark edilmediği sıkıştırma, dosya boyutunda 10-20 kat küçülme sağlar.

Uygulama alanı

JPEG, fotoğraf kalitesinde tam renkli ve tek renkli görüntüleri en iyi şekilde sıkıştırır. Bir görüntüyü indeks paleti ile kaydetmek istiyorsanız, önce tam renge dönüştürülür. JPEG yöntemini kullanarak sıkıştırırken, her şeyin görüntülerin doğasına bağlı olduğunu unutmamalısınız: renk değişikliklerinin önemsiz olduğu ve keskin renk geçişlerinin olmadığı yerler çok daha küçük bir hacim kaplayacaktır. JPEG, fotoğraf görüntülerinin depolanması gereken her yerde kullanılır: dijital kameralarda, baskıda (EPS DCS 2.0), İnternet onsuz düşünülemez.

Birkaç çeşit JPEG sıkıştırması vardır, ancak standart pakette Adobe Photoshop raster görüntüleri ile çalışmak için kullanılan bunlardan yalnızca ikisini ele alacağız - temel Ve ilerici. Diğer iki yöntem - aritmetik ve kayıpsız - birçok nedenden dolayı yaygın olarak kullanılmayan egzotiktir.

Sıkıştırma Nasıl Olur?

1. İlk aşama şunlardan oluşur: renk modeli dönüştürme görüntüyü (genellikle RGB) parlaklık ve renk bileşenlerinin ayrıldığı (örneğin, YCbCr veya YUV) bir modele dönüştürür, bu da her kanal için (göz algısını dikkate alarak) sıkıştırma seviyeleri seçimine en uygun şekilde yaklaşmanıza olanak tanır. Dönüşüm şu şekilde olur:

Y = 0.299xR+0.587*G+0.114xB Cb = (B-Y)/0.866/2+128 Cr = (R-Y)/0.701/2+128

2. Bir sonraki aşamada, sözde. ön filtreleme Cb ve Cr kanallarının her birinde ayrı ayrı komşu piksellerin yatay ve dikey yönlerde çiftler halinde gruplandırıldığı ve parlaklık kanalı Y'nin değişmeden bırakıldığı . Bundan sonra, dört piksellik grubun tamamı, ilgili Cb ve Cr bileşenlerinin ortalama değerini alır. Kısa olması için, böyle bir şema 4:1:1 olarak belirtilebilir (aynı temsil biçimi DRAW - jpeg dışa aktarma penceresi için de benimsenmiştir). Her pikselin 3 bayt (üç kanalın her biri için 256 seviye) olarak kodlandığı gerçeği göz önüne alındığında, sonuç olarak, veri miktarı otomatik olarak 2 kat azaltılır (4 pikseli aktarmak için 12 bayt yerine, sadece 4+1+1 = 6 bayt aktarmak için yeterli) . Matematik açısından bakıldığında, böyle bir dönüşüm önemli bir bilgi kaybına yol açar, ancak sıradan fotoğraf görüntülerinde önemli bir fazlalık olduğu için insan gözü kaybı algılamaz.

3. Birincil “temizlik” aşamasını geçen alınan bilgiler, yine her kanalda ayrı ayrı bloklar halinde gruplandırılır, ancak zaten 8x8 boyutundadır, daha sonra bunlara ana sıkıştırma uygulanır - sözde. ayrık kosinüs dönüşümü, kısaca - DCT (ayrık kosinüs dönüşümü). Sonuç olarak, bilgi dağıtım hakkında piksel parlaklığı, aşağıdakilere dayalı bir dağılımla tanımlandığı başka bir forma dönüştürülür. oluşma sıklığı bir veya başka piksel parlaklığı. DCT'nin diğer dönüşümlere (örneğin, Fourier dönüşümü) göre bir takım avantajları vardır ve daha iyi bilgi kurtarma sağlar.

Görüntüyü oluşturan her blok için 64 değerlik bir dizi (8x8 piksel) yerine 64 frekanslık bir dizi elde ediyoruz. DCT'nin çalışmasını bir örnek üzerinde düşünün. Diyelim ki görüntümüzün bir bloğundaki piksellerin parlaklığı Şekil 1'de gösterilen forma sahip. 1 solda, ardından dönüşüm sonucu sağda gösterildiği gibi olacaktır.

1

Önemli doğruluğa rağmen, bu aşamada bir miktar bilgi kaybı meydana gelir - bu nedenle JPEG her zaman kalite kaybına yol açar. Dönüşümün temel amacı, daha sonra önemsiz bilgileri ortadan kaldırırken kullanışlı olacak olan büyük (şekilde sol üstte) ve küçük (sağ altta) nesnelerin dağılımının genel resmini bulmaktır.

4. Bir sonraki aşama, gözle pek fark edilmeyen bilgilerin bloktan çıkarılması veya nicemleme(kuantizasyon). Tüm bileşenler, orijinal görüntünün kalitatif restorasyonu için her birinin önemini belirleyen çeşitli katsayılara bölünür ve sonuç yuvarlanmış bir tamsayı değerine Görüntünün son hacmini azaltarak en büyük kalite kaybını sağlayan bu prosedürdür. Yüksek frekanslı bileşenler kabaca nicelenir ve düşük frekanslı bileşenler en belirgin olduklarından daha kesin olarak nicelenir. Kalitedeki düşüşü biraz yumuşatmak için parlaklık kanalında renk kanallarından daha küçük bölme faktörleri kullanılır. Ancak daha sık (bu, hesaplamaları hızlandırmak için yapılır), özel olarak seçilen değerler yerine, yalnızca bir tane alınır - kullanıcının sıkıştırma derecesini seçerken girdiği.

Örneğin, Kalite parametresinin (veya daha doğrusu türevinin) aynı olduğu Web için kaydet işlemini kullanarak bir görüntüyü kaydederken Photoshop penceresinin nasıl göründüğü aşağıda açıklanmıştır. yuvarlama faktörü(İncir. 2).

Kuantizasyon sonucunda, orijinal görüntünün belirli bir doğrulukla geri yüklendiği bir dizi bileşen elde edilir (Şekil 3).

4

Şek. Şekil 4, sırasıyla bir, dört ve on beş bileşenli siyah beyaz bir kareyi geri yüklemenin sonucunu gösterir.

5. Görüntü sıkıştırma üzerinde ana çalışmayı gerçekleştirdikten sonra, diğer dönüşümler ikincil görevlere indirgenir: kalan bileşenler sırayla gidiyoröyle bir şekilde ki, önce büyük detaylardan sorumlu olanlar, sonra da daha küçük olanlar için. Şekle bakarsanız, kodlayıcının hareketi zikzak bir çizgi gibi görünüyor. Aşama ZigZag olarak adlandırılır (Şekil 5).

5

Daha sonra elde edilen dizi sıkıştırılır: önce normal RLE, ardından Huffman yöntemi.

6. Ve sonunda temiz teknik aşama- veriler, görüntünün geri yüklenebilmesi için tüm sıkıştırma parametrelerini gösteren bir başlık ile sağlanan bir kabuk içine alınır. Ancak bazen bu bilgiler başlıklarda yer almaz, bu da sıkıştırmada ek bir kazanç sağlar, ancak bu durumda dosyayı okuyacak uygulamanın bunları bildiğinden emin olmanız gerekir.

Burada, genel olarak ve tüm dönüşümler. Şimdi örneğimizde ne kadar sıkıştırma yapıldığını hesaplayalım. Orijinal 8x8 görüntüyü geri yükleyecek 7 değerimiz var. Böylece, her iki renk kanalında DCT-dönüştürme uygulamasından kaynaklanan sıkıştırma 8x8/7 9 kez olmuştur. Parlaklık kanalına 8x8/11 6 verecek olan yedi değil 11 katsayı atayalım. Her üç kanal için de (9+9+6)/3=8 kez elde ederiz. İkinci aşamada meydana gelen görüntünün “kırılması” sırasında kalitedeki düşüş, nihai sonucu verecek olan ek bir çift artış (şema 4-1-1, parlaklık bileşenini kodlamanın özelliklerini dikkate alarak) verir - 16 kez. Bu, bazı yönleri dikkate almayan, ancak gerçek resmi yansıtan kaba bir tahmindir. Dosya boyutunda otuz kat azalma elde etmek için yalnızca 3-4 bileşen bırakmanız gerekir.

Görüntü yeniden oluşturma işlemi ters sırada ilerler: ilk olarak, bileşenler niceleme tablosundaki değerlerle çarpılır ve ters kosinüs dönüşümü için yaklaşık katsayılar elde edilir. Sıkıştırma sırasında ne kadar iyi kalite seçilirse, orijinal katsayılara yakınlık derecesi o kadar yüksek olur, bu da görüntünün daha doğru şekilde geri yükleneceği anlamına gelir. Geriye sadece bir eylem eklemek kalıyor: Bitmeden önce, aralarındaki keskin farkları ortadan kaldırmak için komşu bloklardan sınır piksellerinde bazı ayarlamalar (gürültü) yapın.

JPEG'in dezavantajları

  1. Blok boyutu sınırlaması (sadece 8x8) nedeniyle yüksek sıkıştırma oranları elde etmenin imkansızlığı.
  2. Yüksek sıkıştırma oranlarında bloklu yapı.
  3. Bir görüntüdeki keskin köşeleri yuvarlayın ve ince öğeleri bulanıklaştırın.
  4. Yalnızca RGB görüntüleri desteklenir (DCS aracılığıyla EPS formatındaki CMYK görüntüleri için yalnızca JPEG kullanabilirsiniz).
  5. Resim tamamen yüklenene kadar görüntülenemez.

JPEG'in standart olarak onaylanmasından bu yana on yıl geçti. Bu süre zarfında, araştırma grupları orijinal versiyona bir dizi önemli eklemeler önerdiler ve bu da geçen yılın sonunda yeni bir standardın ortaya çıkmasıyla sonuçlandı.

JPEG2000

1997'den beri, JPEG tarafından getirilen tüm kısıtlamaları ortadan kaldıracak ve içerikten bağımsız olarak (siyah beyaz, gri tonlamalı, tam renkli ve çok bileşenli) her tür görüntüyle etkin bir şekilde çalışabilecek evrensel bir kodlama sistemi oluşturmaya yönelik çalışmalar başlamıştır. fotoğraflar, oldukça küçük metinler ve hatta çizimler olabilir). Uluslararası standardizasyon kuruluşlarının yanı sıra Agfa, Canon, Fujifilm, Hewlett-Packard, Kodak, LuraTech, Motorola, Ricoh, Sony ve diğerleri gibi endüstri devleri de geliştirmesinde yer aldı.

Yeni algoritmanın evrensel olduğu iddia edildiğinden, özellikle multimedya uygulamalarında, örneğin İnternet üzerinden gerçek yayınlarda kritik olan çeşitli veri iletimi yöntemlerini (gerçek zamanlı ve dar bir bant genişliğiyle) kullanmakla görevlendirildi.

JPEG2000 formatı için temel gereksinimler:

  1. JPEG'e kıyasla daha yüksek bir sıkıştırma derecesi elde etmek.
  2. Görüntüleri metinle sıkıştırmak için kullanılmasına izin verecek tek renkli görüntüler için destek.
  3. Kayıpsız sıkıştırma imkanı.
  4. Ayrıntılı olarak kademeli iyileştirme ile çıktı görüntüleri (aşamalı GIF'de olduğu gibi).
  5. Görüntüde kalitenin görüntünün geri kalanından daha yüksek ayarlanabileceği öncelikli alanların kullanımı.
  6. Gerçek zamanlı kod çözme (gecikme yok).

sıkıştırma prensibi

JPEG2000'deki ana sıkıştırma mekanizması olarak, JPEG'den farklı olarak, tüm görüntüye uygulanan bir filtre sistemi olan dalga (dalgacık) dönüşümü kullanılır. Sıkıştırmanın ayrıntılarına girmeden sadece ana noktaları not ediyoruz.

6
İlk olarak, tıpkı JPEG'de olduğu gibi, görüntü YCrCb sistemine dönüştürülür, ardından gereksiz bilgilerin birincil olarak kaldırılması (zaten bilinen komşu piksellerin 2x2 bloklara kombinasyonu ile). Ardından, görüntünün tamamı aynı boyuttaki parçalara bölünür (karo), her birinin üzerinde diğerlerinden bağımsız olarak daha fazla dönüşüm gerçekleşir (bu, bellek ve bilgi işlem kaynakları için gereksinimleri azaltır). Ayrıca her kanal, alçak geçiren ve yüksek geçiren filtrelerle sıralar ve sıralar halinde ayrı ayrı filtrelenir, bunun sonucunda ilk geçişten sonra her bölümde dört küçük görüntü (alt bant) oluşur. Hepsi orijinal görüntü hakkında bilgi taşır, ancak bilgi içerikleri çok farklıdır (Şekil 6).

Örneğin, satırlar ve satırlar (sol üst) tarafından alçak geçiren filtrelemeden sonra elde edilen görüntü en büyük miktarda bilgiyi taşırken, yüksek geçiren filtrelemeden sonra elde edilen görüntü minimuma sahiptir. Satırların düşük geçişli filtrelemesinden ve sütunlar için yüksek frekanslı filtrelemeden (ve tersi) sonra elde edilen görüntülerin bilgi içeriği ortalamadır. En bilgilendirici görüntü yeniden filtrelenir ve elde edilen bileşenler, jpeg sıkıştırmasında olduğu gibi nicelenir. Bu birkaç kez olur: kayıpsız sıkıştırma için, döngü genellikle kayıplarla 3 kez tekrarlanır - 10 yineleme boyut, kalite ve dekompresyon hızı arasında makul bir uzlaşma olarak kabul edilir. Sonuç, küçük bir resim ve küçük ayrıntılara sahip bir dizi resim, art arda ve belirli bir doğrulukla normal boyuta geri yüklenir. Açıkçası, daha fazla döngü ayarlanabildiğinden, en büyük sıkıştırma derecesi büyük görüntülerde elde edilir.

Pratik uygulama

JPEG2000 sıkıştırmasının temelleri atıldığından beri, bir dizi şirket, uygulanması için oldukça verimli algoritmalar geliştirdi.

Büyük yazılım geliştiricileri arasında Corel'in not edilebilir (bu arada, dalga dönüşümlerine dayalı wi formatı için destek ve onur ve övgü olduğu paketlerine ilk destek verenlerden biriydi) - tüm görüntüler CD'lerde sağlandı CorelDRAW paketi ile dokuzuncu sürüme kadar bu şekilde sıkıştırılmıştır.

Daha sonra, Adobe de ona yetişti. JPEG2000'in arkasındaki fikirlerden bazıları, Photoshop 6 geliştiricileri tarafından bir görüntüyü JPEG olarak kaydederken (düzenli, kosinüs dönüşümüne dayalı) gelişmiş seçenekler biçiminde uygulanmıştır. Bunların arasında aşamalı JPEG (Web için Kaydet penceresindeki Aşamalı seçeneği) bulunur. Bu algoritma öncelikle gerçek zamanlı sistemler için tasarlanmıştır ve aşamalı GIF ile tamamen aynı şekilde çalışır. İlk olarak, yalnızca birkaç büyük bloktan oluşan görüntünün kaba bir kopyası belirir ve zamanla, verilerin geri kalanı yüklendiğinde, yapı giderek daha net bir şekilde görüntülenmeye başlar, sonunda nihai görüntü olana kadar. tamamen restore edildi. GIF'den farklı olarak, bu algoritma, iletilen her sürüm için tüm dönüştürme döngüsünü tamamlaması gerekeceğinden görüntüleyici üzerinde büyük bir yük oluşturur.

Diğer eklemelerin yanı sıra, değişen derecelerde sıkıştırma, çözünürlük ve hatta renk modellerine sahip birkaç JPEG sıkıştırılmış görüntünün dosyasına dahil edildiğini not ediyoruz. Buna göre, Photoshop 6'da görüntüdeki tek tek alanları seçmek ve bunlara farklı sıkıştırma ayarları uygulamak mümkün hale geldi ( İlgi Alanı, ilk kez böyle bir mekanizma 1995'te önerildi), niceleme tablosunda daha düşük değerler kullanılarak. Bunu yapmak için gerekli alan ayarlanır (örneğin, görüntüde yeni bir kanal şeklinde) ve Kalite öğesinin yanında maske simgesine basılır. Görünen pencerede, kaydırıcıları hareket ettirerek görüntü ile deney yapabilirsiniz - bitmiş sonuç ekranda görüntülenerek kalite ve boyut arasında gerekli uzlaşmayı hızlı bir şekilde bulmanızı sağlar.

Özel dönüştürücüler ve görüntüleyiciler

Standart, sıkıştırma / açma yöntemlerinin belirli uygulamalarını belirtmediğinden, bu, üçüncü taraf sıkıştırma algoritması geliştiricilerine yer bırakır. Aslında, basitleştirilmiş bir dalga biçimi algoritması kullanabilir ve böylece sıkıştırma işlemini hızlandırabilir veya tam tersine daha karmaşık bir algoritma kullanabilir ve buna bağlı olarak büyük sistem kaynakları gerektirebilirsiniz.

Diğer şirketlerden özel çözümler, ticari gelişmeler olarak mevcuttur. Bazıları ayrı programlar (Aware tarafından geliştirilen JPEG 2000), diğerleri en yaygın tarama düzenleyicileri için eklenti modülleri olarak uygulanır (Pegasus Imaging tarafından geliştirilen ImagePress JPEG2000 ve LEAD Technologies'den LEAD JPEG2000 modülü). Arka planlarına karşı, uzun süredir bu konuyla ilgilenen LuraTech şirketi öne çıkıyor. LuraWave teknolojisini bağımsız ürün LuraWave SmartCompress'te teşvik eder (3. sürüm şimdi mevcuttur) ve Photoshop, Paintshop, Photopaint için modüller sunar. Ayırt edici bir özellik, birkaç megabayt boyutundaki resimlerde bile daha yüksek bir çalışma hızıdır (neredeyse anında dönüştürme). Buna göre, bu modülün fiyatı en yüksek - 79 dolar.

JPEG2000 görüntülerini tarayıcılarda görüntülemek için özel bir görüntüleme modülü yüklemeniz gerekir (tüm geliştiriciler bunu ücretsiz olarak sunar). Herhangi bir eklenti gibi bir html belgesine bir resim eklemek, EMBED yapısını (ek parametrelerle) kullanmaya gelir. Örneğin, aşamalı görüntü aktarım yönteminin kullanılacağı anlamına gelir. Yani, örneğimizde (139 KB dosya), önce kaba bir görüntünün oluşturulacağı yalnızca 250 bayt aktarılır, ardından 500 bayt yüklendikten sonra görüntü güncellenir (bu, LIMIT değeri olana kadar devam eder). ulaşmış).

Daha iyi bir görüntü elde etmek istiyorsanız, sağ tuşta açılan menüden İyileştir öğesini seçmeniz gerekir (Şekil 9). Dört özgeçmiş için, görüntünün tamamı tamamen indirilecektir.

9

sonuçlar

Bu nedenle, JPEG2000, yalnızca yüksek sıkıştırma oranlarında nesnel olarak JPEG'den daha iyi sonuçlar verir. 10-20 kat sıkıştırma ile çok fazla fark yoktur. Yaygın formatın yerini alabilecek mi yoksa basitçe rekabet edebilecek mi? Yakın gelecekte - pek çok durumda, JPEG tarafından sağlanan kalite / boyut oranı oldukça kabul edilebilir. Ve JPEG2000'in görsel olarak aynı kalitede sağladığı %10-20'lik ek sıkıştırmanın popülaritesinde bir artışa yol açması pek olası değildir.

Öte yandan, ışığa duyarlı matrislerin boyutu her yıl düzenli olarak arttığından ve görüntüleri belleğe yerleştirmek giderek zorlaştığından, dijital kamera şirketleri yeni formata büyük ilgi gösteriyor. Ve sonra yeni format daha yaygın hale gelecek ve kim bilir, belki bir süre sonra JPEG2000, JPEG'i yakalayacaktır. Her durumda, Analog Micro Devices yakın zamanda donanım düzeyinde yeni bir teknoloji kullanılarak sıkıştırma / açma işleminin uygulandığı özel bir çip yayınladı ve ABD Savunma Bakanlığı, casus uydulardan alınan fotoğrafları kaydetmek için aktif olarak yeni bir format kullanıyor.

gerçekler ve varsayımlar

1. Dosyayı açarken ve yeniden kaydederken JPEG kalitesini kaybediyor.

Doğru değil. Kalite yalnızca görüntünün kaydedildiği sıkıştırma oranından daha düşük bir sıkıştırma oranı seçildiğinde kaybolur.

2. Bir dosyayı düzenlerken JPEG kalitesini kaybeder.

Hakikat. Değiştirilmiş bir dosyayı kaydettiğinizde, tüm dönüştürmeler yeniden gerçekleştirilir - bu nedenle sık sık resim düzenleme yapmaktan kaçının. Bu yalnızca dosya kapatıldığında geçerlidir; dosya açık kalırsa endişelenmenize gerek yok.

3. Farklı programlarda aynı parametrelerle sıkıştırmanın sonucu aynı olacaktır.

Doğru değil. Farklı programlar, kullanıcı tarafından girilen değerleri farklı şekillerde yorumlar. Örneğin, bir programda, kaydedilen görüntünün kalitesi (örneğin Photoshop'ta olduğu gibi), diğerinde sıkıştırma derecesi (karşılıklı) belirtilir.

4. Maksimum kaliteye ayarlandığında, görüntü herhangi bir kalite kaybı olmadan kaydedilir.

Doğru değil. JPEG her zaman kayıplarla sıkıştırır. Ancak örneğin %100 yerine %90 kaliteyi ayarlamak, gözle algılanan kalite kaybından daha fazla dosya boyutunda bir azalmaya neden olur.

5. Herhangi bir JPEG dosyası, JPEG formatını anlayan herhangi bir düzenleyicide açılabilir.

Doğru değil. Aşamalı JPEG, bazı düzenleyicilerin anlamadığı bir JPEG çeşididir.

6. JPEG şeffaflığı desteklemez.

Hakikat. Bazen görüntünün bir kısmı saydam gibi görünebilir, ancak aslında rengi html sayfasındaki arka plan rengiyle eşleşecek şekilde seçilir.

7. JPEG, GIF'den daha iyi sıkıştırır.

Doğru değil. Farklı uygulama alanlarına sahiptirler. Genel olarak, JPEG'e dönüştürüldükten sonra tipik bir "gif" resmi daha büyük bir hacme sahip olacaktır.

JPEG2000 ve JPEG

7
1. 20-30x sıkıştırmada, JPEG2000 ve JPEG yaklaşık olarak aynı kaliteyi verir (bu arada Photoshop normal bir fotoğrafı bu sınırın ötesinde sıkıştıramaz).

2. Daha yüksek sıkıştırma ile, JPEG2000'in kalitesi, JPEG'den önemli ölçüde daha yüksektir; bu, 50 kata kadar fazla kayıp olmadan ve bazı kayıplarla (İnternet için resimlerden bahsediyoruz) - 100'e kadar ve hatta daha fazla sıkıştırmanıza izin verir. 200'e kadar.

3. Pürüzsüz bir renk değişiminin olduğu alanlarda yüksek sıkıştırma oranları ile görüntü, basit bir JPEG'in blok yapısı özelliğini kazanmaz. JPEG2000 ayrıca keskin kenarları lekeliyor ve yuvarlatıyor - fotoğraflara bakın (Şek. 7 ve 8).

Farklı sıkıştırma oranlarına sahip test dosyası sıkıştırmasının sonuçlarını gösterir (solda - Photoshop'ta JPG formatında kaydedilmiş, sağda - JPEG2000 formatında). Şek. 7 sıkıştırma seviyesi 20, 40, 70 ve 145 seçildi (bunlar JPEG2000'e kaydedilirken açıkça belirtilebilirler), JPG sıkıştırma oranı seçildi, böylece dosya boyutu JPEG2000 tarafından sıkıştırıldıktan sonra aynı olacaktı. Dedikleri gibi, sonuçlar geldi. Netlik için, daha keskin ayrıntılara sahip bir görüntü üzerinde (10, 20, 40 ve 80 sıkıştırma seviyeleriyle) ikinci bir deney yapıldı. Avantaj yine JPEG2000 tarafındadır (Şekil 8).

8

4. Aslında, farklı çözünürlükteki kopyalar tek bir JPEG2000 dosyasında saklandığından

Böylece internette resim galerisi yapanlar için küçük resim oluşturmaya gerek kalmıyor.

5. Özellikle ilgi çekici olan, bozulma olmadan sıkıştırmadır (kayıpsız mod). Böylece, Photoshop'tan LZW sıkıştırmalı test dosyası 827 KB ve sıkıştırılmış JPEG2000 - 473 KB aldı.

6. JPEG ile karşılaştırıldığında, daha gelişmiş adaşı, önemli ölçüde daha fazla sistem kaynağı tüketir. Ancak bilgisayarların son birkaç yılda önemli ölçüde artan gücü, görüntü sıkıştırma problemlerini yeni bir yöntemle başarılı bir şekilde çözmeyi mümkün kılıyor.

7. Tarayıcılarda JPEG2000 desteğinin olmaması. Bu tür görüntüleri görüntülemek için oldukça büyük bir eklenti (1.2 MB) indirmeniz gerekir.

8. Görüntüleri yeni biçimde kaydetmek için ücretsiz yazılım eksikliği.

Kamuya açık dergiler.

Aynı konuda: