JPEG sıkıştırma algoritması nasıl çalışır? JPEG algoritması, kayıplı bir veri sıkıştırma algoritmasıdır.

  • 21.07.2019

Bir JPEG grafik görüntüsünü dönüştürme algoritması, görüntü üzerinde birbiri ardına sırayla gerçekleştirilen birkaç aşamadan oluşur:

– renk alanı dönüşümleri,

- alt örnekleme,

– ayrık kosinüs dönüşümü (DCT),

- niceleme,

- kodlama.

Renk alanı dönüştürme aşamasında, görüntü RGB renk alanından YCbCr'ye dönüştürülür (burada Y parlaklıktır ve Cb ve Cr, görüntü noktasının renk farkı bileşenleridir):

uzay uygulaması YCbCr her zamanki yerine RGB insan görüşünün fizyolojik özelliklerinden dolayı, yani insan sinir sisteminin parlaklığa karşı çok daha fazla duyarlı olması ( Y) renk farkı bileşenlerine göre (bu durumda Cb Ve cr). Ters renk uzayı dönüşümü ( YCrCb içinde RGB) benziyor:

JPEG sıkıştırma algoritması, farklı renk düzlemi boyutlarına sahip görüntüleri sıkıştırmanıza olanak tanır. ile belirtmek x ben Ve ben genişlik ve yükseklik i- resmin renk düzlemi. İzin vermek x= maksimum(x ben), Y= maksimum(ben), her düzlem için katsayıları tanımlarız Selam= x/ x ben Ve vi= Y/ ben. için en yüksek değer x Ve Y JPEG algoritmasına göre 2 16 ve Selam Ve vi– 2 2 . Böylece, renk düzlemlerinin genişliği ve yüksekliği, en büyük düzlemin boyutlarından 1 ila 4 kat daha az olabilir. sıradan için RGB görüntülerde, tüm renk düzlemlerinin boyutları eşittir.

Alt örnekleme, düzlemlerin boyutunu küçültmek içindir. cr Ve Cb. En yaygın azalma 2 kat genişlik ve 2 kat yüksekliktir (bkz. Şekil 1). Bunun için cr Ve Cb görüntü düzlemleri, 2'ye 2 punto büyüklüğünde bloklara bölünür ve blok, bir renk farkı bileşeni örneği ile değiştirilir (mevcut 4 örneğin yerine, boyutun küçültülmesine izin veren her blok için aritmetik ortalamaları konur) orijinal görüntünün 2 katı).

Şekil 1 - Yaygın alt örnekleme türleri

Ardından, renk uzayının her bir bileşeni için ayrı ayrı Y, Cb Ve cr, bir doğrudan ayrık kosinüs dönüşümü gerçekleştirilir. Bunu yapmak için, görüntü 8 x 8 piksel boyutunda bloklara bölünür ve her blok aşağıdaki formüle göre dönüştürülür:

Ayrık kosinüs dönüşümünün kullanılması, görüntünün uzamsal temsilinden spektral olana geçişi mümkün kılar. Ters ayrık kosinüs dönüşümü şu şekildedir:

Bundan sonra, alınan bilgilerin nicelenmesine geçebilirsiniz. Niceleme fikri, bir miktar bilgiyi atmaktır. İnsan gözünün yüksek frekanslara (özellikle renk farkı bileşenlerinin yüksek frekanslarına) daha az duyarlı olduğu bilinmektedir, çoğu fotoğrafik görüntü az sayıda yüksek frekanslı bileşen içerir. Ek olarak, yüksek frekansların ortaya çıkması, sayısallaştırma sürecinin bir sonucudur, yani. eşlik eden örnekleme ve nicemleme gürültüsünün ortaya çıkması nedeniyle. Bu aşamada sözde nicemleme tabloları- 8'e 8 boyutunda pozitif tam sayılardan oluşan, elemanlarına görüntü bloklarının karşılık gelen frekanslarının bölündüğü matrisler, sonuç bir tam sayıya yuvarlanır:



.

Dekuantizasyon işleminde kuantizasyonda olduğu gibi aynı tablolar kullanılır. Dekuantizasyon, nicelleştirilmiş frekansların nicemleme tablosunun karşılık gelen öğeleriyle çarpılmasından oluşur:

Böylece nicemleme katsayısındaki bir artışla, atılan bilgi miktarı artar. Buna bir örnekle daha detaylı bakalım.

Kuantizasyondan önce blok:

3862, –22, –162, –111, –414, 12, 717, 490,

383, 902, 913, 234, –555, 18, –189, 236,

229, 707, –708, 775, 423, –411, –66, –685,

231, 34, –928, 34, –1221, 647, 98, –824,

–394, 128, –307, 757, 10, –21, 431, 427,

324, –874, –367, –103, –308, 74, –1017, 1502,

208, –90, 114, –363, 478, 330, 52, 558,

577, 1094, 62, 19, –810, –157, –979, –98

Niceleme tablosu (kalite 90):

24, 16, 16, 24, 40, 64, 80, 96,

16, 16, 24, 32, 40, 96, 96, 88,

24, 24, 24, 40, 64, 88, 112, 88,

24, 24, 32, 48, 80, 136, 128, 96,

32, 32, 56, 88, 112, 176, 168, 120,

40, 56, 88, 104, 128, 168, 184, 144,

80, 104, 128, 136, 168, 192, 192, 160,

112, 144, 152, 160, 176, 160, 168, 160

Kuantizasyondan sonra blok:

161, –1, –10, –5, –10, 0, 9, 5,

24, 56, 38, 7, –14, 0, –2, 3,

10, 29, –30, 19, 7, –5, –1, –8,

10, 1, –29, 1, –15, 5, 1, –9,

–12, 4, –5, 9, 0, 0, 3, 4,

8, –16, –4, –1, –2, 0, –6, 10,

3, –1, 1, –3, 3, 2, 0, 3,

5, 8, 0, 0, –5, –1, –6, –1

3864, –16, –160, –120, –400, 0, 720, 480,

384, 896, 912, 224, –560, 0, –192, 264,

240, 696, –720, 760, 448, –440, –112, –704,

240, 24, –928, 48,–1200, 680, 128, –864,

–384, 128, –280, 792, 0, 0, 504, 480,

320, –896, –352, –104, –256, 0,–1104, 1440,

240, –104, 128, –408, 504, 384, 0, 480,

560, 1152, 0, 0, –880, –160,–1008, –160

Niceleme tablosu (kalite 45):

144, 96, 88, 144, 216, 352, 456, 544,

104, 104, 128, 168, 232, 512, 536, 488,

