JPEG, JPEG2000, JPEG-LS. Kayıplı ve kayıpsız görüntülerin sıkıştırılması. JPEG Görüntü Sıkıştırma Algoritması

  • 29.07.2019

Fotoğraflar ve resimler, yalnızca içerik olarak değil, diğer "bilgisayar" özelliklerinde de birbirinden farklıdır. Örneğin, boyut olarak.

Öyle oluyor ki, iki özdeş desen gibi, ancak bir beden diğerinden üç kat daha büyük.

Ayrıca, görüntülerin kalitesi farklıdır. Son derece düşük kaliteli fotoğrafları bir kereden fazla görmüşsünüzdür. Bu çıplak gözle görülebilir. Örneğin, iki özdeş fotoğraf, ancak biri en iyi kalitede, diğeri en kötüden.

Ve öyle oluyor ki, resim renklerden yoksun görünüyor. İşte bir örnek.

Ve tüm bunlardan dosya formatı veya türü sorumludur.

Aslında, görüntüler çok çeşitli biçimlerde gelir. Ve birçoğu var. Hepsini dikkate almayacağız, ancak en yaygın olanları hakkında konuşacağız. Bunlar bmp, gif, jpg, png, tiff gibi formatlardır.

Her şeyden önce kalite bakımından birbirlerinden farklıdırlar. Ve kalite, renklerin sayısında (doygunluk) farklılık gösterir.

Örneğin, farklı renkler kullanarak bir resim çiziyorum. Ve sonra aniden bazıları sona erdi ve elimizdekilerle boyamayı bitirmek zorundasın. Tabii ki, bunun sonucu büyük ölçüde etkilememesi için mümkün olan her şeyi yapmaya çalışacağım, ancak yine de, resim istediğim gibi olmayacak - daha soluk, bulanık.

Yani görüntü formatları ile. Biri tüm renkleri bırakır, diğeri ise kısmı keser. Ve olur, bu nedenle, resim bozulur.

Bu oldukça kaba bir örnek. Aslında, orada her şey biraz daha karmaşık, ama bence asıl şeyi yakaladınız.

Ortak görüntü biçimleri

BMP, Paint'te yapılan çizimler için bir formattır. Çizilen resimleri bilgisayarda saklamak için kullanılabilir. Ancak bu dosya türü, büyük boyutu nedeniyle internette kullanılmamaktadır. Bu nedenle, Paint'te, bir blogda veya sosyal ağda çizilmiş bir resmi yayınlamak istiyorsanız, farklı bir türde olmalıdır - gif, jpg veya png.

GIF, İnternette popüler bir görüntü formatıdır. Kaliteyi kaybetmeden, ancak sınırlı sayıda renkle - 256 ile kaydedebilirsiniz. GIF, içinde küçük animasyonlu (hareketli) resimler oluşturabilmeniz nedeniyle özellikle popülerlik kazandı.

JPG, çok renkli bir fotoğraf ve resim formatıdır. Hem kalite kaybı olmadan hem de kayıpla bir görüntüyü kaydedebilir.

PNG, resimler için modern bir formattır. Bu tür bir görüntü, küçük boyutta ve kalite kaybı olmadan elde edilir. Çok uygun: dosya küçük ve kalitesi iyi. Aynı zamanda şeffaflığı da destekler.

TIFF - çok kaliteli, sıkıştırılmamış görüntüler ve buna göre bu tür dosyaların boyutu çok büyük. TIFF, kalite önemli olduğunda kullanılır. Örneğin kartvizit, broşür, dergi kapakları oluştururken.

Hangi biçimi seçmeli

  • BMP - bu Paint'te yapılmış bir çizimse ve onu sadece bilgisayarda tutacaksınız.
  • GIF - İnternette yayınlanmak üzere az miktarda renk içeren bir animasyon veya çizim ise.
  • PNG - birçok renk veya bazı saydam parçalar içeren bir çizim ise.
  • JPG (jpeg) - fotoğraf varsa.
  • TIFF - baskı için bir resim (kartvizitler, broşürler, posterler vb.).

Merhaba sevgili arkadaşlar. Bugün, sitede hangi görüntü formatının kullanılmasının daha iyi olduğu, bugün site için hangi grafik dosyası formatlarının mevcut olduğu ve en son grafik formatlarını takip etmenin gerekli olup olmadığı hakkında konuşacağız.

Bu tür çok soru alıyorum, öğrencilerimin çoğu yeni SVG ve WebP formatlarını kullanıp kullanamayacaklarını ve bu görüntüleri nerede uygulamanın daha iyi olduğunu soruyor. Elbette yeni biçimleri de kullanabilirsiniz, ancak hangi biçimin neye en uygun olduğunu anlamanız gerekir.

Bugün sitedeki resimler ayrılmaz bir parçadır. Grafik tasarımdan makalelere resim yüklemeye kadar, web'deki çoğu siteye grafikler eşlik eder. Ama güzelliğin bir bedeli var

Doğrulama servislerinin de belirttiği gibi, optimize edilmemiş resimler, web sitesi yavaşlamasının nedenlerinden biridir.

Bu nedenle, görüntü için hangi formatı seçeceğinizin seçimi ile her zaman karşı karşıya kalacaksınız. Boyutu ve kalitesi buna bağlı olacaktır. Daha küçük görüntüleri kaliteden ödün vermeden kullanmak için bilmeniz gereken birkaç şey var.

Bugün web siteleri için hangi resimleri kullanıyorum?

Siteler için tüm resimler alt bölümlere ayrılmıştır:

  • raster (örnek - JPG, JPEG, GIF, PNG),
  • vektör (örnek - SVG).

Raster görüntüler, renk ve saydamlık değerini depolayan piksellerden oluşur. Bu biçimler, makalelerdeki, düğmelerdeki, simgelerdeki ve tasarım öğelerindeki resimlerdir. Bu resimler geliştiriciler ve web sitesi sahipleri arasında popülerdir. Bitmaplerin ana dezavantajı, iyi ölçeklenmemeleridir.

Yani resmin boyutunu büyüttüğünüzde kalite kaybı oluyor.

Vektör görüntüler çizgilerden ve rota noktalarından oluşur. Bir görüntüyle ilgili bilgiler, matematiksel çizim talimatlarında saklanır ve bu tür görüntülerin kalite kaybı olmadan istendiği kadar ölçeklendirilmesine olanak tanır.

Bu resimlerin tümü modern web sitelerinde kullanılabilir ve kullanılabilir. Bunu siteye yüklemeden önce anlamanız yeterli!

Site için popüler resim biçimlerinin açıklaması

Bu biçimlerin açıklamasından, sitede en iyi nerede ve hangi biçimin kullanıldığını anlayacaksınız.

JPEG

JPEG veya JPG, web siteleri için en popüler resim formatlarından biridir. Biçim, sitedeki fotoğraf ve görüntülerin sunumunda lider bir konum sağlayan milyonlarca rengi destekler.

Bu formattaki görüntüler, neredeyse hiç kalite kaybı olmadan oldukça iyi optimize edilmiştir, bu da görsel kalite kaybı olmadan daha küçük bir dosya elde etmenize olanak tanır. Unutulmamalıdır ki sonraki her optimizasyon kaliteyi düşürür.

Bu formattaki dosyalar, popülerliğini bir kez daha onaylayan ve sitelerde görüntü sorunları hakkında endişelenmenize izin vermeyen tüm cihazlar ve tarayıcılar tarafından desteklenir.

Bu formatın en büyük dezavantajı şeffaflık olmamasıdır. Yani, bu formattaki görüntüleri birleştirmek işe yaramaz. Bu tür görevler için aşağıdaki formatı kullanmak daha iyidir.

PNG resim

Bu biçim kayıpsız bir sıkıştırma algoritması kullanır. Renk sayısı ve şeffaflık seviyesi açısından 8 ve 24 bit olmak üzere iki tipte mevcuttur. Her ikisi de şeffaflığı destekler.

8-bit çok popüler değil ama sitede çeşitli görseller için yaygın olarak 24-bit kullanılıyor. Şeffaflık nedeniyle, birleşik görüntüler oluşturmanıza olanak tanır. Genellikle saydamlık efektinin gerekli olduğu animasyonlu düğmeler, simgeler oluşturmak için kullanılır.

PNG görüntüleri birçok kez optimize edilebilir, düzenlenebilir - orijinal kalitesini koruyacaktır.

Biçim, herhangi bir ekranda görüntülenmesini sağlamak için tüm tarayıcılar ve cihazlar tarafından da desteklenir.

Görüntülerin kalitesi JPG'den daha iyi görünüyor, ancak dosya ağırlığı daha yüksek olacaktır. Dosyaları siteye yerleştirirken bu dikkate alınmalıdır.

GIF

256 renk, şeffaflık ve animasyonu destekleyen 8 bitlik bir formattır. Az sayıda renk desteği nedeniyle dosya ağırlığı da minimumdur.

Format, geniş bir renk yelpazesine sahip fotoğraflar ve görüntüler için uygun değildir.

Ancak afişler, düğmeler, simgeler vb. oluştururken yaygın olarak kullanılır.

Bu biçim, modern web sitelerinde giderek daha az kullanılmaktadır.

Ardından, çok popüler olmayan, ancak popülerlik ve destek kazanan ve yükleme hızı ve site yanıt hızı gereksinimlerine en uygun olan nispeten yeni SVG ve WebP biçimleri hakkında konuşalım.

SVG

XML tabanlı bir vektör dosya formatıdır. Biçim, daha önce tarayıcılarda zayıf bir şekilde desteklendiği için oldukça yakın zamanda popülerlik kazanmaya başladı. Ve görüntü sorunları nedeniyle, hiç kimse onu kullanmak için acele etmedi.

Bugün SVG, tüm modern tarayıcılar tarafından desteklenmektedir. Ancak yine de ekranla ilgili sorunlar var.

Bu biçim en çok logolar, tasarım öğeleri vb. gibi basit görüntüler için kullanılır. Fotoğraflar için geçerli değildir.

SVG formatı hafiftir, herhangi bir ekran çözünürlüğünde net görüntüler için iyi ölçeklenir, animasyonu destekler, CSS ile değiştirilebilir ve HTML'ye yerleştirilebilir, böylece istek sayısını azaltır.

Webp

Google tarafından özel olarak web için geliştirilmiş bir açık kaynak biçimi. Bugün YouTube, WebP formatına video küçük resim dönüştürmeyi kullanıyor.

Biçim, üstün sıkıştırma sağlar ve şeffaflığı korur. Dosya boyutunu büyütmeden JPG ve PNG formatlarının avantajlarını birleştirir.

Ancak biçimin avantajlarına rağmen, IE, Edge, Firefox ve Safari gibi tüm tarayıcılar tarafından desteklenmez.

Bu sınırlamaları aşmanın yolları vardır, ancak bunlar biçimin evrensel olarak kullanılmasını engeller.

Çözüm

Arkadaşlar, umarım her şeyi net bir şekilde anlatmışımdır ve artık sitede hangi görüntü formatının en iyi kullanılacağını ve neden bazı formatlardan birini kullanmakta ısrar etmediğimi, ancak entegre bir yaklaşım önerdiğimi biliyorsunuzdur.

Belki WebP yaygın bir destek aldığında, hepimiz ona geçeceğiz ve sitelerimizde jpg ve png'nin yerini alacağız.

Sitelerinizde hangi formatları kullandığınızı, neleri sevdiğinizi ve neleri sevmediğinizi yorumlarda tartışalım.

Bugün için her şeyim var, yorumlarınızı bekliyorum.