128, 112, 144, 216, 352, 504, 616, 496,

128, 152, 192, 256, 456, 776, 712, 552,

160, 192, 328, 496, 600, 968, 912, 680,

216, 312, 488, 568, 720, 920, 1000, 816,

432, 568, 696, 776, 912, 1072, 1064, 896,

640, 816, 840, 872, 992, 888, 912, 880

Kuantizasyondan sonra blok:

27, 0, –2, –1, –2, 0, 2, 1,

4, 9, 7, 1, –2, 0, 0, 0,

2, 6, –5, 4, 1, –1, 0, –1,

2, 0, –5, 0, –3, 1, 0, –1,

–2, 1, –1, 2, 0, 0, 0, 1,

2, –3, –1, 0, 0, 0, –1, 2,

0, 0, 0, 0, 1, 0, 0, 1,

1, 1, 0, 0, –1, 0, –1, 0

Ters dönüşümden sonra engelle:

3888, 0, –176, –144, –432, 0, 912, 544,

416, 936, 896, 168, –464, 0, 0, 0,

256, 672, –720, 864, 352, –504, 0, –496,

256, 0, –960, 0,–1368, 776, 0, –552,

–320, 192, –328, 992, 0, 0, 0, 680,

432, –936, –488, 0, 0, 0,–1000, 1632,

0, 0, 0, 0, 912, 0, 0, 896,

640, 816, 0, 0, –992, 0, –912, 0

Görüldüğü gibi birinci durumda değişim DC sıkıştırma sonucu katsayı 2'dir ve ikinci 26'da nicelleştirilmiş iken DC ikinci durumda katsayı birinciden 6 kat daha azdır.

Kodlama, görüntü bloklarının, formun blokları tarafından belirtilen kurala göre bir vektör formuna dönüştürüldüğü sıkıştırmanın son aşamasıdır:

0, 1, 5, 6, 14, 15, 27, 28,

2, 4, 7, 13, 16, 26, 29, 42,

3, 8, 12, 17, 25, 30, 41, 43,

9, 11, 18, 24, 31, 40, 44, 53,

10, 19, 23, 32, 39, 45, 52, 54,

20, 22, 33, 38, 46, 51, 55, 60,

21, 34, 37, 47, 50, 56, 59, 61,

35, 36, 48, 49, 57, 58, 62, 63

burada blok elemanları, karşılık gelen matris bileşenlerinin vektör indeksleridir. Bu durumda sıfır elemanı, önceki bloğun sıfır elemanı ile fark olarak kodlanır. Sıfır elemanlar DC, bloğun sabit bileşenini içerirler (diğer tüm AC elemanları genellikle gösterilir AC).

Elde edilen veriler daha sonra aritmetik kodlama veya Huffman algoritmasının bir modifikasyonu kullanılarak sıkıştırılır. Bu aşama, grafik görüntülerde steganografi açısından çok ilgi çekici değildir, bu nedenle incelememizin kapsamı dışındadır.

JPEG, en yeni ve oldukça güçlü algoritmalardan biridir. Uygulamada, tam renkli görüntüler için 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 matrisi kosinüs cinsinden bir çift seriye ayrıştırıldığında (aşağıdaki formüller), yalnızca ilk katsayıların anlamlı olduğu ortaya çıkar. Böylece, görüntüdeki renk değişikliklerinin düzgünlüğü nedeniyle JPFG'de sıkıştırma gerçekleştirilir.

Algoritma, bir grup fotoğraf uzmanı tarafından, özellikle 24-bit JPEG görüntülerini sıkıştırmak için geliştirildi - Ortak Fotoğraf Uzman Grubu - ISO'nun bir bölümü - Uluslararası Standardizasyon Örgütü. 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ü bazı frekansların genlikleri açısından ayrıştırır, böylece dönüşüm sırasında birçok katsayının sıfıra yakın veya eşit olduğu bir matris elde ederiz. Ayrıca, insanın renk algılama sistemi belirli frekansları tanımada zayıftır. Bu nedenle, görüntü kalitesinde gözle görülür bir kayıp olmadan bazı 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.

Algoritmanın çalışması.

24 bitlik bir görüntüyü sıkıştıralım.

Adım I

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 aşağıdaki gibi gösterilebilir:

Ters dönüşüm, YUV vektörünü ters matrisle çarparak 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. Ayrıca, kolayca görülebileceği gibi, görüntünün renk bileşenleri hakkında faydalı bilgilerin 3/4'ünü kaybediyoruz ve hemen iki kat sıkıştırma elde ediyoruz. Bunu YCrCb uzayında çalışarak yapabiliriz. Elde edilen RGB görüntüsünde, uygulamanın gösterdiği gibi, bu çok fazla etkilenmiyor.

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

nicelleştirelim. Prensipte, bu basitçe çalışma matrisinin niceleme matrisi elemanına elemana bölünmesidir. Genel durumda her bileşen (Y, U ve V) için kendi niceleme matrisi (bundan böyle 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. Katsayının büyük değerleri için gama , - düşük frekanslardaki kayıp 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 "halo" 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 dönüştürme, ör. (0.0) indeksli elemanları seçin. (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 vektör (0, 42) (0, 3) (3, -2) (4, 1) çiftlerine bölünecektir.

7. Adım

Huffman kodlayarak öğrenilen çiftleri sabit bir tablo ile daraltı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ı ayarlayın
  • 2) Çıktı renkli görüntüde nokta başına 24 bit olabilir.

Algoritmanın dezavantajları şunlardır:

  • 1) Sıkıştırma oranı artırıldığında, görüntü ayrı karelere (8x8) bölünür. Bunun nedeni, kuantizasyon sırasında düşük frekanslarda büyük kayıpların meydana gelmesi ve orijinal verilerin geri yüklenmesinin imkansız hale gelmesidir.
  • 2) Gibbs efekti belirir - keskin renk geçişlerinin sınırları boyunca haleler.

Nispeten yakın zamanda standartlaştırılmış JPEG - 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ın ortaya çıkmasını 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. Ardından kart dizüstü bilgisayardaki yuvaya takılır ve ilgili program görüntüleri okumanıza olanak tanır. Algoritma asimetrik olsaydı, cihaz "yeniden şarj olana" - görüntüyü sıkıştırana kadar uzun süre beklemek tatsız olurdu.

JPEG'in pek hoş olmayan bir başka özelliği de, ekrandaki yatay ve dikey şeritlerin genellikle kesinlikle görünmemesi 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, arşivleme ve insan görüntülemeye yönelik görseller şu anda vazgeçilmezdir.

JPEG'in uzun süredir 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. Üreticiler bundan yararlanarak kendi uyumsuz formatlarını kullanırlar ve bu nedenle algoritmayı değiştirebilirler. Yani, ISO tarafından önerilen algoritmanın iç tabloları. kendileriyle değiştirilirler.Ayrıca, 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. Ayrıca, bu arada "%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 giderek daha yaygın olarak nasıl 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.

JPFG algoritmasının özellikleri:

Sıkıştırma oranları: 2-200 (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).

Simetri: 1.

Özel ö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.

"Algoritmaların Uygulanması

JPEG ve JPEG2000"

Tamamlanmış:

öğrenci grubu 819

Ugarov Dmitry

JPEG ve JPEG2000 Algoritmaları Nasıl Çalışır?

1. JPEG algoritması

JPEG (İngiliz Ortak Fotoğraf Uzmanları Grubu - fotoğrafçılık alanında ortak bir uzmanlar grubu) - fotoğrafik görüntüleri sıkıştırmak için yaygın olarak kullanılan bir yöntemdir. Sıkıştırılmış verileri içeren dosya biçimine genellikle JPEG adı da verilir; bu tür dosyalar için en yaygın uzantılar .jpeg, .jfif, .jpg, .JPG veya .JPE'dir. Ancak bunlardan .jpg, tüm platformlarda en popüler uzantıdır.

JPEG algoritması bir sıkıştırma algoritmasıdır kalite kaybı ile.

Uygulama alanı

Biçim kayıplı bir sıkıştırma biçimidir, bu nedenle JPEG'in verileri kanal başına 8 bit (piksel başına 24 bit) olarak depoladığını varsaymak yanlıştır. Öte yandan, JPEG sıkıştırılmış ve sıkıştırılmamış veriler kanal başına tipik olarak 8 bit olduğundan, bazen bu terminoloji kullanılır. Siyah beyaz gri tonlamalı görüntülerin sıkıştırılması da desteklenir.

Bir JPEG dosyasını kaydederken, genellikle bazı geleneksel birimlerde, örneğin 1'den 100'e veya 1'den 10'a kadar ayarlanan kalite derecesini ve dolayısıyla sıkıştırma derecesini belirtebilirsiniz. Daha büyük bir sayı, daha iyi kaliteye karşılık gelir. , ancak dosya boyutu artar. Genellikle, 90 ile 100 arasındaki kalite farkı pratik olarak gözle algılanmaz. Parça parça geri yüklenen görüntünün her zaman orijinalden farklı olduğu unutulmamalıdır. Yaygın bir yanılgı, JPEG kalitesinin depolanan bilgi miktarına eşit olduğudur.

kodlama aşamaları

JPEG sıkıştırma işlemi birkaç adım içerir:

1. Görüntünün optimal renk uzayına dönüştürülmesi;

Luma/krominans (YCbCr) renk uzayını kullanırken daha iyi bir sıkıştırma oranı elde edilir. Kodlamanın bu aşamasında, uygun oranlar kullanılarak RGB renk modeli YCbCr'ye dönüştürülür:

Y = 0.299*R + 0.587*G + 0.114*B

Cb = - 0.1687*R – 0.3313*G + 0.5*B

Cr = 0,5*R – 0,4187*G – 0,0813*B.
Kod çözme sırasında uygun ters dönüşüm kullanılabilir:
R = Y + 1.402*Kr

G = Y – 0.34414*Cb – 0.71414*Kr

B = Y + 1.772*Cb.
İnsan görsel sisteminde Y,Cb,Cr ile ilgili not:

Göz, özellikle retina, görsel analizör olarak iki tip hücreye sahiptir: sadece grinin tonlarını (parlak beyazdan koyu siyaha kadar) algılayan gece görüş hücreleri ve renk dağılımını algılayan gündüz görüşü hücreleri. RGB rengini veren ilk hücreler, Y değerine benzer bir parlaklık seviyesi algılarlar.Renk tonunu algılamaktan sorumlu diğer hücreler, renk farkıyla ilişkili değeri belirler.


2. Piksel gruplarının ortalaması alınarak krominans bileşenlerinin alt örneklenmesi;

İnsan gözünün en duyarlı olduğu görsel bilgilerin çoğu, YCbCr renk uzayının yüksek frekanslı, gri tonlamalı parlaklık (Y) bileşenlerinden oluşur. Diğer iki kromatiklik bileşeni (Cb ve Cr), insan gözünün daha az duyarlı olduğu yüksek frekanslı renk bilgilerini içerir. Bu nedenle, belirli bir kısmı atılabilir ve böylece renk kanalları için dikkate alınan piksel sayısını azaltmak mümkündür.

1) 4:2:0 yazın (görüntü 2x2 piksel karelere bölündüğünde ve her birinde tüm pikseller Cb ve Cr kanallarının aynı değerlerini aldığında ve Y y parlaklığı her biri için farklı kaldığında)

2) 4:2:2 yazın (renk bileşenlerine göre birleştirme, yalnızca iki piksellik gruplar halinde yatay olarak gerçekleşir).

3) 4:4:4 türü, her satırdaki her pikselin Y, Cb ve Cr bileşenlerinin kendi benzersiz değerine sahip olduğu anlamına gelir. (Şekil 1a)

4) 4:2:2 yazın. Krominans sinyalini yatay olarak 2 faktörü ile alt örnekleyerek, 4:4:4 YCbCr akışından 4:2:2 YCbCr akışı elde ederiz. "4: 2: 2" girişi, tek bir satırda 2 krominans değeri başına 4 parlaklık değeri olduğu anlamına gelir (bkz. Şekil 1 b). 4:2:2 YCbCr sinyali, 4:4:4 YCbCr sinyaline görüntü kalitesinde çok az şey kaybeder, ancak gerekli bant genişliği orijinalin %33'ü kadar azalır.

3. Görüntü verisi fazlalığını azaltmak için ayrık kosinüs dönüşümleri uygulamak;

Algoritmanın ana aşaması, bir tür Fourier dönüşümü olan ayrık kosinüs dönüşümüdür (DCT veya DCT). Resimlerle çalışırken sadece sıkıştırma amacıyla değil, çeşitli amaçlarla kullanılır. Piksel değerlerinin frekans temsiline geçiş, görüntüye farklı bir bakış atmamızı, onu işlememizi ve bizim için ilginç olan onu sıkıştırmamızı sağlar. Ayrıca, dönüştürme katsayılarını bilerek, her zaman tam tersi işlemi gerçekleştirebiliriz - orijinal görüntüyü döndürebiliriz.