Saygılarımla, Maksim Zaitsev.

    İLE BİRLİKTE En popüler üç dosya formatıdır - JPEG, RAW, TIFF. Bazen fotoğrafçılar arasında anlaşmazlıklar duyabilirsiniz - fotoğrafçılık için en iyi dosya formatı nedir, hangi formatta fotoğraf çekmek daha iyidir, çünkü modern kameralar fotoğraf çekmenize izin verirbu formatlardan herhangi birinde ve bazen birkaçında aynı anda baskı!

    Görüntünün saklandığı dosya biçimi, aslında, görüntü kalitesi ve dosya boyutu arasında belirli bir dengedir.

    Muhtemelen bir bitmap'in piksellerden oluştuğunu zaten biliyorsunuzdur. Bir tarama dosyasının nasıl düzenlendiği ve piksellerle ilgili bilgileri hangi biçimde depoladığı ve dosya biçimini belirlediği. Bir tarama dosyasının görüntü kalitesi iki ana parametre tarafından belirlenir: piksel boyutu (yani toplam piksel sayısı) ve piksel rengine göre gerçek renk yeniden üretiminin doğruluğu.Piksel boyutu ile açıktır - ne kadar fazla piksel (veya - piksel ne kadar "küçük" olursa), o kadar iyidir.Ve renk doğruluğu, piksel başına renk sayısına veya renk derinliğine bağlıdır.

    Renk derinliği (renk kalitesi, görüntü bit derinliği), bir piksel raster grafik veya video görüntüsü kodlanırken rengi depolamak ve temsil etmek için kullanılan bit sayısındaki bellek miktarıdır. Bit sayısı, her bir renk bileşenindeki geçiş sayısını (ton adımları) veya basitçe renk sayısını belirtir. 1 bit eklemek, ikili renk koduna bir bit daha eklemektir.

    • 1 bit renk (21 = 2 renk) ikili renk, çoğunlukla siyah beyaz (veya siyah ve yeşil) ile temsil edilir
    • 2 bit renk (22 = 4 renk) CGA Gri Tonlamalı NeXTstation
    • 3 bit renk (23 = 8 renk) TV çıkışlı birçok eski kişisel bilgisayar
    • 4 bit renk (24 = 16 renk) EGA olarak bilinir ve daha az ölçüde VGA yüksek çözünürlük standardıdır
    • 5 bit renk (25 = 32 renk) Orijinal Amiga yonga seti
    • 6 bit renk (26 = 64 renk) Orijinal Amiga yonga seti
    • 8 bit renk (28 = 256 renk) Eski Unix iş istasyonları, düşük çözünürlüklü VGA, Süper VGA, AGA
    • 12 bit renk (212 = 4.096 renk) bazı Silicon Graphics sistemleri, NeXTstation renk sistemleri ve Amiga HAM modu sistemleri.

    Örneğin, RGB renk uzayında çalışıyoruz. Bu, son piksel renginin oluşturulduğu üç kanal olduğu anlamına gelir: kırmızı kanal (Rad), yeşil kanal (Yeşil) ve mavi kanal (Mavi). Kanalların 4 bit olduğunu varsayalım. Bu, her kanalın 16 renk gösterme yeteneğine sahip olduğu anlamına gelir. Sonuç olarak, tüm RGB 12 bit olacak ve görüntüleyebilecektir.

    C = 16x16x16 = 4096 renk

    Bu durumda renk derinliği 12 bittir.

    24 bit RGB hakkında konuştuğumuzda, piksel başına toplam renk seçeneğine sahip 8 bit kanallar (her biri 256 renk) anlamına gelir.

    C = 256x256x256 = 16777216 renk.

    Figür etkileyici. Her piksel için bu renk sayısı, en seçici fotoğrafçının gereksinimlerini karşılar.

    Formatların kendileri hakkında biraz.

    TIFF biçimi

    TIFF, Etiketli Görüntü Dosyası Formatı anlamına gelir ve baskı ve baskı endüstrisi için bir standarttır.

    Sonuç olarak, şöyle çıkıyor:

    1. Kameranız sadece JPEG çekecek kadar basitse ve maksimum kaliteyi elde etmek istiyorsanız, maksimum boyutu ve minimum sıkıştırmayı ayarlayın ve başka formatınız olmadığı gerçeğiyle kendinize eziyet etmeyin. Çoğu durumda, titizlikle el yapımı bir RAW görüntüsü, otomatik olarak yakalanan bir JPEG kamerayla eşleşir.

    2. Belki de TIFF'de fotoğraf çekmemelisiniz. Bu formatta kayıt yapmak daha zordur ve yüksek kaliteli JPEG ile karşılaştırıldığında gözle görülür bir fark yoktur.

    3. İçeride fotoğraf çekme yeteneğiniz varsa, onunla çalışın. Size uygun olup olmadığını kendiniz hissedeceksiniz. Bazı durumlarda, yalnızca RAW, yazdırırken yüksek büyütme için benzersiz bir fotoğraf oluşturmayı mümkün kılar.

    Bir çözüm daha kaldı, diyebilir evrensel. Aynı anda iki formatta kare çekmenizi sağlayan bir mod var: RAW + JPEG. Bu modda önemli sahneleri yakalayın. Modern dijital bilgi depoları - hem hafıza kartları hem de sabit sürücüler - bunu yapmanıza izin verir. Bu durumda, revizyon için zaman kaybetmeden fotoğrafı hemen kullanmak için bir JPEG elde edersiniz. Ve buna ihtiyacınız varsa, RAW dosyasını işleme için bir uzmana emanet edin.

    Fotoğraf. Dosya formatları.

    2000*1000 piksellik sıkıştırılmamış tam renkli bir görüntünün yaklaşık 6 megabayt boyutunda olacağını hesaplamak kolaydır. Profesyonel kameralardan veya yüksek çözünürlüklü tarayıcılardan elde edilen görüntülerden bahsedersek, boyutları daha da büyük olabilir. Depolama kapasitesindeki hızlı büyümeye rağmen, çeşitli görüntü sıkıştırma algoritmaları hala çok önemlidir.
    Mevcut tüm algoritmalar iki büyük sınıfa ayrılabilir:

    • Kayıpsız sıkıştırma algoritmaları;
    • Kayıplı sıkıştırma algoritmaları.
    Kayıpsız sıkıştırma hakkında konuştuğumuzda, sıkıştırma algoritmasının tam tersi olan ve orijinal görüntüyü doğru bir şekilde geri yüklemenizi sağlayan bir algoritma olduğunu kastediyoruz. Kayıplı sıkıştırma algoritmaları için ters algoritma yoktur. Orijinaliyle tam olarak eşleşmeyen bir görüntüyü geri yükleyen bir algoritma vardır. Sıkıştırma ve kurtarma algoritmaları, görüntünün görsel kalitesini korurken yüksek sıkıştırma oranı elde etmek için seçilir.

    Kayıpsız sıkıştırma algoritmaları

    RLE algoritması
    RLE serisindeki tüm algoritmalar çok basit bir fikre dayanmaktadır: tekrar eden eleman grupları bir çift ile değiştirilir (tekrar sayısı, tekrar eden eleman). Örnek olarak bir bit dizisi kullanan bu algoritmayı ele alalım. Bu sırada, sıfırlar ve birler grupları değişecektir. Ayrıca, gruplar genellikle birden fazla öğeye sahip olacaktır. Daha sonra 11111 000000 11111111 00 dizisi aşağıdaki 5 6 8 2 sayı grubuna karşılık gelecektir. Bu sayılar tekrar sayısını gösterir (sayma birlerden başlar), ancak bu sayıların da kodlanması gerekir. Tekrar sayısının 0 ile 7 arasında olduğunu varsayacağız (yani tekrar sayısını kodlamamız için 3 bit yeterlidir). Daha sonra yukarıdaki dizi, aşağıdaki sayı dizisi 5 6 7 0 1 2 ile kodlanır. Orijinal diziyi kodlamak için 21 bitin gerekli olduğunu hesaplamak kolaydır ve RLE-sıkıştırılmış biçimde bu dizi 18 bit alır.
    Bu algoritma çok basit olmasına rağmen, etkinliği nispeten düşüktür. Ayrıca bazı durumlarda bu algoritmanın kullanılması dizinin uzunluğunda bir azalmaya değil, bir artışa yol açmaktadır. Örneğin, aşağıdaki 111 0000 11111111 00 dizisini göz önünde bulundurun. Karşılık gelen RL dizisi şöyle görünür: 3 4 7 0 1 2. Orijinal dizinin uzunluğu 17 bit, sıkıştırılmış dizinin uzunluğu 18 bittir.
    Bu algoritma en çok siyah beyaz görüntüler için etkilidir. Ayrıca, daha karmaşık algoritmaların sıkıştırılmasının ara aşamalarından biri olarak sıklıkla kullanılır.

    Sözlük algoritmaları

    Sözlük algoritmalarının arkasındaki fikir, orijinal dizideki öğe dizilerinin kodlanmasıdır. Bu kodlamada, orijinal diziden elde edilen özel bir sözlük kullanılır.
    Bütün bir kelime algoritması ailesi var, ancak geliştiricileri Lepel, Ziv ve Welch'in adını taşıyan en yaygın LZW algoritmasına bakacağız.
    Bu algoritmadaki sözlük, algoritma çalışırken kodlama dizeleriyle dolu bir tablodur. Sıkıştırılmış kodun kodunu çözerken, sözlük otomatik olarak geri yüklenir, bu nedenle sözlüğü sıkıştırılmış kodla birlikte aktarmaya gerek yoktur.
    Sözlük, tüm tekil dizelerle başlatılır, yani. sözlüğün ilk satırları kodlama yaptığımız alfabeyi temsil eder. Sıkıştırma, sözlüğe önceden yazılmış en uzun zinciri arar. Sözlüğe henüz yazılmamış bir dizeyle her karşılaşıldığında, oraya eklenir ve sözlükte önceden yazılmış dizeye karşılık gelen sıkıştırılmış bir kod çıkar. Teoride, sözlüğün boyutuna herhangi bir kısıtlama getirilmez, ancak pratikte bu boyutu sınırlamak mantıklıdır, çünkü zamanla artık metinde bulunmayan zincirler oluşmaya başlar. Ayrıca tablonun boyutu iki katına çıktığında, sıkıştırılmış kodları depolamak için fazladan bir bit ayırmamız gerekir. Bu gibi durumlardan kaçınmak için, tablonun tüm tekil dizeler tarafından başlatılmasını simgeleyen özel bir kod tanıtıldı.
    Algoritma tarafından yapılan bir sıkıştırma örneğini ele alalım. Guguk kuşu ipini sıkacağız, guguk kuşu, guguk kukuleta aldı. Sözlüğün 32 konum içereceğini varsayalım, bu da kodlarının her birinin 5 bit alacağı anlamına gelir. Başlangıçta, sözlük şu şekilde doldurulur:

    Bu tablo hem bilgiyi sıkıştıranın hem de paketi açanın yanındadır. Şimdi sıkıştırma işlemine bakacağız.


    Tablo, sözlüğü doldurma sürecini göstermektedir. Ortaya çıkan sıkıştırılmış kodun 105 bit aldığını ve orijinal metnin (bir karakteri kodlamak için 4 bit harcadığımızı varsayarak) 116 bit aldığını hesaplamak kolaydır.
    Aslında, kod çözme işlemi, kodların doğrudan şifresinin çözülmesine indirgenirken, tablonun kodlama sırasındakiyle aynı şekilde başlatılması önemlidir. Şimdi kod çözme algoritmasına bakalım.



    Sözlüğe eklenen dizgiyi i-inci adımda tam olarak sadece i+1'de tanımlayabiliriz. Açıkçası, i-inci satır, satırın ilk karakteri i + 1 ile bitmelidir. O. az önce bir sözlüğü nasıl geri yükleyeceğinizi bulduk. cScSc biçimindeki bir dizinin kodlandığı, burada c'nin bir karakter ve S'nin bir dize olduğu ve cS kelimesinin zaten sözlükte olduğu durum biraz ilgi çekicidir. İlk bakışta, kod çözücü bu durumu çözemeyecek gibi görünebilir, ancak aslında bu türdeki tüm satırlar her zaman başladıkları karakterle bitmelidir.

    Entropi kodlama algoritmaları
    Bu dizideki algoritmalar, en sık kullanılan dizi öğelerine en kısa sıkıştırılmış kodu atar. Onlar. aynı uzunluktaki diziler, farklı uzunluktaki sıkıştırılmış kodlarla kodlanmıştır. Ayrıca, sıralama ne kadar sık ​​gerçekleşirse, karşılık gelen sıkıştırılmış kod o kadar kısa olur.
    Huffman algoritması
    Huffman'ın algoritması, önek kodları oluşturmanıza olanak tanır. Önek kodlarını bir ikili ağaç üzerindeki yollar olarak düşünebilirsiniz: Bir düğümden sol oğluna geçiş, kodda 0'a ve sağ oğluna - 1'e karşılık gelir. Ağacın yapraklarını kodlanmış karakterlerle işaretlersek, önek kodunun ikili ağaç gösterimini alın.
    Bir Huffman ağacı oluşturmak ve Huffman kodlarını elde etmek için bir algoritma tanımlayalım.
  1. Giriş alfabesindeki karakterler, serbest düğümlerin bir listesini oluşturur. Her sayfa, sembolün oluşma sıklığına eşit bir ağırlığa sahiptir.
  2. Ağacın en az ağırlığa sahip iki serbest düğümü seçilir
  3. Ebeveynleri, toplam ağırlıklarına eşit bir ağırlıkla yaratılmıştır.
  4. Ebeveyn, ücretsiz düğümler listesine eklenir ve iki çocuğu bu listeden çıkarılır.
  5. Ebeveynden ayrılan bir yay bit 1'e atanır, diğerine - bit 0
  6. İkinciden başlayan adımlar, boş listede yalnızca bir boş düğüm kalana kadar tekrarlanır. Ağacın kökü olarak kabul edilecek.