Bir görüntünün bloğuna (bizim durumumuzda 8x8 piksel) doğrudan uygulanan bir DCT şöyle görünür:

nerede x, y - bir pikselin uzamsal koordinatları (0..7) ,

f(x,y) - orijinal makro bloğun piksel değerleri (parlaklık diyelim)

u,v - frekans gösteriminde piksel koordinatları (0..7)

u=0 için w(u) =1/SQRT(2), aksi takdirde w(u)=1 (SQRT kareköktür)

v=0 için w(v) =1/SQRT(2), aksi takdirde w(v)=1

Veya matris formunda:

4. İnsan görsel algısı için optimize edilmiş ağırlık fonksiyonları kullanılarak DCT katsayılarının her bloğunun nicelenmesi;

Ayrık kosinüs dönüşümü, kayıplı sıkıştırma ve yuvarlama için bilgi hazırlar. Dönüştürülmekte olan matrisin her bir elemanı için, matrisin karşılık gelen bir elemanı vardır. nicemleme. Elde edilen matris, dönüştürülen matrisin her bir elemanının niceleme matrisinin karşılık gelen elemanına bölünmesi ve ardından sonucun en yakın tam sayıya yuvarlanmasıyla elde edilir. Kuantizasyon matrisini derlerken, büyük öğeleri sol alt köşededir, böylece onlara bölündüğünde, ayrık kosinüs dönüşümünden sonra bu köşedeki veriler (sadece daha az acıyla yuvarlanacak olanlar) daha kabaca yuvarlanır. Buna göre, kaybolan bilgiler bizim için kalanlardan daha az önemlidir.


5. Aşama İkincil Sıkıştırma

JPEG kodlayıcının son aşaması, elde edilen matrisin kodlanmasıdır.

5.1 64 DCT katsayısının zikzak permütasyonu

8x8'lik bir değer bloğu üzerinde bir DCT dönüşümü yaptıktan sonra, yeni bir 8x8 bloğumuz var. Ardından, bu 8x8 blok aşağıdaki gibi bir zikzak düzeninde taranır:

(8x8 bloğundaki sayılar, 2 boyutlu 8x8 matrisine bakma sıramızı gösterir)

0, 1, 5, 6,14,15,27,28,

2, 4, 7,13,16,26,29,42,

3, 8,12,17,25,30,41,43,

9,11,18,24,31,40,44,53,

10,19,23,32,39,45,52,54,

20,22,33,38,46,51,55,60,

21,34,37,47,50,56,59,61,

35,36,48,49,57,58,62,63

Gördüğünüz gibi, önce sol üst köşe (0,0), ardından (0,1) değerindeki değer, ardından (1,0), ardından (2,0), (1,1), (0, 2), (0.3), (1.2), (2.1), (3.0), vb.

8x8 matrisinde zikzak çizdikten sonra, şimdi 64 katsayılı (0..63) bir vektörümüz var. Böylece, uzaysal frekans kriterlerine göre sıralanmış bir vektör elde ederiz: vektördeki ilk değer (indeks 0) görüntüdeki en düşük frekansa karşılık gelir - DC terimi ile gösterilir. Vektör üzerindeki indeks arttıkça, daha yüksek frekanslara karşılık gelen değerleri alırız (endeks 63 olan değer, 8x8 bloğundaki en yüksek frekansın genliğine karşılık gelir). DCT katsayılarının geri kalanı AC ile gösterilir.

5.2 Sıfırların RunLength kodlaması (RLE)

Şimdi uzun bir sıfır dizisine sahip bir vektörümüz var. Bunu ardışık sıfırları kodlayarak kullanabiliriz. ÖNEMLİ: Nedenini daha sonra göreceksiniz, ancak burada vektörün farklı kodlanmış ilk katsayısının (DC katsayısı) kodlamasını atlıyoruz. Orijinal 64 vektörünü 63 vektörü olarak düşünün (bu, ilk katsayısız 64 vektördür)

Diyelim ki 57,45,0,0,0,0,23,0,-30,-16,0,0,1,0,0,0,0,0, sadece 0,... .0

Bu örnek için RLC JPEG sıkıştırması şu şekilde yapılır:

(0.57); (0.45); (4.23); (1,-30); (0,-16); (2.1); EOB

Görüldüğü gibi 0 dışındaki her değer için değerden önce ardışık ÖNCE 0'ların sayısını kodluyoruz, ardından değeri ekliyoruz. Başka bir not: EOB, End of Block'un kısa biçimidir ve özel kodlanmış bir değerdir (marker). Bir vektör üzerinde, vektörün sonuna kadar sadece sıfırlarımız olan bir konuma ulaştıysak, bu konumu EOB ile tahsis edeceğiz ve nicelenmiş vektörün RLC sıkıştırmasını sonlandıracağız.

[Kuantize edilmiş vektör sıfırla sonlandırılmamışsa (son öğesi 0 olmayan bir öğeye sahipse), bir EOB işaretçisine sahip olmayacağımızı unutmayın.]

(0,57); (0,45); (4,23); (1,-30); (0,-16); (2,1); (0,0)

Başka bir TEMEL şey: Diyelim ki elimizdeki nicelenmiş vektör üzerinde bir yerde:

57, on sekiz sıfır, 3, 0.0,0.0 2, otuz üç sıfır, 895, EOB

JPG Huffman kodlaması, baştaki sıfırların sayısının 4 bitlik bir değer olarak kodlanması gerektiği kısıtlamasını yapar - 15'i geçemez.

Bu nedenle, önceki örnek şu şekilde kodlanmalıdır:

(0,57); (15,0) (2,3); (4,2); (15,0) (15,0) (1,895), (0,0)

(15,0), arka arkaya 16 sıfırdan sonra gelenleri gösteren özel kodlanmış bir değerdir.

5.3 Son adım - Huffman kodlaması

Önce ÖNEMLİ bir not: Gerçek değeri depolamak yerine, JPEG standardı, minimum boyutu o değeri tutabileceğimiz bitlerde (bu değerin kategorisi olarak adlandırılır) ve ardından bunun bit kodlu bir temsilini depolamamızı belirtir. değer şu şekilde:

7,..,-4,4,..,7 3 000,001,010,011,100,101,110,111

15,..,-8,8,..,15 4 0000,..,0111,1000,..,1111

31,..,-16,16,..,31 5 00000,..,01111,10000,..,11111

63,..,-32,32,..,63 6 .

127,..,-64,64,..,127 7 .

255,..,-128,128,..,255 8 .

511,..,-256,256,..,511 9 .

1023,..,-512,512,..,1023 10 .