Bu algoritmayı kullanarak, belirli bir alfabe için Huffman kodlarını, karakterlerin oluşma sıklığını hesaba katarak elde edebiliriz.
aritmetik kodlama
Aritmetik kodlama algoritmaları, eleman dizilerini kesirlere kodlar. Bu, elemanların frekans dağılımını hesaba katar. Şu anda aritmetik kodlama algoritmaları patentlerle korunmaktadır, bu nedenle sadece temel fikri ele alacağız.

Algoritma, 1991 yılında özellikle 24-bit ve gri tonlamalı görüntüleri sıkıştırmak için fotoğrafçılık alanında (Joint Photographic Expert Group) bir grup uzman tarafından geliştirilmiştir. Bu algoritma, iki seviyeli görüntüleri sıkıştırmada çok iyi değildir, ancak yakındaki piksellerin benzer renklere sahip olma eğiliminde olduğu sürekli tonlara sahip görüntüleri mükemmel bir şekilde 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 piksellik ayrık görüntü blokları matrisine uygulanan DCT'ye dayanmaktadır. DCT, bu blokları belirli frekansların genliklerine göre ayrıştırır. Sonuç olarak, kural olarak birçok katsayının sıfıra yakın olduğu, kaba sayısal biçimde temsil edilebilecek bir matris elde edilir, 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 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ölün. Her bileşen için her - 8 bitten ayrı ayrı çalışan üç DCT matrisi oluşturuyoruz. Yüksek sıkıştırma oranlarında, 8x8 blok 4:2:0 formatında YCbCr bileşenlerine ayrıştırılır, yani. Cb ve Cr bileşenleri, satırlar ve sütunlar boyunca bir noktadan alınır.

Aşama 3. 8x8 piksel görüntü bloklarına DCT uygulanması. Resmi olarak, 8x8 bloğu 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. Hesaplamaları hızlandırmak için basit bir yaklaşım, kosinüs fonksiyonlarını önceden hesaplamak ve sonuçları 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 o boşluktaki bir bloğun sütunlarını temsil etmek için 8 boyutlu bir uzayı tanımlayan 8x8'lik bir matris. Matris, transpoze edilmiş bir matristir ve aynısını yapar, ancak blok satırları için. Sonuç, matris formunda şu şekilde yazılan ayrılabilir bir dönüşümdür.

İşte hesaplaması çarpma işlemlerini ve hemen hemen aynı miktarda eklemeyi gerektiren, yukarıdaki formülü kullanan doğrudan hesaplamalardan önemli ölçüde daha az olan DCT'nin sonucu. Örneğin, 512x512 piksellik bir görüntünün dönüştürülmesi, aritmetik işlemler gerektirecektir. 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ı bileşene karşılık geldiği bir matris elde ederiz.

Adım 4. niceleme. Bu adımda, bazı bilgiler 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ının kullanılmasına bile izin verir, ancak bunun, genel dosya boyutunu artıracak olan sıkıştırılmış verilerle birlikte kod çözücüye iletilmesi gerekecek. Bir kullanıcının 64 katsayıyı tek başına 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 kroma için. Bu tablolar aşağıda sunulmuştur. İkinci yaklaşım, kullanıcı tarafından belirtilen bir parametreye bağlı olan bir niceleme tablosunu sentezlemektir (anında hesaplamak). Tablonun kendisi formül kullanılarak 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 dolayısıyla daha büyük bir sıkıştırma oranı elde edeceğimiz açıktır.

Kuantizasyon ayrıca algoritmanın belirli etkileriyle de ilişkilidir. Kuantizasyon adımının büyük değerlerinde kayıplar o kadar büyük olabilir ki görüntü tek renkli 8x8 karelere bölünür. Buna karşılık, yüksek frekanslardaki kayıplar, keskin bir renk geçişi ile konturların etrafında dalgalı bir "halo" oluştuğunda, "Gibbs etkisi" olarak adlandırılabilir.

Adım 5. 8x8 matrisini "zikzak" taramasını 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.

Adım 6. 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ı 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)…. çiftlerine katlanır.

Dönüştürülen bileşenin ilk sayısının, 8x8 bloğunun ortalama parlaklığına büyük ölçüde eşit olduğuna ve DC katsayısı olarak anıldığına dikkat edilmelidir. Aynı şekilde tüm görüntü blokları için. Bu durum, mutlak değerlerini değil, mevcut bloğun DC katsayısı ile önceki bloğun DC katsayısı arasındaki fark şeklindeki nispi değerleri ezberlerseniz DC katsayılarının etkili bir şekilde sıkıştırılabileceğini gösterir. olduğu gibi birinci katsayı. 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 katsayıların geri kalanı değişmeden kalır.

Adım 7. Tek tip olmayan sabit tablo Huffman kodlarını kullanarak elde edilen çiftleri sarın. Ayrıca DC ve AC katsayıları için farklı kodlar kullanılır, yani. Huffman kodları ile farklı tablolar.

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

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

Bu algoritmadaki görüntü geri yükleme 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 bit görüntüler çeken dijital kameraların ortaya çıkmasını mümkün kıldı. Algoritma asimetrik olsaydı, cihaz “yeniden şarj olana” kadar uzun süre beklemek hoş olmazdı - görüntüyü sıkıştırır.

JPEG bir ISO standardı olmasına rağmen, dosya formatı sabitlenmemiştir. Üreticiler bundan yararlanarak kendi uyumsuz formatlarını oluştururlar ve bu nedenle algoritmayı değiştirebilirler. Böylece, ISO tarafından önerilen algoritmanın iç tabloları, kendileriyle değiştirilir. Belirli uygulamalar için JPEG seçenekleri de vardır.

Oy: 22, 4

Tanıtım

Günümüzde yüksek kaliteli, yüksek performanslı bilgisayar grafikleri, yazılım geliştiriciler için en önemli görevlerden biridir. Çeşitli grafik ve multimedya sistemleri için verimli donanımların geliştirilmesine büyük fonlar yatırılıyor. Son yıllarda bilgisayarlar, televizyon veya baskı kalitesini çoktan aşmış olan en karmaşık görsel görüntüleri gerçek zamanlı olarak yeniden üretme yeteneğine sahip görünüyorlardı. Bu, bu yetenekleri kullanan çok sayıda programın ortaya çıkmasına katkıda bulundu: bilgisayar oyunları, video uygulamaları, 3d animasyon vb. Ancak tüm bu programların ayırt edici bir özelliği vardır: çalıştıkları grafiksel veriler çok fazla yer kaplar.

O zamanlar, kişisel bilgisayar kullanıcıları arasında BMP, PCX, GIF gibi grafik formatları zaten oldukça yaygındı. Ancak, modern grafik sistemleri için grafik bilgi miktarının yarısının bile yetersiz olduğu ortaya çıktı. Bu bağlamda, 1980'lerin sonlarından beri, dünyanın en büyük iki standart kuruluşu olan CCITT ve ISO, kayıplı sıkıştırılmış grafik dosyası formatı için tek bir standart geliştirmek üzere güçlerini birleştirdi. Yeni standart, Joint Photographic Experts Group'tan sonra JPEG olarak adlandırılmıştır.

Kısa bir not: JPEG, öncelikle bir sıkıştırma yöntemidir. Görüntülerin sunumu için tam teşekküllü bir standart olarak kabul edilemez. Bu nedenle, geometrik piksel boyutu, renk uzayı veya bit çizgilerinin serpiştirilmesi gibi görüntüye özgü parametreleri belirtmez. Aynı şey JPEG2000 ve JPEG-LS için de söylenebilir, tam teşekküllü standartlar değil, sıkıştırma yöntemleridir.

1. JPEG

En basit kayıplı JPEG kodlayıcının çalışma algoritmasını ele alalım. Tüm süreç aşağıdaki ana aşamalardan oluşur:


Pirinç. 1.
  • Ön işleme, bir görüntünün ön işlemesinin gerçekleştirildiği ve onu sonraki kodlama için uygun bir forma götüren bir aşamadır.
  • Ayrık Kosinüs Dönüşümü (DCT), bir görüntüyü uzamsal temsilinden spektral temsiline dönüştürmek için JPEG kodlayıcı tarafından kullanılır.
  • Yuvarlama (niceleme), önemsiz, yüksek frekanslı DCT katsayılarının yuvarlanması nedeniyle ana bilgi kaybının meydana geldiği aşamadır.
  • Sıkıştırma - alınan verileri standart yöntemler (tekrar kodlama, aritmetik kodlama vb.)

Görüntü birden fazla bileşen içeriyorsa, bunlar ayrı ayrı kodlanır. Bu bağlamda, bu aşamada, bir grafik görüntü, bileşen gösteriminden bir renk farkı, parlaklık gösterimine (ICT - Tersinir Renk Dönüşümü) dönüştürülür. İnsan gözünün bir parlaklık sinyaline bir renk sinyalinden daha duyarlı olması nedeniyle, bu dönüştürme, daha az görsel kayıpla daha iyi sıkıştırma sonuçları elde etmenizi sağlayacaktır. Daha sonra, ayrı bir bileşenin kodlamasını ele alacağız.

Pirinç. 2.

Pirinç. 3.

ICT dönüşümüne ek olarak, bu aşamada orijinal görüntü küçük kare bloklara bölünür ve görüntünün doğru uzamsal temsili için renk değerlerinin tabanı sıfıra göre kaydırılır: -> [-2 p-1, 2 s-1 - 1]. Bu adımlar, bir sonraki adımda kodlayıcının verimli çalışması için gereklidir.

1.2. Para politikası

Sıkıştırma algoritmasında önemli bir adım olarak, ayrık kosinüs dönüşümü (bundan böyle DCT olarak anılacaktır) bir tür Fourier dönüşümüdür ve ikincisi gibi bir ters dönüşüme (DCT) sahiptir. Bir görüntüyü, X ve Y eksenlerinin görüntünün genişliğine ve yüksekliğine karşılık geldiği ve karşılık gelen piksellerin renk değerlerinin Z ekseni boyunca çizildiği bir dizi uzamsal dalga olarak düşünürsek, o zaman şuradan gidebiliriz: görüntünün uzamsal temsilinden spektral temsiline ve bunun tersi de geçerlidir. DCT, bir N x N piksel matrisini uygun boyutta bir frekans katsayı matrisine dönüştürür.



Pirinç. 4.

Ortaya çıkan matriste, düşük frekanslı bileşenler sol üst köşeye daha yakın yerleştirilir ve yüksek frekanslı bileşenler sağa ve aşağı kaydırılır. Ekrandaki grafik görüntülerin ana bölümünün düşük frekanslı bilgilerden oluşması nedeniyle, elde edilen matrisi kullanarak en az önemli bilgileri minimum görsel kayıpla diferansiyel olarak atmak mümkündür. Böylece, DCT, resme ciddi bozulmalar getirmeden güvenle atılabilecek bilgileri seçmenize olanak tanır. Orijinal görüntü üzerinde bu görevi nasıl başaracağını hayal etmek zor.

Formüllerden (Şekil 4), ortaya çıkan matrisin bir elemanının hesaplanmasının O (N 2) zaman aldığı görülebilir, bu nedenle tüm matrisin dönüşümünü bir bütün olarak gerçekleştirmek neredeyse imkansızdır. JPEG ekibi bu soruna en iyi çözümü buldu: orijinal matrisi 8x8 standart karelere bölün ve her birini dönüştürün. Daha büyük blokların kullanılması, sıkıştırma kalitesini artıracaktır, ancak çok uzak noktaların birbirine benzer olma olasılığı çok az olduğundan, süresiz olarak değil.

Hesaplamalar sırasında, dönüşüm hızını önemli ölçüde artırmayı mümkün kılan yalnızca önceden hesaplanmış 32 kosinüs değeri kullanıldığına dikkat edilmelidir. Bu zaten şüphesiz kısmi bir bilgi kaybına yol açar, ancak hacimleri nispeten önemsizdir.

Hesaplamalarda yalnızca tamsayı aritmetiği kullanılırsa performansta hafif bir artış elde edilebilir, ancak bu yalnızca eski bilgisayarlar için geçerlidir, çünkü modern bilgisayarlarda kayan nokta sayıları üzerindeki işlemlerin maliyeti tamsayılar üzerindeki işlemlerden farklı değildir. Ayrıca, tamsayı aritmetiğinin kullanılması, sıkıştırılmış görüntünün kalitesini olumsuz yönde etkiler, bu da bu yöntemi modern bilgisayarlar için kabul edilemez hale getirir. DCT bir tür Fourier dönüşümü olduğundan, Fourier dönüşümünün performansını artırmaya yönelik tüm yöntemler burada da kullanılabilir.

1.3. Yuvarlama

Ana bilgi kaybının meydana geldiği bir sonraki aşama, yuvarlama veya nicelemedir. Gördüğünüz gibi DCT herhangi bir sıkıştırma veya kodlama yapmıyor. Ana görevi, orijinal görüntüyü, üzerinde sonraki işlemler için uygun bir forma dönüştürmektir.

Yuvarlama, DCT matrisini depolamak için gereken bilgi miktarını kısmi bir doğruluk kaybıyla azaltma işlemidir. JPEG standardı bunun için bir yuvarlama matrisi (RO) kullanır. Orijinal DCT matrisinin her elemanı bir MO elemanına karşılık gelir. Ortaya çıkan matris, orijinal matrisin MO'ya bölünmesiyle elde edilir. Aynı zamanda, daha düşük MO katsayıları, DCT matrisindeki düşük frekans değerlerine karşılık gelir, bu da daha önemli, düşük frekanslı bilgilerin bırakılmasına ve daha az önemli yüksek frekanslı bilgilerin atılmasına izin verir. Düşük frekanslı bileşenlerin DCT matrisinin sol üst köşesinde yoğunlaşmasından dolayı MO değerleri soldan sağa ve yukarıdan aşağıya doğru artmaktadır.


3 5 7 9 11 13 15 17
5 7 9 11 13 15 17 19
7 9 11 13 15 17 19 21
9 11 13 15 17 19 21 23
11 13 15 17 19 21 23 25
13 15 17 19 21 23 25 27
15 17 19 21 23 25 27 29
17 19 21 23 25 27 29 31

Kalite faktörü 2 olan yuvarlama matrisi örneği.

Yuvarlama sonuçları ve yeniden oluşturulan görüntünün kalitesi doğrudan seçilen yuvarlama matrisine bağlıdır. JPEG standardı, herhangi bir MO'yu kullanmanıza izin verir, ancak ISO, optimum sonuçları elde etmek için kapsamlı deneysel testler yoluyla bir dizi matris geliştirmiştir.

1.4. Sıkıştırma

JPEG kodlama algoritmasındaki son adım sıkıştırmadır. MO kullanılarak DCT matrisi işlendikten sonra, elde edilen matriste, özellikle yüksek frekans bölgesinde (sağ alt köşede) çok sayıda sıfır görünür.

İlk adımda, ortaya çıkan matrisin sol üst köşesindeki değer, göreceli bir değerle değiştirilir. Görüntünün bitişik blokları birbirine benzer olduğu için, bir sonraki elemanın (0,0) bir öncekinden farklı olarak kodlanması daha verimli olacaktır. İkinci adım, çok sayıda ardışık sıfırı işlemek için tekrar kodlama algoritmasını (LZW) doğrudan uygulamaktır. Deneysel testler, aşağıdaki şekilde gösterildiği gibi matrisi bir zikzak düzeninde hareket ettirerek en iyi sonuçların elde edilebileceğini göstermiştir.

Pirinç. 5.

Son olarak, üçüncü ve son adımda, sonuç, uygulamaya bağlı olarak Huffman algoritması veya aritmetik kodlama kullanılarak normal veriler gibi sıkıştırılır. Bu aşamaya "entropi kodlaması" denir (JPEG terminolojisinde).

1.5. kod çözme

DCT bir Fourier dönüşümü olduğundan, buna ters bir ayrık kosinüs dönüşümü (IDCT) vardır. Kod çözme algoritması, kodlama algoritmasını ters sırada tekrarlar.

2.Jpeg2000

Başlangıçta yeni standart, gelecekteki kayıpsız sıkıştırma standardı JPEG-LS'nin temeli olarak geliştirildi, ancak daha sonra daha verimli algoritmaların ortaya çıkması nedeniyle reddedildi. Teknolojinin gelişmesiyle bağlantılı olarak, JPEG standardı giderek alaka düzeyini kaybetti. JPEG2000'in geliştiricileri, mevcut standartlardaki birçok hatayı düzeltecek bir standart oluşturmayı umuyorlardı. Görevleri arasında şunlar vardı:

  • Etkisiz düşük frekanslı sıkıştırmayı ortadan kaldırır... Mevcut algoritmalar orta menzilli ve yüksek frekanslı bölgeleri sıkıştırmada iyi bir iş çıkardı, ancak düşük frekans bölgesinde zayıf sonuçlar gösterdiler.
  • Kayıplı ve kayıpsız sıkıştırma... Geliştirme sırasında, tek bir sıkıştırma akışında kayıplı ve kayıpsız sıkıştırma için bir standart yoktu.
  • Büyük görüntü işleme... Mevcut algoritmalar, 64Kx64K'dan büyük görüntülerin döşeme yapılmadan verimli bir şekilde sıkıştırılmasına izin vermiyordu.
  • Birleşik Sıkıştırma Algoritması Yapısı... Mevcut JPEG uygulaması, çoğu bazı uygulamalara özel olan ve çoğu kod çözücü tarafından desteklenmeyen 44 değişikliği destekledi.
  • bağışıklık... JPEG'in geliştirildiği sırada, ağ teknolojileri henüz yeterince gelişmemişti ve JPEG tasarımcıları, görüntüleri güvenli olmayan kanallar üzerinden aktarırken gürültü bağışıklığını ve iletim sonucu hasar görmüşse bir görüntüyü kurtarma olasılığını düşünmediler. .
  • Bilgisayar tarafından oluşturulan görüntüler... Orijinal algoritmalar, dijital fotoğraf makinesi veya tarayıcı ile elde edilen dijital fotoğraflar ve görüntüler üzerinde iyi çalıştı, ancak örneğin grafik düzenleyiciler kullanılarak bir bilgisayarda oluşturulan görüntüler etkisiz bir şekilde işlendi.
  • Karmaşık belgeler... JPEG, karmaşık 2D görüntüleri (özellikle metin görüntülerini) işlerken çok kötü sonuçlar gösterdi.

Aşağıdaki şema, bir JPEG2000 kodlayıcının temel adımlarını göstermektedir.


Pirinç. 6.


Pirinç. 7.

JPEG'den farklı olarak, JPEG2000 kodlayıcı, algoritmada kullanılan DWT (ayrık dalgacık dönüşümü) herhangi bir boyuttaki parçalar üzerinde çalıştığından, görüntüyü küçük kare bloklara bölmeyi gerektirmez. Öte yandan, bazen, kodlayıcının işlem için kullanabileceği bellek miktarı, görüntünün tamamını kodlamak için gereken bellek miktarından daha azsa, görüntü, birbirinden bağımsız olarak kodlanmış kare karolara bölünür. Ardından, bir kutucuğun kodlamasını ele alacağız. Adımların geri kalanı JPEG ile aynıdır.

Pirinç. sekiz.

2.2. sunta

JPEG2000, görüntüyü yüksek frekanslı ve düşük frekanslı bölgelere bölmek için Ayrık Dalgacık Dönüşümünü kullanır. DVP, bir frekans filtresi kullanarak orijinal görüntünün her satırını ve sütununu işler.

Pirinç. dokuz.

Çıkışta bir frekans filtresinin kullanılmasıyla her geçişin bilgi miktarını iki katına çıkarması nedeniyle, işlendikten sonra görüntü boyutu yarıya iner. Suntanın bir aşamasından sonra, işlenmiş parça dört bölüme ayrılır:

  • LL - satırlarda ve sütunlarda düşük frekanslar
  • HL - satırlarda yüksek frekanslar ve sütunlarda düşük frekanslar
  • LH - satırlarda düşük frekanslar ve sütunlarda yüksek frekanslar
  • HH - satırlara ve sütunlara göre yüksek frekanslar

Standarda göre kademe sayısı 0 ile 32 arası olabilir. Normal bir görüntü için 4 ile 8 kademe arası kullanılır. Takip eden her aşamada, yüksek frekans bölgeleri genellikle önemli bilgiler içermediğinden yalnızca düşük frekans bölgesi (LL) işlenir.


Pirinç. on.

Pirinç. on bir.

2.3. Yuvarlama

DWT katsayılarını yuvarlamak için ölü bölgeli sabit bir niceleyici kullanılır. (Şekil 14) Her parça için, bu parçanın tüm katsayıları için yuvarlama adımının sabit bir değeri kullanılır. Yuvarlatılmış değerleri hesaplama formülü Şekil 12'de gösterilmiştir. Burada y, katsayının ilk değeridir, (y) işareti, katsayının işaretini belirler ve Δb, yuvarlama adımının değeridir. Ölü bölge niceleyici, sıfır civarında 2Δb aralığına sahip bir aralıktır, çıktıda daha fazla sıfır verir.

2.4. kodlama

Ortaya çıkan yuvarlatılmış katsayılar, blok blok kodlanır. JPEG2000 standardına göre, kodlamadan hemen önce parçalar, bir parçanın tüm blokları aynı boyutta olacak şekilde yeterince küçük bloklara (örneğin, 32x32 veya 64x64) bölünür. Gürültü bağışıklığını iyileştirmek için sıkıştırılmış bilgilerin daha esnek bir organizasyonunu uygulamak için bloklara bölme yapılır, vb.


Pirinç. 16.