2047,..,-1024,1024,..,2047 11 .

4095,..,-2048,2048,..,4095 12 .

8191,..,-4096,4096,..,8191 13 .

16383,..,-8192,8192,..,16383 14 .

32767,..,-16384,16384,..,32767 15 .

Daha sonra, önceki örnek için:

(0,57); (0,45); (4,23); (1,-30); (0,-8); (2,1); (0,0)

(0,0) veya (eğer yapmamız gerekiyorsa) (15,0) gibi özel işaretleyiciler olan çiftler dışında, bu çiftlerin yalnızca doğru değerini kodlayalım.

45, benzer şekilde (6.101101) olarak kodlanacaktır.

30 -> (5,00001)

Ve şimdi çift dizisini tekrar yazacağız:

(0,6), 111001; (0,6), 101101; (4,5), 10111; (1,5), 00001; (0,4), 0111; (2,1), 1; (0,0)

Parantez içine alınmış 2 değer çiftleri bir baytta temsil edilebilir, çünkü aslında 2 değerin her biri 4 bitlik bir yığında temsil edilebilir (baştaki sıfırların sayısı her zaman 15'ten azdır ve bu nedenle kategori [JPG dosyasında kodlanmış sayılar - -32767..32767 alanında]). Bu baytta, yüksek bit, baştaki sıfırların sayısını temsil eder ve düşük bit, 0 dışındaki yeni değerin kategorisini temsil eder.

Son kodlama adımı, Huffman'ın bu baytı kodlaması ve ardından bir JPG dosyasına, bir bit akışı olarak, o baytın Huffman kodunu ve ardından bu sayının bit temsilini yazmaktır.

Örneğin, bayt 6 için ((0.6)'ya eşdeğer) Huffman kodu = 111000;

21 = (1,5) - 11111110110

4 = (0,4) - 1011

33 = (2,1) - 11011

0 = EOB= (0.0) - 1010

Önceki örnek için JPG dosyasında diske yazılan son bit akışı 63 katsayıdır (ilk katsayıyı atladığımızı unutmayın) -

111000 111001 111000 101101 1111111110011001 10111 11111110110 00001

1011 0111 11011 1 1010
Avantajlar ve dezavantajlar

Biçimin dezavantajları, güçlü sıkıştırma oranlarıyla, blok veri yapısının kendini hissettirdiği gerçeğini içerir, görüntünün “karelere bölünmesi” (her biri 8x8 piksel boyutunda). Bu etki, özellikle düşük uzamsal frekansa sahip alanlarda (açık gökyüzü gibi düzgün görüntü geçişleri) fark edilir. Yüksek uzamsal frekansa sahip alanlarda (örneğin, görüntünün zıt kenarları), karakteristik "eserler" ortaya çıkar - bozuk renk ve / veya parlaklıktaki düzensiz piksel yapısı. Ayrıca küçük renk detayları da görüntüden kayboluyor. Bu formatın şeffaflığı desteklemediğini de unutmayın.

Bununla birlikte, eksikliklerine rağmen, JPEG, piyasaya sürüldüğü sırada mevcut olan alternatiflere kıyasla yüksek sıkıştırma oranı nedeniyle çok yaygınlaştı.

2. JPEG2000 algoritması

JPEG-2000 algoritması, JPEG ile aynı fotoğraf uzmanları grubu tarafından geliştirilmiştir. JPEG'in uluslararası bir standart olarak oluşumu 1992'de tamamlandı. 1997 yılında, 2000 kışına kadar nihai hale getirilen yeni, daha esnek ve güçlü bir standarda ihtiyaç olduğu anlaşıldı.

JPEG 2000'deki algoritma ile JPEG'deki algoritma arasındaki temel farklar şunlardır:

1) Güçlü bir sıkıştırma oranıyla daha iyi görüntü kalitesi. Veya aynı olan, yüksek sıkıştırma oranları için aynı kalitede büyük bir sıkıştırma oranı. Aslında bu, çoğu site tarafından kullanılan "Web kalitesi" grafiklerinin boyutunda gözle görülür bir azalma anlamına gelir.

2) Daha iyi kalitede tek alan kodlamasını destekleyin. Görüntünün belirli alanlarının insan algısı için kritik olduğu (örneğin, bir fotoğraftaki gözler), diğerlerinin kalitesinden (örneğin, arka plan) feda edilebileceği bilinmektedir. "Manuel" optimizasyon ile, görüntünün bazı önemli bölümlerinde kalite kaybolana kadar sıkıştırma oranındaki artış gerçekleştirilir. Artık kritik alanlarda kaliteyi ayarlamak, kalan alanları daha güçlü bir şekilde sıkıştırmak, yani. öznel olarak eşit görüntü kalitesiyle daha da yüksek bir nihai sıkıştırma oranı elde ediyoruz.

3) Ana sıkıştırma algoritması dalgacık ile değiştirildi. Sıkıştırma oranındaki yukarıdaki artışa ek olarak, bu, sıkıştırma oranı artırıldığında oluşan 8 piksellik blokajı ortadan kaldırdı. Ek olarak, görüntünün düzgün gelişimi artık doğal olarak standarttır (İnternette aktif olarak kullanılan Aşamalı JPEG, JPEG'den çok daha sonra ortaya çıktı).

4) Sıkıştırma oranını artırmak için algoritma aritmetik sıkıştırma kullanır. JPEG standardı başlangıçta aritmetik sıkıştırmayı da içeriyordu, ancak daha sonra bunun yerini daha az verimli Huffman sıkıştırması aldı, çünkü aritmetik sıkıştırma patentlerle korunuyordu. Şimdi ana patentin süresi doldu ve algoritmayı geliştirme fırsatı var.

5) Kayıpsız sıkıştırmayı destekler. Her zamanki kayıplı sıkıştırmaya ek olarak, yeni JPEG artık kayıpsız sıkıştırmayı da destekleyecektir. Böylece, tıbbi görüntüleri sıkıştırmak, yazdırmak, metinleri OCR sistemleri tarafından tanınmak üzere kaydetmek vb. için JPEG kullanmak mümkün hale gelir.

6) Tek bitlik (2 renkli) görüntülerin sıkıştırılmasını destekler. Bir bitlik görüntüleri (mürekkep çizimleri, taranmış metinler, vb.) kaydetmek için, GIF formatı daha önce yaygın olarak önerildi, çünkü DCT kullanılarak yapılan sıkıştırma keskin renk geçişleri olan görüntüler için çok verimsizdi. JPEG'de sıkıştırıldığında, 1 bitlik bir resim 8 bitlik bir resme indirgeniyordu, yani. 8 kat arttı, ardından sıkıştırma girişiminde bulunuldu, genellikle 8 kattan az. Artık evrensel bir algoritma olarak JPEG 2000'i önerebiliriz.