JPEG2000'de her blok ayrı ayrı kodlanmıştır. Kodlama algoritması, Şekil 17'de gösterildiği gibi her bloğun yuvarlatma matrisini şeritler halinde çaprazlar. Bloklar, nominal yüksekliği 4 olan bloklara bölünür. Şeritler daha sonra yukarıdan aşağıya taranır ve her şeritteki sütunlar çaprazlanır. soldan sağa.


Pirinç. 17.

Kodlama işlemi sırasında, bloktaki katsayılar sanal olarak bit düzlemleri olarak temsil edilir. Bu düzlemlerden biri katsayıların işaretlerinden oluşur; düzlemlerin geri kalanı, katsayı değerlerinin farklı basamaklarına karşılık gelir (düzlemdeki bitin konumu, katsayının bloktaki konumuna karşılık gelir). Kodlama düzlemlerde gerçekleştirilir: ilk önce, katsayıların en önemli bitine karşılık gelen düzlem kodlanır, ardından bir sonraki azalan düzende vb. N en yüksek öncelikli bit düzleminin (uçak düzlemleri) bir tane içermemesi olabilir. Bu durumda uçak, en az bir birim içeren ilk uçaktır. Kodlama sırasında önündeki boş düzlemler atlanır ve blok başlığına sayıları hakkında bilgi girilir.

Aritmetik kodlama, bağlama duyarlı bir modele dayanmaktadır. Bağlam, kodlanan biti çevreleyen bit değerlerinin bir fonksiyonu olarak oluşturulur. NBP hariç her bit düzlemi tipik olarak üç geçişte kodlanır. İlk kod geçişi sırasında, katsayıların önemi hakkında bilgi verilir. Kodlama sırasında, kodlanmış bloktaki her katsayıya bir parametre önemi atanır. Bu katsayının en az bir sıfır olmayan biti, halihazırda kodlanmış bit düzlemlerinde mevcutsa, bir katsayı anlamlı olarak adlandırılır.

Düzlemin her biti için, karşılık gelen katsayı henüz anlamlı değilse ve en az bir bitişik katsayı zaten önemliyse, mevcut katsayı için anlamlılık gerçeği, yani kodlanmış akımın bu bitinin değeri kodlanır. uçak aslında kodlanmıştır. Kodlanmış bitin sıfır olmadığı tespit edilirse, işlenmesinden hemen sonra, katsayı işaretlerinin bit düzleminin karşılık gelen biti kodlanır (işaret kodlaması).

İkinci geçiş, birinci geçişte dokunulmamış katsayıların halihazırda önemli olan bitlerini kodlar. Önceki geçişten farklı olarak, komşu katsayıların önemi hakkındaki bilgilere dayanarak kodlama kararı verildiğinde, bu geçiş sırasında bitler hatasız olarak kodlanır.

Üçüncü, son geçiş sırasında, birinci ve ikinci geçişler sırasında işlenmeyen bitler üzerinde işlem yapılır. Bu son adımda, grup kodlaması ile birlikte aritmetik kodlama uygulanır.

Standart tarafından sağlanan önemli bir ayrıntı, bilgi kaybından kaynaklanan başka bir verimlilik kazancı kaynağı olan kod geçişlerini atlama yeteneğidir (ilk ve en belirgin kaynak nicelemedir). Bu özellik, kod oluşturma hızını kontrol etmek için aktif olarak kullanılmaktadır.

2.5. Veri organizasyonu

Söz konusu standardın önemli bir avantajı, temsilinin kodunu tamamen çözmeden tek tek görüntü öğelerine erişme yeteneğidir. Bu olanak, ilk olarak, orijinal görüntünün, ayrı görüntüler olarak kodlanmış kesişmeyen alanlara (döşemeler) bölünmesi ve ikinci olarak, ayrı bir döşemenin kodunun her biri parçalar (katmanlar) şeklinde temsil edilmesiyle sağlanır. bazı (karo) alanına karşılık gelen katsayıların toplam kodudur. Katmanlar, sırayla, farklı ayrıştırma seviyelerinde katsayı bloklarının kodunu içeren sözde paketlere bölünür. Görüntünün herhangi bir alanının kodunu çözmek için, hangi karolara ait olduğunu ve bu karolara ait olan katmanların, gerekli alanı geri yüklemek için gerekli katsayı bloklarının kodunu içerdiğini belirlemek yeterlidir.



Pirinç. yirmi.

Elbette "rahat" bir görüntü sunumu sıkıştırma verimliliği açısından faydalı olmayabilir. Gerçekten de, yapısal elemanların (fayanslar, karoların katman oluşturan alanları vb.) boyutunda bir azalma ile sıkıştırma verimi biraz azalır. Bu durumda standart bize bir seçenek bırakıyor: bir yandan, görüntünün parçalarını hızlı bir şekilde çıkarmamıza ve düzenlememize izin veren bilgi temsillerini alma fırsatımız var, diğer yandan standart, oluşturulmasını engellemez. hacim açısından etkili olan bilgilendirici temsiller.

Gürültü bağışıklığını ve JPEG2000 standardındaki bilgilere erişim kolaylığını sağlamak için, bir işaretleyici ve işaretleyici segmentleri sistemi sağlanmıştır. İşaretçi segmentleri, işaretleyicilerle sınırlanan bilgi parçalarının parametrelerini içerir. Bir işaretleyici ile başlayan veriler, herhangi bir ek bilgi olmaksızın doğru bir şekilde yorumlanabilir (bu, bütünün parçalardan geri yüklenebileceği anlamına gelmez), bu, temsili zarar görmüş bir görüntünün kısmen geri yüklenmesini mümkün kılar. Gürültü bağışıklığı elemanlarının tanıtılması, standardın her türlü telekomünikasyon uygulamasında kullanımına yeşil ışık yakmaktadır.

Yüksek kaliteli sıkıştırma elde etmek, şüphesiz, standardı oluşturmanın ana zorluklarından biriydi ve burada geliştiriciler açık bir ilerleme kaydettiler. JPEG2000 standardı, kayıplı sıkıştırmada JPEG standardından yaklaşık 2 kat ve kayıpsız sıkıştırmada %5-20 oranında daha iyi performans gösterir. Tabii ki, bu durumda kayıpsız sıkıştırma ile verimlilik, örneğin JPEG-LS standardındaki kadar yüksek değil, ancak oldukça kabul edilebilir. Kayıplı sıkıştırmanın verimliliğine gelince, burada standart, bu tür yöntemler için bugüne kadarki en iyi sonuçlara yakın sonuçlar almanızı sağlar.

3. JPEG-LS

Biçim JPEG-LS formata dayanıyordu LOCO-I(Görüntüler için Düşük Karmaşıklık Kayıpsız Sıkıştırma). JPEG-LS standardının geliştirilmesinde temel alınan kayıpsız sıkıştırma algoritması LOCO-I, ilk kez yalnızca kayıpsız değil, aynı zamanda neredeyse kayıpsız modu da (kullanıcı tarafından belirlenen sınırlı kayıpla sıkıştırma) sağladı. JPEG2000 kayıpsız modunun aksine, JPEG-LS'nin gerçekten başarılı olduğu ortaya çıktı: daha yüksek sıkıştırma verimliliği ile yeni standart, yüksek sıkıştırma / açma hızı sağlar ve bilgisayar kaynakları için fazla talepkar değildir.

JPEG-LS formatının şu anlama geldiğini anlamak önemlidir:

  • JPEG yönteminin bir uzantısı veya değişikliği değildir;
  • DCT veya aritmetik kodlama kullanmaz;
  • zayıf nicelemeyi yalnızca "neredeyse kayıpsız" modda kullanır

3.1. Temel kavram ve çalışma prensiplerinin tanıtılması

Kayıpsız veri sıkıştırma, iki ayrı bağımsız bölümden oluşur: modelleme ve kodlama. Gelecekte aktif olarak kullanacağımız bazı terimleri tanımlayalım:

Kodlayıcı (Kodlayıcı), kodlama işleminden "sorumludur", yani: orijinal görüntüyü dijital formatta ve standart tarafından tanımlanan tüm gerekli parametreleri girdi olarak alır ve özel bir prosedür seti kullanarak sıkıştırılmış bir veri seti oluşturur. görüntü Kod çözücü, parçaların kodunun çözülmesi ve dönüştürülmesi işlemine "cevap verir", yani: sıkıştırılmış bir görüntü ve gerekli tüm parametrelerle veri almak, yeniden yapılandırılmış görüntüyü çıktı olarak verir

JPEG-LS kod çözücü, kodlayıcıdan çok az farklıdır, bu nedenle bu sıkıştırma algoritması neredeyse simetrik olarak adlandırılabilir. İşte kodlama ilkelerini gösteren basitleştirilmiş bir diyagram:



Pirinç. 21.

hakkında bazı bilgiler orijinal görüntü: aşağıdaki şemada gösterildiği gibi (şekil 22), orijinal görüntü Nf bileşenlerinden oluşabilir. Her Ci bileşeni, x i sütunları ve y i satırlarından oluşan iki boyutlu bir piksel dizisi (örnekler) içerir. Bileşen boyutları iki parametreye bağlıdır: X ve Y, burada X, x i değerleri arasında maksimum ve Y, tüm bileşenlerin y i değerleri arasında maksimumdur. (JPEG-LS standardında, tek bileşenli görüntülere kıyasla çok bileşenli görüntülerle çalışmanın farklılıklarına tam bir bölüm ayrılmıştır, ancak bu makalede yalnızca tek bileşenli görüntülerle çalışmaya odaklanacağız).



Pirinç. 22.

Şekil, her bileşenin yönünü gösterir: üst, alt, sol ve sağ. Piksellerin kodlama rutinlerine beslenme sırası, bileşen boyunca soldan sağa ve yukarıdan aşağıya olarak tanımlanır.

Geçerli piksel x'i tahmin etmek için bağlam pikselleri a, b, c, d kullanılır. Bağlama bağlı olarak, kodlayıcı modu seçer: seri (çalışma modu) veya normal (normal mod). seri moda y ve z muhtemelen çakışıyorsa seçilir, düzenli- aksi halde. Seçeneğin varlığı ile ilgili buraya bir not düşelim "Neredeyse kayıp yok": Bu seçenek etkinleştirildiğinde, Y ve z YAKIN tolerans ayarına göre hemen hemen aynıysa seri mod seçilecektir.

Seri modunun kullanılması durumunda, x pikselindeki geçerli çizgiye bakmaya başlarız ve bağlamsal piksel a ile çakışan piksel serisinin en uzun uzunluğunu buluruz. Böylece, geçerli satır içinde, değeri bilinen piksel a ile çakışan bir dizi özdeş piksel elde ederiz. Sadece dizinin uzunluğunu kodlamak için kalır. (Bu, 32 elemanlı bir J dizisi kullanılarak yapılır). "Neredeyse kayıpsız" seçeneği etkinleştirildiğinde, NEAR parametresi kullanılarak a'ya yakın bir dizi pikselin seçildiğini tahmin etmiş olabilirsiniz.

Şimdi düzenli bir moda kullanma durumunda yaptığımız işlemlere bakalım. Piksel değerleri a, b ve c piksel x (Px) tahminini hesaplamak için kullanılır. Daha sonra sözde tahmin hatası (Errval) hesaplanır. Değeri, x ve Px değerleri arasındaki farka eşittir. Errval, bağlama özgü bazı terimlerle ayarlanır ve ardından Golomb kodlarıyla kodlanır. Golomb kodu, A ve N özel dizilerinde depolanan aynı piksellerin a, b, c, d ve Errval değerlerine bağlıdır. "Neredeyse kayıpsız" seçeneği etkinleştirildiğinde, kodlamadan önce tahmin hatası ek olarak nicelenir.


Pirinç. 23.

3.2. kodlayıcı

Çoğunlukla JPEG-LS kayıpsız bir sıkıştırma yöntemi olarak kullanılır, bu nedenle kurtarılan görüntü dosyası genellikle orijinal dosyayla aynıdır. Neredeyse kayıpsız bir şekilde, orijinal ve yeniden oluşturulmuş görünüm farklı olabilir. Yeniden oluşturulan pikseli Rp ile ve orijinal pikseli p ile göstereceğiz.