7) Şeffaflık, format düzeyinde desteklenir. Artık sadece GIF'de değil, aynı zamanda JPEG 2000'de WWW sayfaları oluştururken arka planı sorunsuz bir şekilde kaplamak mümkün olacak. Ayrıca, yalnızca 1 bit saydamlık desteklenmiyor (bir piksel saydam / opaktır), ancak ayrı bir kanal, bu, opak bir görüntüden şeffaf arka plana yumuşak bir geçiş ayarlamanıza olanak tanır.

Ek olarak, biçim seviyesi, telif hakkı bilgilerinin görüntüye dahil edilmesini, iletim ve yayın sırasında bit hatası direncini destekler, sıkıştırmayı açma veya işleme için harici araçlar (eklentiler) talep edebilir, açıklamasını, arama bilgilerini ekleyebilirsiniz, vb. .d.

kodlama aşamaları

JPEG2000 şemasına göre sıkıştırma işlemi birkaç adım içerir:

1. Görüntüyü en uygun renk uzayına dönüştürme.
Kodlamanın bu aşamasında, uygun oranlar kullanılarak RGB renk modeli YUV'ye dönüştürülür:

Sıkıştırmayı açarken, karşılık gelen ters dönüşüm uygulanır:

2. Ayrık dalgacık dönüşümü.

Ayrık dalgacık dönüşümü (DWT) ayrıca iki tip olabilir - kayıplı sıkıştırma ve kayıpsız sıkıştırma için.

Tek boyutlu durumdaki bu dönüşüm, karşılık gelen katsayıların ve değerler dizisinin skaler ürünüdür. Ama o zamandan beri birçok katsayı sıfırdır, daha sonra doğrudan ve ters dalgacık dönüşümü aşağıdaki formüllerle yazılabilir (çizginin uç elemanlarını dönüştürmek için, değerleri ile simetrik olan her yönde 2 piksel uzantısı kullanılır). aşırı piksellerine göre çizginin elemanlarının değerleri):
y(2*n + 1) = x(2*n + 1) - (int)(x(2*n) + x(2*n + 2)) / 2

y(2*n) = x(2*n) + (int)(y(2*n - 1) + y(2*n + 1) + 2) / 4

ve tam tersi

x(2*n) = y(2*n) - (int)(y(2*n - 1) + y(2*n + 1) + 2) / 4

x(2*n + 1) = y(2*n + 1) + (int)(x(2*n) + x(2*n + 2)) / 2.

3. Katsayıların nicelenmesi.

Tıpkı JPEG algoritmasında olduğu gibi, bir görüntüyü JPEG2000 formatında kodlarken niceleme kullanılır. Ayrık dalgacık dönüşümü, analogu gibi, katsayıları frekansa göre sıralar. Ancak, JPEG'den farklı olarak, yeni formatta niceleme matrisi tüm görüntü için aynıdır.


4. İkincil Sıkıştırma Aşaması

. JPEG'de olduğu gibi, yeni formatta sıkıştırma algoritmasının son adımı kayıpsız kodlamadır. Ancak önceki formattan farklı olarak JPEG2000, aritmetik bir sıkıştırma algoritması kullanır.

Yazılım uygulaması

Bu yazıda, JPEG ve JPEG2000 algoritmaları uygulanmaktadır. Her iki algoritma da doğrudan ve ters kodlama uygular (ikincil sıkıştırmanın son aşaması yoktur). DCT'nin "doğrudan" hesaplanması nedeniyle JPEG'in hesaplanması oldukça uzun bir zaman alır (yaklaşık 30 saniye). İşin hızını artırmanız gerekiyorsa, başlangıçta DCT matrisini hesaplamanız gerekir (DCT sınıfında değişiklikler yapın).

Programa bir göz atalım:


  1. Başlattıktan sonra, bir pencere belirir.

ve (2) düğmesine basarak ve iletişim kutusuna istediğiniz adı girerek kaydedebilirsiniz.

  • Yeterince büyük bir Kalite Faktörü ile görüntü çarpıcı biçimde değişecektir. Eğer bu bir JPEG algoritması ise 8x8 bloklar telaffuz edilecektir.(JPEG2000 algoritması durumunda blok bölünmesi olmayacaktır)
  • Önce:

    Sonrasında:



    JPEG, 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 yumuşak bir şekilde değiştiği 8x8 alanlarla çalışır. Sonuç olarak, böyle bir alanın matrisini kosinüs cinsinden çift sıraya ayrıştırırken (aşağıdaki formüllere bakın), yalnızca ilk katsayılar önemlidir.Bu nedenle, 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 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) 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, bilgilerin bir kısmını kaybeder, ancak daha büyük bir sıkıştırma derecesi elde edilebilir.

    Algoritma nasıl çalışır?

    Öyleyse algoritmayı daha ayrıntılı olarak ele alalım (Şekil 2.1). 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, Co 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 Co bileşenleri için dizileri yüksek kayıplarla ve buna bağlı olarak yüksek sıkıştırma oranlarıyla arşivlemek mümkün hale gelir.Böyle 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:

    Adım 2 Orijinal görüntüyü 8x8 matrislere böldük. Her bileşen için ayrı ayrı her 3 - 8 bitten DCT çalışma matrisleri oluşturuyoruz. Daha yüksek sıkıştırma oranlarında bu adım biraz daha zor olabilir. Görüntü, ilk durumda olduğu gibi Y bileşenine bölünür ve Cr ve Cb bileşenleri için matrisler çizgi ve sütun üzerinden yazılır. Yani 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 2 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 Basitleştirilmiş bir biçimde, n=8 için DCT aşağıdaki gibi gösterilebilir:

    nu,v] = ^Hc(i,u)xC(j,v)y

    rY)

    yq= TamsayıYuvarlak

    Bu adımda sıkıştırma oranı kontrol edilir ve en büyük kayıplar 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, sözde Gibbs etkisi, keskin bir renk geçişi ile konturların etrafında bir tür "nimbus" oluştuğunda.

    Adım 5. 8x8 matrisini "zig-zag" taraması kullanarak 64 elemanlı bir vektöre dönüştürüyoruz, yani elemanları (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, türün çiftlerini alırız.<пропустить, число>, burada "atla" atlanacak sıfırların sayısıdır ve "sayı" sonraki hücreye girilecek değerdir. Böylece, 42 3000-2 00001 ... vektörü çiftler (0.42) (0.3) (3,-2) (4,1)... şeklinde katlanır.

    Adım 7. Elde edilen çiftleri sabit bir tablo ile Huffman kodlaması ile katlayın.

    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.

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

    ■ sıkıştırma derecesi ayarlanır;

    ■ Çıktı renkli görüntü, nokta başına 24 bit olabilir.

    Algoritmanın dezavantajları şunlardır:

    ■ 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 gelmesi ve orijinal verilerin geri yüklenmesinin imkansız hale gelmesidir.

    ■ Gibbs-halo efekti, keskin renk geçişlerinin sınırları boyunca görünür.

    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, bir PC'de bile, algoritma ortalama bir görüntü üzerinde bir dakikadan daha az çalışmak zorundaydı ve donanım uygulaması nispeten basit ve ucuz olmalı. Algoritmanın simetrik olması gerekiyordu (açma zamanı yaklaşık olarak arşivleme zamanına eşittir).

    Son şartın yerine getirilmesi, dijital kameralar gibi cihazların 8-256 MB flash kartta 24 bit fotoğraf çekmesini mümkün kılmıştır." Ardından bu kart dizüstü bilgisayarınızdaki yuvaya takılır ve ilgili program okumanızı sağlar. resimler. doğru değil hayır, algoritma asimetrik olsaydı, cihaz "yeniden şarj olana" - görüntüyü sıkıştırana kadar uzun süre beklemek tatsız olurdu.

    JPEG'in pek hoş olmayan bir özelliği de sonra, genellikle ekrandaki yatay ve dikey şeritler tamamen görünmezdir ve yalnızca hareli desen şeklinde yazdırıldığında görünebilir. Görüntünün yatay ve dikey şeritlerine eğik bir baskı deseni uygulandığında oluşur. Bu sürprizler nedeniyle JPEG, aktif olarak tavsiye edilir nicemleme matrisinin yüksek katsayılarını ayarlayarak baskı endüstrisinde kullanın. Ancak, insan görüntüleme amaçlı görüntüleri arşivlerken, şu anda vazgeçilmezdir.

    geniş JPEG'in kullanımı, belki de yalnızca 24 bitlik görüntülerle çalıştığı gerçeğiyle, uzun bir süre geri tutuldu. 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 çok 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ı oluştururlar 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 giderek daha yaygın olarak nasıl 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.

    JPEG algoritmasının özellikleri: o ! ş. ,. Sıkıştırma oranı: 2-200 (kullanıcı tarafından belirlenir). ,C, :_,. . Görüntü sınıfı: tam renkli 2jj.bit görüntüler veya iso | Keskin renk geçişleri olmadan gri tonlamalı fermantasyon ^ o &, (fotoğraflar).

    Simetri: 1.

    Özellikler: bazı durumlarda algoritma oluşturur! bir görüntüde keskin yatay ve dikey kenarların etrafında hale (Gibbs etkisi). Ayrıca, yüksek derecede sıkıştırma ile iso-! Görüntü 8x8 piksellik bloklara bölünmüştür.

    Verileri etkili bir şekilde sıkıştırmak için önce görüntünüzün doğasını değerlendirmeniz gerekir. JPEG, görüntü verilerini insan gözünün gördüğüne göre sıkıştırır. Bu nedenle, JPEG'in nasıl ve ne yaptığını anlamanıza yardımcı olmak için size insan görsel algısı hakkında genel bir fikir vermek istiyorum.

    JPEG sıkıştırması birkaç aşamada gerçekleşir. Amaç, grafiksel verileri, alakasız görsel bilgilerin kolayca tanımlanıp atılacağı şekilde dönüştürmektir. Bu "kayıplı" sıkıştırma, görüntünün her bir parçasını sağlam tutmaya çalışan grafik formatlarında kullanılan diğer yaklaşımların çoğundan farklıdır.

    renk modeli

    JPEG'deki ilk adım, renkleri temsil etmek için uygun bir yol seçmektir. Renkler genellikle bir 3B koordinat sisteminde belirtilir. Çoğu programcı tarafından iyi bilinen bir sistem, rengi kırmızı, yeşil ve mavinin (RGB) bir kombinasyonu olarak tanımlar. Ne yazık ki, sıkıştırma açısından bu, bir rengi tanımlamanın en iyi yolu değildir. Sorun, üç bileşenin de - kırmızı, yeşil ve mavi - eşdeğer olmasıdır. Ancak, farklı bir işleme sistemine geçmek, bazı daha önemli bilgileri vurgulamanıza olanak tanır.

    Profesyoneller iki renk modeli kullanır: HSL (Ton-Doygunluk-Açıklık) ve HSV (Ton-Doygunluk-Değer). HSL modelinin parlaklık bileşeninin (Hafiflik) ve HSV modelinin parlaklık bileşeninin (Değer) her birinin ışık ve gölge oranını kendi yollarıyla belirlediği sezgisel olarak açıktır. Doygunluk "saf" rengin seviyesini belirler. Doymamış renklere genellikle gayri resmi olarak "kirli" (grimsi) denir. Ton, kırmızı veya grimsi yeşil gibi bir nesnenin rengi olarak algıladığımız şeydir. Burada şaşırtıcı bir gerçeği not etmek önemlidir: insan görüşü, aydınlatmadaki değişikliklere karşı daha hassastır, renge değil!

    JPEG sıkıştırma algoritmasının farklı uygulamaları, farklı renk sistemleri kullanır. JFIF formatı tarafından kullanılan YCbCr renk işleme sistemi, birçok yönden renkli televizyon için yıllar önce geliştirilen şemaya benzer.

    inceltme

    Bir renk modelinden diğerine dönüştürmenin ana nedeni, bir görüntüde görüntülemeyle daha az ilgili olan bilgileri belirlemektir. JPEG, renk bilgisi miktarını azaltır. Parlaklık bileşeni tam çözünürlükte iletilirken, renk bileşenleri, değer aralığının yarısını kullanır. Bu basit adımın bir sonucu olarak, veri miktarı üçte bir oranında azalır.

    Alt örnekleme, renkli TV görüntüsünün renklerini ayarlar. Tipik olarak, siyah beyaz görüntüler ve renkli bilgiler ayrı ayrı televizyona iletilir. Ayrıca renk bilgisi, görüntü parlaklık bilgisinden daha az katı bir biçimde iletilir.

    Ayrık Kosinüs Dönüşümü (DCT)

    Her bir renk bileşeni, tek bir renk değil de üç gri tonlamalı görüntüymüş gibi ayrı ayrı ele alınır. Ayrıntılı bir resme uzaktan bakarsanız, resmin yalnızca genel tonunu ayırt edebilirsiniz. Örneğin, "çoğunlukla mavi" veya "çoğunlukla kırmızı". Resme ne kadar yaklaşırsanız, o kadar fazla ayrıntı görebilirsiniz. Bu efekti taklit etmek için JPEG, Ayrık Kosinüs Dönüşümü (DCT) adı verilen matematiksel bir numara kullanır. DCT, piksel bilgilerini piksel değişim bilgilerine dönüştürür. DCT'nin verebileceği ilk şey, alanın ortalama rengidir. Daha sonra ayrıntıları daha fazla detaylandırıyor.

    Uzak bir görüntüde olduğu gibi, ortalama renk değeri görüntünün alanı hakkında çok önemli bilgilerdir. Gözünüz renk değişim hızına daha az duyarlıdır, bu yüzden o kadar önemli değildir. Renk bilgisini bu şekilde dönüştürerek feda edilebilecek bilgileri ön plana çıkarıyoruz.

    Kayıpların bu aşamadan kaynaklandığına inanılmaktadır. Bir görüntüyü DCT kullanarak kodlarsanız ve ardından ters DCT işlevini kullanarak geri yüklerseniz, tam olarak aynı bit setini alamazsınız. Ancak bu hata bir yuvarlama hatasıdır. Aritmetik işlemler yaparken ortaya çıkar ve genellikle çok büyük değildir. Bu nedenle DCT aşamasını "çoğunlukla kayıpsız" bir işlem olarak düşünmeyi tercih ediyorum.

    Büyük görüntüler için, DCT ve ters DCT'yi hesaplamak çok zaman alan bir işlemdir. JPEG, hesaplama süresini azaltmak için görüntüyü sekize sekiz piksellik bir mozaiğe böler. Mozaiklerin her biri ayrı ayrı işlenir, bu da DCT için gereken hesaplama süresini önemli ölçüde azaltır. Bu yaklaşımla ilgili sorun, nicemlemeden sonra (bir sonraki bölümde tartışılacaktır), bu karelerin sınırlarının eşleşmemesi ve dolayısıyla kalite parametresi düşük bir değere ayarlandığında görünür hale gelmesidir.

    niceleme

    JPEG geliştiricileri öncelikle fotoğraf kalitesinde görüntülerle (fotoğrafik, sürekli ton) ilgilendiler. Kural olarak, bu yarı tonlu görüntüler, bir renkten diğerine yumuşak geçişlerle karakterize edilir. Bu tür görüntüler için, düşük frekanslı (yavaş değişen) DCT bileşeni, yüksek frekanslı (hızlı değişen) bileşenden daha önemlidir.

    Kuantizasyon terimi basitçe "yuvarlama" anlamına gelir. JPEG, her bir DCT üyesini farklı faktörlere dayalı olarak farklı ağırlıklarla yuvarlayarak bazı grafik bilgileri atar. Yüksek frekans bileşeni, düşük frekans bileşeninden daha fazla yuvarlanır. Örneğin, ortalama parlaklık değerini depolayan düşük frekans bileşeni üçün katına, yüksek frekans bileşeni yüzün katına yuvarlanabilir!

    Kuantizasyon işlemi, net konturlar durumunda JPEG sıkıştırmasının neden "titreşimli" çizgilerin oluşumuna yol açtığını açıklar. Konturlar, yüksek frekanslı (hızla değişen) uzamsal bileşen tarafından belirlenir. (İlk bakışta, bulanık bir taslak elde etmeniz gerekiyormuş gibi görünebilir, ancak DCT'deki C'nin kosinüs anlamına geldiğini unutmayın.)

    Tipik olarak, renk düzlemleri, luma düzlemlerinden çok daha kaba olarak nicelenir. Burada doğru renk modeli seçimi, atılabilecek bilgilerin belirlenmesine yardımcı olur.

    Sıkıştırma

    Şimdiye kadar, iki renk kanalının örnekleme hızı dikkate alındığında, herhangi bir sıkıştırma gerçekleşmedi. Yukarıda tartışılan tüm adımlar - renk modeli dönüşümü, DCT ve niceleme - veri boyutunu değiştirmeden bıraktı. Son olarak, standart kayıpsız sıkıştırma tekniğinin aslında veri boyutunu küçülteceği son adıma geçiyoruz.

    Önceki adımlarda sıralanan veriler, RGB grafik verileri olan ham maddeden daha verimli bir şekilde sıkıştırılabilir. Üstelik atılan adımların hiçbiri gereksiz değildi, verilerdeki her değişiklik, nihai versiyonun daha verimli bir şekilde sıkıştırılmasını amaçlıyordu.

    Renk modelinin değiştirilmesi, kanal bilgilerinin inceltilmesini ve ardından daha güçlü bir şekilde nicelleştirilmesini mümkün kıldı.

    DCT, yüksek frekanslı uzamsal bileşeni izole etmeyi mümkün kıldı. Yüksek frekans bileşeni genellikle küçük değerlere sahiptir, bu da DCT adımının çıktısında orantısız miktarda küçük değerlere neden olarak sıkıştırma işlemini kolaylaştırır.

    Kuantizasyon sürecinde, yüksek frekans bileşeninin çoğu sıfıra ayarlanır ve geri kalanı belirli değerler alır. Farklı değerlerin sayısını azaltmak, veri sıkıştırmayı da kolaylaştırır.

    JPEG standardı, son adımda kullanılabilecek iki farklı kayıpsız sıkıştırma yöntemi sağlar. Huffman sıkıştırması, iyi bilinen, tescilli olmayan, programlanması kolay bir algoritmadır.Buna karşın, daha yeni aritmetik kodlama algoritması (aritmetik kodlama) çok sayıda patente konu olmuştur.(Bu nedenle, birçok JPEG sıkıştırma programının yalnızca Huffman'ı desteklemesi şaşırtıcı değildir. sıkıştırma.)

    JPEG görüntülerin kodunu çözerken, tüm bu adımları ters sırada gerçekleştirmelisiniz. Veri akışı önce sıkıştırılır, ardından her 8-8 blok ters DCT'ye tabi tutulur ve son olarak görüntü uygun renk modeline (genellikle RGB) dönüştürülür. Desimasyon ve niceleme yoluyla kasıtlı olarak atılan bilgilerin hiçbir zaman kurtarılamayacağını unutmayın. Ancak, her şey doğru yapılmışsa, bilgi kaybı görüntüde gözle görülür bir bozulmaya neden olmaz.