Başlatma aşamasında, kodlayıcı aşağıdaki işlemleri gerçekleştirir:

  • Parametreler hesaplanır ARALIK = kat ((MAXVAL + 2 * YAKIN) / (2 * YAKIN + 1)) + 1, qbpp = tavan (log ARALIK), bpp = maks (2, tavan (log (MAXVAL + 1)) ), LIMIT = 2 * (bpp + maks (8, bpp)). (Kayıpsız kodlama durumunda YAKIN = 0, ARALIK = MAXVAL + 1. “Neredeyse kayıpsız” modu etkinleştirilirse, YAKIN> 0). MAXVAL ve NEAR, algoritmayı uygulayan uygulama tarafından ayarlanan parametrelerdir.
  • N, A, B ve C dizin dizileri başlatılır. Amaçlarını açıklayalım: N, her bağlamın oluşma sıklığını depolamak için kullanılır, A - tahmin hatasının büyüklüğünü toplamak için, B - sistematik sapmayı hesaplamak için, C - tahmin hatasının değerlerini depolamak için kullanılır düzeltme.
  • Çalışma modu için değişkenler başlatılır RUNindex = 0 ve J = (0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5 , 5, 6, 6, 7, 7, 8, 9,10,11,12,13,14,15).
  • İki yardımcı değişken Nn, Nn = 0, çoğuşma kesme pikselini kodlamak için başlatılır.

Gelecekte kullanılacak bazı fonksiyonları ve değişkenleri tanıtalım:

GetNextSample () Fonksiyonu: orijinal görüntünün sonraki pikseli hakkında bilgi alır ve x, a, b, c, d, Ix, Ra, Rb, Rc, Rd değişkenlerinin karşılık gelen değerlerini ayarlar. Okunan piksel satırın sonundaysa GetNextSample (), EOLine = 1 değerini ayarlar. Diğer tüm durumlarda, EOLine = 0. Ra, Rb, Rc, Rd değerleri, değerlerini daha önce hesaplanan Rx değerinden devralır. EOLine Global değişkeni: GetNextSample () işlevi tarafından ayarlanır: geçerli piksel satırdaki son ise 1'e, aksi takdirde 0'a eşittir. AppendToBitStream (a, b) İşlev: B bitlerini kullanarak kodlanmış bit akışına ikili olarak negatif olmayan bir sayı ekler. En önemli bitler önce eklenir. Quantize (a) Fonksiyonu: Neredeyse kayıpsız modda tahmin hatasını nicelemek için kullanılır. ComputeRx () işlevi: Geçerli piksel için yeniden yapılandırılmış Rx değerini döndürür (nicelenmiş bir "tahmin hatası" kullanır).

Yukarıdaki görüntüden (Şekil 23) a, b, c ve d piksellerinin x pikselinin kodlanmasında önemli bir rol oynadığı açıktır. Bu pikseller kaybolduğunda ne olduğunu anlamaya çalışalım. Bu nedenle, üst satırı kodlarken, bağlam pikselleri c, b ve d yoktur, bu nedenle değerleri sıfır olarak kabul edilir. Geçerli piksel bir satırın başında veya sonundaysa, a, c veya d pikselleri tanımsızdır. Bu durumda, a ve d piksel b'nin yeniden yapılandırılmış Rb değerini (veya üst satır için sıfır) kullanır ve c önceki satırın ilk karakterini kodlarken a'nın yeniden yapılandırılmış değerini kullanır. Bu nedenle, kodlayıcı, bazı pikselleri yeniden yapılandırarak kod çözücünün çalışmalarının bir kısmını yapmalıdır.

Kodlayıcı aşağıdaki üç adımla başlar:

Q bağlamını oluşturduktan sonra kodlayıcı x pikselini tahmin eder. İlk olarak, Px tahmini, sözde kenar algılama tahmincisi kullanılarak hesaplanır:

if (Rc> = maks (Ra, Rb)) Px = min (Ra, Rb);
Başka (
eğer (Rc<= min(Ra, Rb))
Px = maks (Ra, Rb);
Başka
Px = Ra + Rb - Rc;
}

"Kenar kuralı"nın özünü açıklayalım. Bunu yapmak için, b durumunu düşünün< а. При этом условии «правило края» выбирает b в качестве прогноза х во многих случаях, когда вертикальный край изображения находится непосредственно слева от х. Аналогично, пиксель а выбирается в качестве прогноза х во многих случаях, когда горизонтальный край находится непосредственно над х. Если край не обнаруживается, то «правило края» вычисляет прогноз в виде а + b - с, что имеет простую геометрическую интерпретацию. Если каждый пиксель является точкой трехмерного пространства, то прогноз а + b - с помещает Рх на ту же плоскость, что и точки а, b и с.

Bir sonraki adım, SIGN numarası (üç bölge Qi numarasına bağlı olarak), C (Q) düzeltme değerleri (sistematik sapmalardan türetilmiştir ve burada ele alınmamıştır) ve MAXVAL parametresini kullanarak önyargıdan tahmin düzeltmesidir.

eğer (İŞARET == +1)
Px = Px + C (Q);
Başka
Px = Px - C (Q);

(Px> MAXVAL) ise
Px = MAKSVAL;
başka ise (Px< 0)
P = 0;

Px tahmini bulunduktan sonra, kodlayıcı x - Px arasındaki fark olarak Errval tahmin hatasını hesaplar, ancak SIGN değeri negatifse işareti tersine çevirir.

Neredeyse kayıpsız modda, hata nicelenir ve kodlayıcı, piksel x'in bu yeniden yapılandırılmış Rx değerini bir kod çözücünün yaptığı gibi kullanır. Ana niceleme adımı aşağıdaki gibidir:

eğer (Hata> 0)
Errval = (Errval + YAKIN) / (2 * YAKIN + 1);
Başka
Errval = - (Errval - YAKIN) / (2 * YAKIN + 1);

Bu, NEAR parametresini kullanır, ancak burada verilmeyen bazı ayrıntılar vardır. Ana yeniden oluşturma adımı, Rx = Px + SIGN * Errval * (2 * YAKIN + 1) bulmaktır.

Tahmin hatası (olası nicelemeden sonra) bir modülo azalmaya uğrar. (Bundan sonra ana kodlama adımına hazırdır).

eğer (Errval< 0)
Errval = Errval + ARALIK;
if (Hata> = ((ARALIK + 1) / 2))
Errval = Errval - ARALIK;

Golomb kodları (ana parametre b olarak gösterildi). JPEG-LS'de bu parametre m ile gösterilir. M sayısı zaten seçilmişse, negatif olmayan bir n tamsayının Golomb kodu iki bölümden oluşur: n / m sayısının tamsayı bölümünün tekli kodu ve ikili gösterim n mod m. Bu kod, geometrik dağılıma sahip tam sayılar için idealdir (yani, n'nin olasılığı (1 - r) olduğunda) * r n, 0< r < 1) . Для каждого геометрического распределения найдется такое число m, что код Голомба, построенный по m, имеет наименьшую возможную среднюю длину. Простейший случай, когда m равно степени 2 (m = 2 k), приводит к простым операциям кодирования/декодирования. Код числа n состоит в этом случае из k младших разрядов числа n, перед которыми стоит унарный код числа, составленного из остальных старших разрядов числа n. Этот специальный код Голомба обозначается через G(k) .

Örneğin, n = 19 = 10011 2 sayısının G (2) kodunu hesaplayalım. k = 2 olduğundan m = 4. n sayısının en az anlamlı iki basamağı olan 11 2 ile başlayalım. Bunlar, n mod m (3 = 19 mod 4) ile aynı olan 3'tür. Kalan en anlamlı basamak, 100 2, n / m'nin tamsayı kısmına eşit olan 4 sayısını verecektir (19/4 = 4.75). 4'ün birli kodu 00001'dir, dolayısıyla n = 19 sayısının G (2) kodu 00001 | 11'dir.

Pratikte, her zaman sonlu sayıda negatif olmayan tam sayı vardır. En büyük sayıyı I ile gösterelim. En büyük G (0) uzunluğu I + 1'e eşittir ve I büyük olabileceğinden Golomb kodunun boyutunu sınırlamak istenir. Bu, LG'nin k ve glimit parametrelerine bağlı olan özel Golomb kodu (k, glimit) ile yapılır. İlk olarak, n sayısının en anlamlı rakamlarından q sayısını oluşturmalısınız. eğer q< glimit- - 1 , то код LG(k, glimit) совпадает с кодом LG(k]. В противном случае, приготавливается унарный код числа glimit - ceil(log I) - 1 (то есть, glimit - ceil(log I) - 1 нулей, за которыми стоит единственная 1). Это действует как код esc, после которого стоит двоичный код n - 1 из ceil(log I) бит.

Tahmin hataları mutlaka pozitif sayılar değildir. Sıfır veya negatif olabilen bazı farklara eşittirler. Ancak, Golomb kodları pozitif sayılar için oluşturulmuştur. Bu nedenle, kodlamadan önce negatif hata değerleri bir dizi negatif olmayan sayıya yansıtılmalıdır. Bunun için ekran kullanılır:
MErrval =
2 * Errval ise Errval> = 0,
2 * | Errval | eğer Errval< 0.

Bu eşleme, negatif ve pozitif değerleri 0, -1, +1, -2, +2, -3, ... şeklinde sıralar.

Aşağıdaki tablo, alfabenin 256 (yani, I = 255 ve ceil (log I) = 8) olduğunu varsayarak bazı tahmin hatalarını, görüntülenen değerleri ve bunların LG kodlarını (2, 32) listeler.

Tablo: tahmin hataları, ekranlar ve LG kodları (2, 32)

Tahmin hatası Görüntülenen değer kod
0 0 1 00
-1 1 1 01
1 2 1 10
-2 3 1 11
2 4 01 00
-3 5 01 01
3 6 01 10
-4 7 01 11
4 8 001 00
-5 9 001 01
5 10 001 10
-6 11 001 11
6 12 0001 00
...
50 100 000000000000
000000000001
01100011

Şimdi Golomb kodları için k parametresinin seçimini tartışmak gerekiyor. Bu yanıt vererek yapılır. k parametresi bağlama duyarlıdır ve değeri, bu bağlama sahip bir piksel bulunduğunda her zaman güncellenir. k'nin hesaplanması basit bir satırda ifade edilebilir:
için (k = 0; (N [Q]<burada A ve N, 0 ile 364 arasındaki dizin dizileridir. Bu formül, iki dizinin dizini olarak Q bağlamını kullanır. Başlangıçta, k sıfıra başlatılır ve ardından döngü yapılır. Döngünün her yinelemesinde, N [Q] dizisinin öğesi k basamak sola kaydırılır ve A [Q] ile karşılaştırılır. Kaydırılan değer N [Q], A [Q]'ya eşit veya daha büyükse, mevcut değer k seçilir. Aksi takdirde, k 1 artırılır ve test tekrarlanır.

k sayısını bulduktan sonra, Errval tahmin hatası, LG (k, LIMIT) kodu kullanılarak kodlanan MErrval sayısına dönüştürülür. LIMIT numarası bir parametredir. A ve N dizilerinin güncellenmesi (bir yardımcı dizi B ile birlikte) aşağıdaki kod parçacığını gösterir (RESET parametresi uygulama tarafından ayarlanır):

B [Q] = B [Q] + Errval * (2 * YAKIN + 1);
A [Q] = A [Q] + abs (Errval);
if (N [Q] == RESET) (
A [Q] = A [Q] >> 1;
B [Q] = B [Q] >> 1;
N [Q] = N [Q] >> 1;
}
N [Q] = N [Q] + 1;

Şimdi tahmin yanlılığının hesaplanmasından bahsedelim. Tahmin düzeltme değeri C [Q], x pikselinin kodlamasının sonunda güncellenmelidir. Bu, iki değişken gerektirir - B [Q] ve N [Q]. N [Q], başlatmadan bu yana Q bağlamının oluşum sayısıdır. B [Q], C [Q] değerinin yineleme başına en fazla bir kez güncellenmesine izin veren bir önyargıdır. Dolayısıyla, tahmin değeri C [Q] aşağıdaki koda göre hesaplanır:

eğer (B [Q]<= -N[Q]) {
B [Q] = B [Q] + N [Q];
eğer (C [Q]> MIN_C)
C [Q] = C [Q] - 1;
eğer (B [Q]<= -N[Q])
B [Q] = -N [Q] + 1;
}
else if (B [Q]> 0) (
B [Q] = B [Q] - N [Q];
eğer (C [Q]< MAX_C)
C [Q] = C [Q] + 1;
eğer (B [Q]> 0)
B [Q] = 0;
}

MIN_C ve MAX_C sabitleri, sırasıyla -128 ve 127'ye eşit olan dizin dizisi C için minimum ve maksimum olası değerlerdir.

Kodlama, seri şekilde farklı şekilde yapılır. Kodlayıcının, Ix değerleri aynı ve bağlam pikseli a'nın yeniden yapılandırılmış Ra değerine eşit olan ardışık x piksellerini algıladığında bu modu seçtiğini hatırlayın. "Neredeyse kayıpsız" seçeneği için serideki piksellerin eşitsizliği sağlayan Ix değerlerine sahip olması gerekir | Ix - Ra |<= NEAR . Серия не должна выходить за пределы текущей строки. Длина серии кодируется (сам пиксель кодировать не нужно, поскольку он равен Ra), и если конец серии находится раньше конца строки, то после ее закодированной длины будет сразу записан код следующего пикселя (который прерывает серию). Две основные задачи кодера в этой моде состоят

  1. bir diziyi izlemede ve uzunluğunu kodlamada;
  2. seriyi bozan pikseli kodlarken.

Toplu izleme aşağıdaki gibi yapılabilir:

ÇALIŞMA değeri = Ra;
RUNcnt = 0;
while (abs (Ix - RUNval)<= NEAR) {
RUNcnt = RUNcnt + 1;
Rx = ÇALIŞMA değeri;
if (EOLine == 1)
kırmak;
Başka
GetNextÖrnek();
}

Girilen değerlerden bazılarını açıklayalım: RUNcnt, tekrarlayan piksel sayacıdır (seri mod için) ve RUNval, yeniden oluşturulan tekrarlayan pikselin geçerli değeridir.

Seriyi kodlama işlemini anlatalım. İlk kod parçacığı, rm uzunluğundaki dizi segmentlerinin kodlamasını açıklar:

while (RUNcnt> = (1<AppendToBitStream (1, 1);
RUNcnt = RUNcnt - (1<if (RUNindex< 31))
RUNindex = RUNindex + 1;
}

Aşağıdaki kod, rm'den daha kısa uzunluktaki çalıştırma bölümleri için kodlamayı gösterir:

if (EOLine == 0) (
AppendToBitStream (0, 1);
AppendToBitStream (RUNcnt, J);
if (RUNindex> 0)) (
RUNindex = RUNindex - 1;
}
else if (RUNcnt> 0)
AppendToBitStream (1, 1);

Burada kodlayıcı, rk ile gösterilen 32 girişlik J tablosunu kullanır. J değerlerle başlatılır
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15 .

Her rk değeri için rm = 2 rk olarak gösterilir. rm numaralarına (toplamda 32 adet vardır) kod sırası denir. İlk 4 rk değeri rm = 2 0 = 1'dir. İkinci dörtlü için rm = 2 1 = 2 ve sonraki dörtlü için rm = 2 2 = 4. Son sayı için rm = 2 15 = 32768. kodlayıcı, RUNlen değişkeninde saklanan serinin uzunluğunu bulmak için açıklanan prosedürü gerçekleştirir. Daha sonra bu değişken, değerleri rm sıralı sayılarına eşit olan terimlere bölünerek kodlanır. Örneğin, RUNlen = 6 ise, ilk beş rm sayısı kullanılarak 6 = 1 + 1 + 1 + 1 + 2 olarak temsil edilir. 5 bit kullanılarak kodlanmıştır. AppendToBitStream(l,l) komutu ile yazma işlemi yapılır. Her 1 yazıldığında, karşılık gelen rm değeri RUNlen'den çıkarılır. RUNlen başlangıçta 6'ya eşitse, sırayla 5, 4, 3, 2 ve 0'a düşer.

RUNlen serisinin uzunluğu, rm sayılarının tamsayı toplamına eşit olmayabilir. Örneğin, RUNlen = 7. Bu durumda, beş bit 1 bir kod olarak yazılır, ardından bir önek biti ve dosyaya bir dizi rk biti olarak yazılacak olan RUNlen'in geri kalanı (örneğimizde bu 1'dir) (geçerli değer) yazılır. Örneğimizdeki rk sayısı 2)'dir. Bu son işlem AppendToBitStream (RUNcnt, J) çağrılarak gerçekleştirilir. Seri, satırdaki başka bir piksel tarafından kesilirse önek biti 0'dır. Dizi satırın sonuna giderse, önek biti 1'dir.

Kodlayıcının ikinci ana görevi olan çoğuşma kesme pikselini kodlamak, mevcut pikseli kodlamakla aynı şekilde yapılır. Uygulamasının ayrıntılarını tartışalım.

Bir piksel satırının sonunda kodlama işleminin kesintiye uğradığı bir durumu düşünün: kesintiye neden olan yeni piksel nasıl kodlanacak? Bu sorun, mevcut x konumundaki Ix değeri ile a veya b piksellerinin yeniden oluşturulmuş değeri arasındaki farkın kodlanmasıyla çözülür (bunların x'e göre komşu pikseller olduğunu hatırlayın - bkz. Şekil 23). Bu durumda iki farklı durum göz önünde bulundurulur: birincisi abs olduğunda (Ra - Rb)<= NEAR , вторая - в противном случае. По сути кодирование пикселя прерывания серии происходит теми же методами, что и кодирование нового пикселя в регулярной моде с тем лишь дополнением, что Ix должно отличаться от Ra на величину большую NEAR, иначе ход кодирования будет продолжен. Опишем операции, которые должны быть выполнены:

if (mutlak (Ra - Rb)<= NEAR)
RItipi = 1;
Başka
RItipi = 0;
if (RItype == 1)
P = Ra;
Başka
P = Rb;
Errval = Ix - Rb;

Yukarıdaki kod parçacığı, piksel x için RI türünü ve tahmin hatasını tanımlar. Ardından, gerekirse Errval'in işaretini değiştirin ve "neredeyse kayıpsız" seçeneği için tahmin hatasını da niceleyin:

if ((RItype == 0) && (Ra> Rb)) (
Errval = -Errval;
İŞARET = -1;
Başka
İŞARET = 1;
eğer (YAKIN> 0) (
Errval = Niceleme (Errval);
Rx = ComputeRx ();
}
Başka
Rx = Ix;
Errval = ModRange (Errval, RANGE);

Şimdi Golomb kodlarında k parametresini hesaplamak için kullanılacak olan yardımcı değişken TEMP'yi hesaplayalım.

if (RItype == 0)
SICAKLIK = A;
Başka
SICAKLIK = A + (N >> 1);

Q = RItype + 365 olarak ayarlayın. Golomb kodları için k parametresi şu şekilde hesaplanacaktır: for (k = 0; (N [Q]<

eğer (Errval< 0) {
Nn [Q] = Nn [Q] + 1;
A [Q] = A [Q] + ((EMErrval + 1 -RItype) >> 1);
if (N [Q] == RESET) (
A [Q] = A [Q] >> 1;
N [Q] = N [Q] >> 1;
Nn [Q] = Nn [Q] >> 1;
}
N [Q] = N [Q] + 1;

Bu, JPEG-LS kodlayıcısının açıklamasını tamamlar. Kesinlikle eksik olduğuna dikkat edin, ancak kendimize bu yöntemin standardını kopyalama hedefini koymadık. Atlanan tüm ayrıntılar standartta bulunabilir. Şimdi dekoderin çalışma prensiplerinin kısa bir açıklamasına geçelim.

3.3. kod çözücü

Daha önce de belirtildiği gibi, JPEG-LS yöntemi neredeyse simetriktir, bu nedenle kodlayıcı açıklamasını küçük değişikliklerle kopyalamayacağız - bu bilgi standartta da okunabilir. Seri biçimde kod çözmenin nasıl gerçekleştiği üzerinde duralım. Geçerli piksel için tüm değerler hesaplandıktan sonra, bit akışından yeni bir R biti okunur. 1'e eşitse, o zaman:

  1. Resim 2 J ile tamamlanmıştır |RUNindex | Ra değerine sahip pikseller.
  2. Önceki adımda görüntü zaten 2 J |RUNindex | pikseller ve RUNindex< 31, то RUNindex увеличивается на 1. Если последний пиксель в строке ещё не декодирован, то мы снова считываем биты, в противном случае переходим к вычислению всех требуемых величин.

Bit 0 ise, o zaman:

  1. J Okuma |RUNindex | bit akışından bit ve bir sayıya dönüştürülür ve görüntü, hesaplanan sayıya karşılık gelen miktarda Ra değerlerine sahip piksellerle desteklenir.
  2. RUNindex> 0 ise, RUNindex 1 azaltılır.
  3. Burst interrupt pikselinin kodu çözülür ve gerekli tüm değerler tekrar hesaplanır.

3.4. Dosya formatı

sıkıştırılmış dosya oluşur:

  • Golomb kodlarını ve çalışma uzunluklarını içeren veri bölümlerinden;
  • işaretleyici segmentlerinden (kod çözücünün gerektirdiği bilgiler);
  • "dinlenme" işaretçileri bölümünden (bazı ayrılmış JPEG işaretçileri).

Burada bir işaretçiyi bir bayt olarak adlandırırız, ardından yeni bir bölümün başlangıcını işaret eden özel bir kod gelir. İşaretçiyi, en anlamlı biti 1'e eşit olan bir bayt izliyorsa, bu bayt, işaretleyici segmentinin başlangıcıdır. Aksi takdirde, bir veri segmenti başlar.

3.5. Golomb kodları

Golomb kodlarından bir kereden fazla bahsetmiştik. Nedir? Negatif olmayan bir tamsayı Golomb kodu "etkili bir Huffman kodu olabilir." Bazı b parametresinin seçimine bağlıdır. Kodlama prensibi aşağıdaki gibidir:

  • iki miktar hesaplanır
    q = kat ((n - 1) / b) ve
    r = n - qb - 1;
  • kod iki kısımdan oluşur: ilk kısım tekli bir kodda q, ikinci kısım r için küçük artıklar için kat (log 2 b) bitleri ve büyük için tavan (log 2 b) bitlerinden oluşan ikili bir ifadedir. olanlar.

JPEG-LS'de Golomb kodlarının kullanımı için matematiksel bir gerekçe sağlamıyoruz, sadece girdi veri akışı tam sayılardan oluşuyorsa ve n sayısının olasılığının P (n) = (1 - p) n olduğunu not ediyoruz. - 1 p (0<= p <= 1) , то коды Голомба будут оптимальными кодами для этого потока данных, если выбрать параметр b следующим образом:
(1 - p) b + (1 - p) b + 1<= 1 <= (1 - p) b - 1 + (1 - p) b .

3.6. Çözüm

JPEG-LS formatı öncelikle görüntüleri tıbbi amaçlarla, yani en ufak bir kalite kaybı olmadan büyük bir görüntüye sahip olmanın önemli olduğu durumlarda saklamak için geliştirilmiştir. Daha önce de belirtildiği gibi, HP Labs duvarları içinde geliştirilen LOCO-I formatı temel alınmıştır. Ardından "HP" ve "Mitsubishi"nin ortak çabalarıyla sonuçlandırıldı. Her iki şirket de bu format için patentlerinin lisans ödemeden kullanılmasına izin verdi, bu nedenle JPEG-LS normal PC programlarında da bulunabilir.

Kendi örneğimle açıklayayım. Belki bazı şeyleri anlamama yardım edebilirsin. Önüme kendim koyduğum görev şu şekildedir. Çerçeveyi (komutta) WEB kameradan cep telefonu belleğine aktarın ve ardından başka bir cep telefonuna aktarın. Hangi formatın yedeklenmesi gerektiği, algoritmanın kullanılabilirliği makalenizden net değil. Ayrıca - sinüs dönüşümü - sadece yüzeysel bir yorum, ancak belirli bir örnekle ayrıntılı bir algoritmaya nereden bakabilirim (mesela matematiksel analizi öğretin, ancak neredeyse hiç belirli örnek yok ve varsa, tüm hesaplama parçaları atlanır) .Belki belirli bir kılavuz vardır, bu yüzden bakın. Dosya organizasyonunun yapısı tamamen atıldı ve hatta hiçbir bağlantı belirtilmedi. "Sonuçtaki matriste, düşük frekanslı bileşenler sol üst köşeye daha yakın yerleştirilmiş ve yüksek frekanslı bileşenler sağa ve aşağı kaydırılır", bana öyle geliyor ki, bu şekilde yapılıyor, ancak işe yaramıyor (belki yanılıyorum!).

Soru: Bir JPG çerçevesinden nasıl yakalanır, örneğin, PC kullanmadan, MK kullanarak telefon ekranının çözünürlüğünde daha fazla kod çözme için yalnızca gerekli bilgiler. Çerçevenin siyah beyaz versiyonu yeterlidir. Hangi FFxx'e dikkat etmelisiniz ve sadece bu bilgileri kaydetmelisiniz. Bir WEB kamerasının çerçeve yapısı nereden alınır. Sorunun karmaşık ve çok yönlü olduğunu anlıyorum. Örneğin, MK'de çerçevenin kodunu çözemez ve ardından gerekli çözünürlükle sıkıştıramazsınız, ancak muhtemelen en azından üst köşeyi gerekli formatta kesebilirsiniz.

Bilgi için minnettar olurum.

Ne yapabilirim = VB, MK'da programlayın. Birkaç röle ile bir cep telefonu üzerinde bağımsız işletim etkileşimli kontrol geliştirme, bir cep telefonu kullanarak ses kontrolü.

>> İkinci adım, doğrudan >> tekrar kodlama algoritmasını (LZW) uygulamaktır.

belki RLE?

Tabii ki, bu adımda JPEG (bağlama bakın) RLE'dir. Bir hata bulduğunuz için teşekkür ederiz.

2000*1000 piksellik sıkıştırılmamış tam renkli bir görüntünün yaklaşık 6 megabayt boyutunda olacağını hesaplamak kolaydır. Profesyonel kameralardan veya yüksek çözünürlüklü tarayıcılardan elde edilen görüntülerden bahsedersek, boyutları daha da büyük olabilir. Depolama kapasitesindeki hızlı büyümeye rağmen, çeşitli görüntü sıkıştırma algoritmaları hala çok önemlidir.
Mevcut tüm algoritmalar iki büyük sınıfa ayrılabilir:

  • Kayıpsız sıkıştırma algoritmaları;
  • Kayıplı sıkıştırma algoritmaları.
Kayıpsız sıkıştırma hakkında konuştuğumuzda, sıkıştırma algoritmasının tam tersi olan ve orijinal görüntüyü doğru bir şekilde geri yüklemenizi sağlayan bir algoritma olduğunu kastediyoruz. Kayıplı sıkıştırma algoritmaları için ters algoritma yoktur. Orijinaliyle tam olarak eşleşmeyen bir görüntüyü geri yükleyen bir algoritma vardır. Sıkıştırma ve kurtarma algoritmaları, görüntünün görsel kalitesini korurken yüksek sıkıştırma oranı elde etmek için seçilir.

Kayıpsız sıkıştırma algoritmaları

RLE algoritması
RLE serisindeki tüm algoritmalar çok basit bir fikre dayanmaktadır: tekrar eden eleman grupları bir çift ile değiştirilir (tekrar sayısı, tekrar eden eleman). Örnek olarak bir bit dizisi kullanan bu algoritmayı ele alalım. Bu sırada, sıfırlar ve birler grupları değişecektir. Ayrıca, gruplar genellikle birden fazla öğeye sahip olacaktır. Daha sonra 11111 000000 11111111 00 dizisi aşağıdaki 5 6 8 2 sayı grubuna karşılık gelecektir. Bu sayılar tekrar sayısını gösterir (sayma birlerden başlar), ancak bu sayıların da kodlanması gerekir. Tekrar sayısının 0 ile 7 arasında olduğunu varsayacağız (yani tekrar sayısını kodlamamız için 3 bit yeterlidir). Daha sonra yukarıdaki dizi, aşağıdaki sayı dizisi 5 6 7 0 1 2 ile kodlanır. Orijinal diziyi kodlamak için 21 bitin gerekli olduğunu hesaplamak kolaydır ve RLE-sıkıştırılmış biçimde bu dizi 18 bit alır.
Bu algoritma çok basit olmasına rağmen, etkinliği nispeten düşüktür. Ayrıca bazı durumlarda bu algoritmanın kullanılması dizinin uzunluğunda bir azalmaya değil, bir artışa yol açmaktadır. Örneğin, aşağıdaki 111 0000 11111111 00 dizisini göz önünde bulundurun. Karşılık gelen RL dizisi şöyle görünür: 3 4 7 0 1 2. Orijinal dizinin uzunluğu 17 bit, sıkıştırılmış dizinin uzunluğu 18 bittir.
Bu algoritma en çok siyah beyaz görüntüler için etkilidir. Ayrıca, daha karmaşık algoritmaların sıkıştırılmasının ara aşamalarından biri olarak sıklıkla kullanılır.

Sözlük algoritmaları

Sözlük algoritmalarının arkasındaki fikir, orijinal dizideki öğe dizilerinin kodlanmasıdır. Bu kodlamada, orijinal diziden elde edilen özel bir sözlük kullanılır.
Bütün bir kelime algoritması ailesi var, ancak geliştiricileri Lepel, Ziv ve Welch'in adını taşıyan en yaygın LZW algoritmasına bakacağız.
Bu algoritmadaki sözlük, algoritma çalışırken kodlama dizeleriyle dolu bir tablodur. Sıkıştırılmış kodun kodunu çözerken, sözlük otomatik olarak geri yüklenir, bu nedenle sözlüğü sıkıştırılmış kodla birlikte aktarmaya gerek yoktur.
Sözlük, tüm tekil dizelerle başlatılır, yani. sözlüğün ilk satırları kodlama yaptığımız alfabeyi temsil eder. Sıkıştırma, sözlüğe önceden yazılmış en uzun zinciri arar. Sözlüğe henüz yazılmamış bir dizeyle her karşılaşıldığında, oraya eklenir ve sözlükte önceden yazılmış dizeye karşılık gelen sıkıştırılmış bir kod çıkar. Teoride, sözlüğün boyutuna herhangi bir kısıtlama getirilmez, ancak pratikte bu boyutu sınırlamak mantıklıdır, çünkü zamanla artık metinde bulunmayan zincirler oluşmaya başlar. Ayrıca tablonun boyutu iki katına çıktığında, sıkıştırılmış kodları depolamak için fazladan bir bit ayırmamız gerekir. Bu gibi durumlardan kaçınmak için, tablonun tüm tekil dizeler tarafından başlatılmasını simgeleyen özel bir kod tanıtıldı.
Algoritma tarafından yapılan bir sıkıştırma örneğini ele alalım. Guguk kuşu ipini sıkacağız, guguk kuşu, guguk kukuleta aldı. Sözlüğün 32 konum içereceğini varsayalım, bu da kodlarının her birinin 5 bit alacağı anlamına gelir. Başlangıçta, sözlük şu şekilde doldurulur:

Bu tablo hem bilgiyi sıkıştıranın hem de paketi açanın yanındadır. Şimdi sıkıştırma işlemine bakacağız.

Tablo, sözlüğü doldurma sürecini göstermektedir. Ortaya çıkan sıkıştırılmış kodun 105 bit aldığını ve orijinal metnin (bir karakteri kodlamak için 4 bit harcadığımızı varsayarak) 116 bit aldığını hesaplamak kolaydır.
Aslında, kod çözme işlemi, kodların doğrudan şifresinin çözülmesine indirgenirken, tablonun kodlama sırasındakiyle aynı şekilde başlatılması önemlidir. Şimdi kod çözme algoritmasına bakalım.


Sözlüğe eklenen dizgiyi i-inci adımda tam olarak sadece i+1'de tanımlayabiliriz. Açıkçası, i-inci satır, satırın ilk karakteri i + 1 ile bitmelidir. O. az önce bir sözlüğü nasıl geri yükleyeceğinizi bulduk. cScSc biçimindeki bir dizinin kodlandığı, burada c'nin bir karakter ve S'nin bir dize olduğu ve cS kelimesinin zaten sözlükte olduğu durum biraz ilgi çekicidir. İlk bakışta, kod çözücü bu durumu çözemeyecek gibi görünebilir, ancak aslında bu türdeki tüm satırlar her zaman başladıkları karakterle bitmelidir.

Entropi kodlama algoritmaları
Bu dizideki algoritmalar, en sık kullanılan dizi öğelerine en kısa sıkıştırılmış kodu atar. Onlar. aynı uzunluktaki diziler, farklı uzunluktaki sıkıştırılmış kodlarla kodlanmıştır. Ayrıca, sıralama ne kadar sık ​​gerçekleşirse, karşılık gelen sıkıştırılmış kod o kadar kısa olur.
Huffman algoritması
Huffman'ın algoritması, önek kodları oluşturmanıza olanak tanır. Önek kodlarını bir ikili ağaç üzerindeki yollar olarak düşünebilirsiniz: Bir düğümden sol oğluna geçiş, kodda 0'a ve sağ oğluna - 1'e karşılık gelir. Ağacın yapraklarını kodlanmış karakterlerle işaretlersek, önek kodunun ikili ağaç gösterimini alın.
Bir Huffman ağacı oluşturmak ve Huffman kodlarını elde etmek için bir algoritma tanımlayalım.
  1. Giriş alfabesindeki karakterler, serbest düğümlerin bir listesini oluşturur. Her sayfa, sembolün oluşma sıklığına eşit bir ağırlığa sahiptir.
  2. Ağacın en az ağırlığa sahip iki serbest düğümü seçilir
  3. Ebeveynleri, toplam ağırlıklarına eşit bir ağırlıkla yaratılmıştır.
  4. Ebeveyn, ücretsiz düğümler listesine eklenir ve iki çocuğu bu listeden çıkarılır.
  5. Ebeveynden ayrılan bir yay bit 1'e atanır, diğerine - bit 0
  6. İkinciden başlayan adımlar, boş listede yalnızca bir boş düğüm kalana kadar tekrarlanır. Ağacın kökü olarak kabul edilecek.
Bu algoritmayı kullanarak, belirli bir alfabe için Huffman kodlarını, karakterlerin oluşma sıklığını hesaba katarak elde edebiliriz.
aritmetik kodlama
Aritmetik kodlama algoritmaları, eleman dizilerini kesirlere kodlar. Bu, elemanların frekans dağılımını hesaba katar. Şu anda aritmetik kodlama algoritmaları patentlerle korunmaktadır, bu nedenle sadece temel fikri ele alacağız.
Alfabemiz N adet a1,…, aN sembolünden oluşsun ve bunların oluşum frekansları sırasıyla p1,…, pN olsun. Yarım aralığı bölelim)