Professional Documents
Culture Documents
EGE ÜNİVERSİTESİ
Volkan ARIKAN
İzmir-2021
ii
i
ii
27/09/2021
İmzası
Volkan ARIKAN
iii
ÖZET
ARIKAN, Volkan
Günümüzde hergün yeni bir bilginin ortaya çıktığı bilinmektedir. Bu ortaya çıkan
bilgilerin birçoğu dijital ortamlarda saklanmaktadır. Bu da depolama problemini ortaya
çıkarmaktadır. Sadece depolama alanı değil verilerin transferlerinde de büyük verilerin
gönderilmesi sorun oluşturmaktadır. Bu tür sebeplerden dolayı verilerin sıkıştırılmasına
ihtiyaç vardır.
Bu tezde depolama problemlerine çözüm yolu olan veri sıkıştırma tekniklerini analiz
etmek amaçlanmıştır. Karakter, görüntü olmak üzere birçok alanda teknikler ele alınmıştır. Bu
teknikler örneklerle açıklanmış, kıyaslamalar yapılmıştır.
Anahtar Kelimeler: Veri sıkıştırma, Karakter Tipli Sıkıştırma Teknikleri, Sözlük Tabanlı
Sıkıştırma Teknikleri, Huffman Kodlaması, Görüntü Sıkıştırma Teknikleri.
iv
ABSTRACT
ARIKAN, Volkan
Today, it is known that new information emerges every day. Much of this emerging
information is stored in digital media. This raises the storage problem. Sending big data is a
problem not only in storage but also in data transfers. For such reasons, there is a need for
data compression.
Data compression has advantages and disadvantages. Besides the advantages, the
disadvantages are too few to be overlooked. Because it is also due to technical reasons.
In this thesis, it is aimed to analyze data compression techniques, which are a solution to
storage problems. Techniques in many areas such as character, image are discussed. These
techniques are explained with examples and comparisons are made.
ÖNSÖZ
Bu çalışma konusunu seçerken bilgi yoğunluğunun ortaya çıkması ve bunun için bir
çözüm bulunması gerektiği düşünülerek; kıymetli ve değerli hocam Prof. Dr. Urfat Nuriyev’in
yönlendirmesi sonucu bu konu hakkında çalışma olanağım ortaya çıkmıştır.
Konu hakkında daha verimli bir teknik ortaya koyabilmek için farklı yöntemler analiz
edilmiş ve hesaplama denemeleri yapılmıştır.
Hergün yeni bir bilginin çıktığı günümüz dünyasında bu alanın giderek daha çok önem
kazanacağı fikrindeyim. Dijital ortamların alanlarını genişletmek için iletişimin daha da hız
kazanması için araştırılıp veri sıkıştırma tekniklerinin daha verimli olması gerekmektedir.
İZMİR
İÇİNDEKİLER
Sayfa
İç Kapak
Özet……………………………………………………………………………………………ⅲ
Abstract………………………………………………………………………………………..ⅳ
Önsöz…………………………………………………………………………………………..ⅴ
İçindekiler……………………………………………………………………………………..ⅵ
Şekiller Dizini…………………………………………………………………………………ⅸ
GİRİŞ………………………………………………………………………...………………...1
1. VERİ SIKIŞTIRMA……………………………………………………..…………….........2
2.1 Entropi……………………………………………………………………………………...4
İÇİNDEKİLER(DEVAM)
3.1.3 Shannon-Fano…………………………………………….…………………………….17
3.2.1 Lz – 77……………………………………………………….…………………………22
3.2.2 Lz – 78………………………………………………………..………………………...25
3.2.3 Lwz……………………………………………………………………………………...28
4.3.2 JPEG…………………………………………………….………………………………41
4.3.4 JPEG2000………………………………………………………….……………………50
viii
İÇİNDEKİLER(DEVAM)
SONUÇ……………………………………………………………………………………….54
KAYNAKLAR……………………………………………………………………………….55
TEŞEKKÜR…………………………………………………………………………………..57
ÖZGEÇMİŞ…………………………………………………………………………………..58
ix
ŞEKİLLER DİZİNİ
Şekil Sayfa
Şekil 3.1 Frekans olasılıklarına göre sıralanmış asfasrass kelimesindeki dört karakter ……..13
ŞEKİLLER DİZİNİ(DEVAM)
Şekil 4.4 0 (siyah) ile 255 (beyaz) arasındaki yoğunluk değerleri aralığı…………………....36
Şekil 4.6 Resmin sol alt 15 x 15 piksel bölümünün piksel yoğunluğu değerleri……………..37
Şekil 4.21 Blok satırı 4, blok sütun 28'de piksel yoğunluğu değerleri 127'den az…………...42
xi
ŞEKİLLER DİZİNİ(DEVAM)
ŞEKİLLER DİZİNİ(DEVAM)
Şekil 4.54……………………………………………………………………………………..50
Şekil 4.55..……………………………………………………………………………………51
Şekil 4.56……………………………………………………………………………………..51
SİMGELER VE KISALTMALAR
GİRİŞ
Bir depolama alanını verimli kullanmak önemlidir. Küçük bir alana daha çok veri
koyabilmek veri sıkıştırmanın ne kadar önemli olduğunu ortaya koymaktadır. Bu yüzden
tezimizde kısaca aşağıda gibi bir çalışma yapılmıştır.
3. Bölümde ise karakter tipli teknikler iki ayrı şekilde olasılık tabanlı ve sözlük tabanlı
teknikler olarak incelenecek, olasılık tabanlı tekniklerde veri sıkıştırma için önemli olan
Huffman kodlaması detaylı olarak açıklanacaktır.
Tezin sonraki bölümünde ise elde edilen sonuçlardan özet olarak bahsedilmiştir.
1. VERİ SIKIŞTIRMA
Veri sıkıştırma, bilgisayardaki veya belleği olan herhangi bir elektronik cihazdaki verilerin
daha az yer kaplaması amacıyla sıkıştırılması anlamına gelir. Veri sıkıştırma, sözcüklere veya
bit dizilerine, içerdiği bilgiyi kaybetmeden daha kısa yeni bit dizileri (kod) atanmasına
dayanır; diğer bir deyişle veriye aynı bilgiyi içerecek biçimde daha kısa kodlar verilmesidir.
Kısa kodlar verme işlemi de verideki fazlalıkların bulunmasına ve bunların azaltılması
ilkesine dayanır. Sayısal ortamlarda saklanan verilerin ne tür olursa olsun en azından bir tür
fazlalık içerdiği görülmektedir. Bu fazlalık karakter tekrarı bazı karakterlerin daha sık
kullanılması vs. şeklinde olabilmektedir. Veri sıkıştırma teknikleri de, veri içindeki
fazlalıkları azaltmak üzere geliştirilmiş algoritmalardır. (Çölkesen, R., 2014)
Bellekte tutulan bir metin dosyası, görüntü dosyası, makine kodu barındıran bir program
dosyası, günümüzde kullanılan kodlama tekniklerinden dolayı, içerdiği bilgiden çok daha
fazla yer tutar; bu dosyalar, kayıpsız bir sıkıştırma yani içerdiği bilgiyi değiştirmeden veya
çok az kayba uğratılarak, fazlalıkların atılmasıyla daha az yer tutacak şekilde kodlanabilir.
(Çölkesen, R., 2014)
Veri sıkıştırma, aslında bilginin saklama/kodlama düzeni olan veri yapısının değiştirilmesidir.
Dolayısıyla veri yapıları konusu içerisinde önemli bir yer tutar; bazı metin tabanlı
verileri %60-70 oranında sıkıştırabildiği görülmektedir. Dolayısıyla saklama birimleri
sığasından veya veri haberleşmesi kanalı band genişliğinden önemli ölçüde tasarruf edilmesi
sağlanmaktadır.
Veri sıkıştırma teknikleri genel olarak kayıplı ve kayıpsız teknikler olarak iki sınıf altında
toplanırlar. Kayıplı sıkıştırma tekniğine göre sıkıştırma algoritmaları orijinal veriye dönülüp
dönülememesine göre ikiye ayrılır. (Çölkesen, R., 2014)
Birçok uygulamada, tam olarak yeniden yapılandırma eksikliği bir problem değildir. Örneğin,
konuşma kaydederken veya iletirken, her bir konuşma örneğinin tam değeri gerekli değildir.
Konuşmanın gerektirdiği kaliteye bağlı olarak, yeniden yapılandırılmış konuşmada her bir
örneğin değeri hakkında çeşitli bilgi kaybı gözardı edilebilir. Yeniden yapılandırılmış
konuşmanın kalitesi telefonda duyulana benzer olacak olursa, önemli miktarda bilgi kaybı
tolere edilebilir. Bununla beraber, yeniden yapılandırılmış konuşman eğer kompakt bir disk
üzerinde duyulan kalitede yapılması isteniyorsa, gözardı edilebilecek bilgi kaybı miktarı çok
daha düşüktür.
Benzer şekilde, bir video dizisinin yeniden inşasını izlerken, yeniden inşasının orijinalden
farklı olması, farklılıklar can sıkıcı eserlerle sonuçlanmadığı sürece genellikle önemli değildir.
Böylece, videolar genellikle kayıplı sıkıştırma kullanılarak sıkıştırılır.
3
Kayıpsız veri sıkıştırma bazı veri sıkıştırma tekniklerini kullanarak varolan özgün veriyi
sıkıştırılmış veri olarak yeniden oluşturma işlemidir. Kayıpsız sıkıştırma demek herhangi bir
kalitesinde eksiklik veya veri kaybı olmadan orijinal veriyi tekrar elde edilerek yapılan
sıkıştırmadır. Veriler kayıpsız sıkıştırılmışsa, orijinal veriler tam olarak sıkıştırılmış
verilerden kurtarılabilir. Kayıpsız sıkıştırma, genel olarak orijinal ve yeniden yapılandırılmış
veriler arasındaki herhangi bir farkı gözardı etmeyen uygulamalar için kullanılır. Eğer hedef
kalitede düzgünlük veya geriye aynı şekilde dönüştürebilme değilse kayıplı veri
sıkıştırma yöntemi de kullanılabilir.
Kayıpsız sıkıştırma metin sıkıştırma da önemli bir yer tutar. Yeniden yapılanacak verinin aynı
anlamlarda olması çok önemlidir. " Para gönderme " (Do not send money) ve "Şimdi para
gönder" ("Do now send Money ") cümlelerini düşünün. Benzer bir argüman, bilgisayar
dosyaları ve banka kayıtları gibi belirli veri türleri için de geçerlidir.
Her türlü veri daha sonra daha çok bilgi elde etmek için işlenecek veya "geliştirilecek" ise,
bütünlüğün korunması önemlidir. Örneğin, radyolojik bir görüntüyü kayıplı bir biçimde
sıkıştırdığımızı ve yeniden yapılanma Y ile orijinal X arasındaki farkın görsel olarak tespit
edilemediğini varsayalım. Daha sonra geliştirilmiş ise bu görüntü, daha önce saptanamayan
farklılıklar ortaya çıkar ve radyoloğu ciddi şekilde yanıltabilecek yanlışlara neden olabilir. Bu
tür aksiliklerin bedeli bir insan hayatı olabilir, çünkü orijinalden farklı bir yeniden yapılanma
üreten bir sıkıştırma planı kullanmak konusunda çok dikkatli olunmalıdır.
Sıkıştırma gerektiren, yeniden yapılanmanın orijinal ile aynı olmasını istediğimiz birçok farklı
durum vardır. Daha çok verimli olacak bir sıkıştırma elde etmek için bu gereksinimi
azaltmanın mümkün olduğu bazı durumlar da vardır. Bu durumlarda, kayıplı sıkıştırma
tekniklerine bakmamız gerekir. (Sayood, K., 2006)
İşlenen verinin tekrar eski haline yani orijinal hale dönüştürülmesi gereken durumlarda
kullanılmak üzere düşünülmüş bir tekniktir. Örneğin yazılımda çalışabilir bir programın ya
da kaynak kodunun kayıp olmadan dönüştürülebilmesi önemlidir hatta zorunludur. Bazı resim
dosyaları, PNG ya da GIF, sadece kayıpsız veri sıkıştırma tekniğini kullanırken, bazıları,
mesela TIFF ya da PNG gibi olanlar, ise hem kayıplı hem de kayıpsız sıkıştırma tekniğini
kullanabilir. Kayıpsız sıkıştırmaya örnekler: Huffman kodlaması, LZW sıkıştırması
4
Tezin bu kısmında temel kavramlara yer verilmiştir. Örneklerle detaylı bir şekilde
açıklanmıştır.
2.1 Entropi
Herhangi bir sistemin düzensizliğini ifade eden terime verilen isimdir. Örnek olarak entropi
terimini bir para atma yani yazı tura atma işlemi olarak 1 bitlik (ikil) ve %50 ihtimallik bir
değer olarak görebiliriz. Burada paranın hilesiz olduğunu ve yazı tura işleminin doğru bir
şekilde gerçekleştiğini varsayıyoruz. Şayet para hileli ise sistemin entropisi değişecektir.
Üretilen sayıların entropisi %50’den daha düşük olacaktır. Çünkü daha az düzensizlik vardır.
Yani hileli olan yazı veya tura hangisi ise o tarafa doğru daha düzenli sonuç üretilecektir.
Daima sürekli yazı gelen bir parayı düşünürsek ürettiği sayıların entropisi 0 olacaktır.
Bu terim ilk kez ortaya shannon tarafından bilgisayar bilimlerinde verilerin iletişiminde
kullanılmıştır. Dolayısıyla literatürdeki isimlendirmesinde Shannon Entropisi olarak da
geçmektedir. Bir mesajı kodlamak için gereken en kısa olasılıkların ortalama değeri aynı
zamanda alfabedeki tüm sembollerin logaritması entropi değeri olur. Yani açıklayacak olursak
alfabemizde 256 karakter var olduğundan ve logaritması (log256 = 8) mesajın entropisine
böleriz. Yani mesajdaki değerler ne kadar fazla ise o kadar fazla kodlamaya ihtiyaç
duyulacaktır. Diğer bir ifade ile söyleyecek olursak alfabemiz 256 karakter var ise ama biz
sadece bir karakter yolluyorsak o zaman entropi 0 olduğundan 0/256 = 0 farklı kodlamaya (0
bite) ihtiyaç duyacağızdır. Ya da benzer şekilde her harften aynı sıklıkta yolluyorsak bu
durumda 256 /8 = 8 bitlik kodlamaya ihtiyacımız olur.
Bilgisayar bilimleri açısından daha güzel bir tanım yapmak istersek elimizdeki veriyi kaç bit
ile kodlayabileceğimiz ifadesine entropi adı verilir. Örneğin ilkbahar ve yazda bulunan ayları
kodlamak için kaç ikili bite ihtiyacımız olduğunu bakalım.
000 Mart
001 Nisan
010 Mayıs
011 Haziran
100 Temmuz
101 Ağustos
Gördüğümüz üzere her ay için farklı bir bilgi girişi yapılmış ve girilen 6 ay için 3 bit yeterli
olmuştur. Dolayısıyla yılın 2 mevsimdeki ayların entropisi 3 olur.
ve = 2.58 olmaktadır. 0.58 gibi bir bit olmadığı gerekçesiyle yani 3 bite ihtiyaç
olduğunu söyleyebiliriz.
Yukarıdaki örnek için bellekte 6 karakterlik bir karakter alanı tutmak çok gereksiz bir
durumdur. Çünkü entropi bilgisi 3 bitlik bir yerin yeterli olduğunu söylemektedir. 6
karakterlik bilgi için ASCII kod tablosuna göre 6*8 = 48 bitlik alan olması gerekirken 3*6
dan 18 bit yeterli olur. (Şeker, Ş.E., 2008)
Bu durumda entropi ile ortalama mesaj boyutu arasında aşağıdaki formüldeki gibi bir
eşitsizlik ortaya çıkar.
H≤ S ≤
2.3 Tekrarlanma
Tekrarlanma, ortalama mesaj boyutu ile entropi arasındaki fark olarak gösterilmiştir. (Shanner
ve Weaver, 1949). Tekrarlanmaki eşitlik aşağıdaki formüldeki gibi gösterilir. (Diri B., 1999)
R=-H+S
Sıkıştırma oranı, çıktı bilgisi boyutunun, girdi bilgisi boyutuna oranı olarak aşağıdaki
formüldeki gösterilir.
Örneğin sıkıştırma oranının %70 olarak gerçekleştirildiği bir sıkıştırmada, 100 birim
boyutundaki bir metin dizisi, sıkıştırma sonunda %70 birime düşmüş demektir. Bir metnin
sıkıştırılmış hali orijinalinden büyükse bu işlem "genişletme" ismini alır. Bu durumda p>1
olacaktır. (Diri B., 1999)
Sıkıştırma faktörü, sıkıştırma oranının tam aksi yöndeki işlemi ifade eder. Formül aşağıdaki
gibi temsil edilir. (Diri B., 1999)
v=1/p
6
Sıkıştırma sonunda elde edilen başarı yani sıkıştırma oranında kazanılan durum, sıkıştırma
verimi olarak aşağıdaki formüldeki gibi temsil edilir. (Diri B., 1999)
ղ=100*(1-p)
∑ (2.1)
(2.1)' deki eşitsizlik entropi ile ilişkilendirildiğinde ise Li ’nin kod boyutu (2.2)'deki gibi ifade
edilir.
Li=- (2.2)
Daha sonra ise buradaki durum Ei ,Li ’nin entropi ’den büyük kısmı olup,
olarak yazılır.
Özel bir durum olarak tüm fazla uzunlukların hepsini eşit olduğunu kabul edersek (Ei=E)
olarak alındığında Kraft eşitsizliği
∑ (∑ ) ⇒ ⇒
olur. Benzersiz yani tek çözümü olan, kod negatif olmayan ekstra uzunluğa sahip, kodun
boyutu entropi ile tanımlanan uzunluğa eşit veya daha fazla olacak demektir.
7
İstatistiksel veri sıkıştırma yöntemleri, verilerde daha sık görünen sembollere veya sembol
gruplarına atanan daha kısa kodlarla (daha yüksek bir gerçekleşme olasılığına sahip olan)
değişken uzunluklu kodlar kullanır. Değişken uzunluklu kodların tasarımcıları ve
uygulayıcıları, açık bir şekilde kodu çözülebilen kodların atanması ve minimum ortalama
boyuta sahip kodların atanması şeklindeki iki problemle uğraşmak zorundadır. Tezin bu
bölümünde Shannon-Fano, Huffman ve aritmetik kodlama gibi istatistiksel veri sıkıştırma
tekniklerine ayrılmıştır. Bilgi teorisi tarafından kullanılan ilkeleri ve önemli terimleri,
özellikle de artıklık ve entropi terimleri istatistiksel veri sıkıştırmasının daha derinden
anlaşılmasına yol açar ve ayrıca çeşitli yöntemlerle fazlalığın nasıl azaltıldığını ve hatta
ortadan kaldırıldığını hesaplamayı mümkün kılar. (Salomon, D. ve Motta, G., 2010)
1951 yılında David Albert Huffman tarafından geliştirilen ve ortaya atılan kayıpsız sıkıştırma
algoritmasıdır. Huffman kodlaması tekniği Shanno - Fano'ya benzer bir tekniktir. (Diri B.,
1999)
Veri sıkıştırma algoritmaları genel olarak iki kategoride incelenir. Bunlar, iki başlık şeklinde
kayıplı ve kayıpsız sıkıştırma algoritmalarıdır. Kayıplı algoritmalarda sıkıştırılan veriden
orijinal yani asıl veriye ulaşılamazken kayıpsız sıkıştırma algoritmalarında sıkıştırılmış
veriden orijinal yani asıl verimize ulaşırız. Kayıpsız veri sıkıştırmada durum diğerine göre çok
farklıdır. Bu tekniklerde önemli olan orijinal verilerin aynen olduğu gibi sıkıştırılmış veriden
elde edilebilmesidir. Bu teknikler daha çok metin şeklindeki verilerin sıkıştırılmasında
kullanılır çünkü bir metin dosyasını sıkıştırdıktan sonra metindeki bazı cümlelerin kaybolması
iyi olmaz ve istenmediği için metin sıkıştırmada bu yöntemler kullanılır. Bu yazının konusu
olan Huffman sıkıştırma algoritması da buna çok güzel en önemli örnek olarak gösterilebilir.
Bu sebeple bu yöntemin en elverişli olduğu veriler metin tipli olan verilerdir.
Kısaca, Huffman algoritması, bir veri kümesinde daha çok rastlanan karakteri daha düşük
boyuttaki kodlarla, daha az rastlanan karakterleri daha yüksek uzunluktaki kodlarla gösterilme
mantığına göre kurulmuştur. Bunun içinde veri içerisindeki her bir karakterin ne sıklıkla
geçtiği, yani kadar çok tekrar ettiği değerler için, frekans tablosu adı verilen bir tablo
içerisinde saklanır. Sıkıştırma işlemine başlamadan önce veri üzerinde gezerek bu frekans
tablosunu oluşturmak gerekir.( Schiller D., 2012, Shukla K., 2016)
Veri setindeki sembol sayısına ve bu sembollerin tekrarlama sayısına bağlı olarak %10
ile %90 arasında değişen oranlarda bir sıkıştırma elde edilebilir. Huffman tekniğinde
semboller(karakterler) ASCII’de olduğu gibi sabit uzunluktaki kodlarla kodlanmazlar. Her bir
sembol değişken sayıda uzunluktaki kod ile kodlanır.(Krajci S., Liu C., Mikes L., Moser
S.,2015 ve Schiller D., 2012, Shukla K., 2016)
Bir örnek ile gösterecek olursak: Bilgisayar sistemlerinde her bir karakter için 1 byte yani 8
bit uzunluğunda bellekte yer kaplayacak. Yani 12 karakterden oluşan bir dosya 12 byte
büyüklüğünde olacaktır. Çünkü her bir karakter 1 byte’ tır. Örneğimizdeki 12 karakterlik veri
seti “aaaaaaaaaccs” olsun. “a” karakteri çok fazla sayıda olmasına rağmen “s” karakteri bir
tanedir. Eğer bütün karakterleri 8 bit ile değil de veri kümesindeki tekrarlanmalarına göre
kodlarsak veriyi sembolize etmek için gereken bitlerin sayısı daha az olacaktır. Örneğin “a”
karakteri için “0” kodunu “s” karakteri için “10” kodunu, “c” karakteri için “11” kodunu
kullandığımızı düşünelim. Bu durumda 12 karakterlik verimizi temsil etmek için
Örnek: Beş harfli bir A={x, y, z, t, w} alfabemiz olsun ve karakterlerin bulunma olasılıkları
P(x)= 0.2, P(y)=0.4, P(z)=0.2, P(t)= 0.1, P(w)=0.1 olsun.
Ardından, hangi karakterin hangi bitlerle temsil edileceğini gösteren Huffman ağacı
oluşturulur.
Örnek:
Frekans
Harf ASCII İkili Kod Frekans
Olasılığı
a 97 01100001 3 1/3
asfasrass kelimesi , her biri 8 bit olan 9 karakterden oluşmaktadır. Bu yüzden kelimeyi
depolamak için 9*8 = 72 bite ihtiyaç vardır. Bit türünden kelimenin yazılışı:
a s f a s r a s s
Adım 1
Huffman kodlama algoritmasının anlaşılması çok basittir. Önce benzer olmayan karakterleri,
küçükten büyüğe frekans olasılığına göre sıralanır. Bu karakterlerin her birine ve frekans
olasılıklarına göre, aşağıda gösterildiği gibi dallarla bağlı bir şekilde düğümlere yerleştirilir:
13
Şekil 3.1
Adım 2
İlk önce en soldaki iki düğümü alırız ve frekansları toplayarak 0,22 yi elde ederiz. Bu iki
düğümü de içeren yeni bir düğüm elde ederiz. Elde edilen yeni düğümle beraber yeniden
düğümleri sıralayarak adımı bitiririz. Bu adımın işlemi aşağıdaki grafikte gösterilmiştir:
Şekil 3.2
Adım 3
Üçüncü adım, ikinci ile aynıdır - en soldaki iki düğümün göreceli frekanslarını topluyoruz ve
iki düğümü olan yeni bir düğüm oluşturuyoruz. Elde edilen yeni düğümleri sıralarız.Burada
elde edilen yeni düğüm daha büyük frekansa sahip olduğu için ve bu nedenle sağa doğru
kaymıştır. Bu adımın işlemi aşağıdaki grafikte gösterilmiştir:
Şekil 3.3
Adım 4
Aynı şekilde son iki adımı tekrarlayarak algoritmaya devam ederiz. Bu sefer yeni düğümün
frekansının 1 olduğunu görebiliriz. Frekansın bir olması, yeni düğümler oluşturmamıza gerek
olmadığını gösterir.
Şekil 3.4
Adım 5
Şekil 3.5
Buradan itibaren Huffman ağacından her karakter için yeni bit temsillerini kullanabiliriz. En
üstteki düğümden başlıyoruz ve istenilen karaktere ilerlerken 0'ları ve 1'leri toplayarak yeni
gösterimi oluşturuyoruz. Örneğin, bir bit gösterimi için 01110011 yerine
sadece 0 kullanırız. Aşağıdaki tablomuzda da, asfasrass kelimesi içindeki harflerin tüm yeni
bit temsilleri verilmiştir.
s 01110011 0
a 01100001 11
f 01100110 100
r 01110010 101
Her harf için Huffman kodlarını kullanarak asfasrass dizisini yeni kodlara göre yazalım.
11 0 100 11 0 101 11 0 0
a s f a s r a s s
“asrafrass” kelimesi için yazılan bit dizisi , orijinal 72 bite göre sadece 16 bit kullanırız. Bu da
bize, %75'in üzerinde bir sıkıştırma imkanı sunar. Buna göre sıkıştırma oranını hesaplarsak
“asrafrass” kelimesini temsil etmek için 16 bite ihtiyacımız olduğundan ve kelimede 9 harf
bulunduğundan, sıkıştırmayı 16/9 = 1.77 olarak buluruz. Bu da bize kelimenin her bir
karakteri için 1,77 bit saklama alanına ihtiyacmız olduğunu söyler.
Sıkıştırılmış olarak verilen bir huffman kod dizisininin orijinalini bulmak kolaydır. Huffman
ağacındaki her karakter için düğümlerin bir tek dal olmasıdır. Karakter düğümlerinde ardışık
olarak dallar olamayacağından, her karakter için yeni bir bit dizisi ile temsil edilmiştir. Bu da
bize her harakterin tekil bir kodu olduğunu söyler. Bu yüzden, sözlüğe ve huffman kodlu bit
dizisi elimizde bulunuyorsa, asıl karakterleri elde edebiliriz.
a 00
r 11
s 100
k 101
1 ile başlayalım. Hiçbir karakterimiz 1 ile gösterilmediğinden 10'a bakalım. Yine 10 ile hiçbir
karakter gösterilmediğinden 100'e bakıyoruz. Sözlükten bu bit dizisini bulup
yerine (s) yazıyoruz. Ardından 101 için ( k ) ve aynı şekilde devam ettirerek adımlarımızı tek
tek karakterleri belirleyerek (skrarkarkakr) elde ederiz.
Aritmetik kodlama tekniğinin temelinde, kodlanacak veri 0 ile 1 arasında bir reel sayı aralığı
ile ifade edilmesine dayanır (Özcan İ. ,2010). Veri kümesindeki her bir karakter bu sayı
aralığını daraltır. Veri içerisindeki karakterlerin kullanım sıklığı yani ne kadar çok tekrar ettiği
ne kadar az ise bu aralığı hızlı şekilde daraltırken fazla sıklıkta olanlar aralığı daha az
daraltacaktır. Kullanım sıklığı çok olan karakterler aralığı daha az daralttığından onu gösteren
bit sayısı, Huffman kodlamasında da olduğu gibi, benzer şekilde azdır. Veride tekrar eden
karakterler ne kadar çok ise veri o kadar az sayıda bit ile kodlanabilir. Alfabe eğer küçük ve
karakterlerin dokümanda bulunma olasılılıklarında büyük farklar olduğu durumlarda,
Huffman Kodlamasının verimi azalır, Aritmetik kodlama bu durumlarda daha başarılı
sonuçlar verir. (Mesut A., 2006)
Aritmetik kodlama tekniğini bir de bir örnekle açıklayalım. Elimizde üç harfli bir X={a1,a2,a3}
alfabesi bulunuyor olsun. Ve harflerin olasılık değerleri şu şekilde olsun: P(a1) = 0.7, P(a2) =
0.1 ve P(a3) = 0.2. a1, a2 ve a3 harflerinin arka arkaya geldiği bir dizi için etiketin
kodlanmasına bakalım.
İlk önce 0 – 1 sayı aralığı harflerin olasılık değerlerine göre 3 parçaya bölünür. Bunun
sonnucunda a1, 0 ile 0.7 arası, a2, 0.7 ile 0.8 arası, ve a3 de, 0.8 ile 1 arasında gösterilir.
Dizinin ilk karakteri a1 olduğundan, bir sonraki karakter incelenirken a1’in aralığı için işlem
yapılır. Yani 0 ile 0.7 arasında işlem yapılır. İkinci değere yani karaktere geçilirken olasılık
dağılımına göre bu işlemde tekrar aynı şekilde 0 ile 0.7 aralığı 3 parçaya bölünür. Yeni
durumda ise a1 için 0 ile 0.49 arası, a2 , 0.49 ile 0.56 arası, ve a3 , 0.56 ile 0.7 arasını temsil
eder. İkinci karakterimiz a2 olduğundan yeni aralığımız 0.49-0.56 olur. İşleme benzer yani
aynı şekilde devam edillerek ve üçüncü karakter için ise a3 de 0.546 ile 0.56 arasında olacak
şekilde yapılacaktır. Dizinin etiketi olarak ise bu aralıkta yer alan herhangi bir değeri alabiliriz.
17
Şekil 3.6 da en son aralıkta orta noktası olan 0.553 değeri etiket olarak seçilmiştir. İkilil
sistemde sayı 0.100011 sayısı, onluk sistemde 0.546875 sayısına karşılık gelir, ve en son
aralıkta (0.546 ile 0.56 aralığı) yer alan bu değer tam orta nokta olmasaydı yine etiket olarak
kodlanabilirdi. (Mesut A., 2006)
3.1.3 SHANNON-FANO
Bu, Huffman kodlamasına çok benzeyen başka bir yaklaşımdır. Aslında, bilinen ilk kodlama
yöntemidir. 1940 yılında C. Shannon (Bell Labs) ve R. M. Fano (MIT) tarafından önerildi.
Shannon Fano kodlama algoritması ayrıca, her bir kod kelimesinin farklı uzunlukta
olabileceği bir kod oluşturmak için her sembolün oluşma olasılığını kullanır. Düşük olasılıklı
semboller için kodlara daha fazla bit atanır ve çeşitli uzunluklardaki kod sözcüklerinin kodu
benzersiz bir şekilde çözülebilir.
Shannon-Fano Algoritması:
5. İki yarıya bölme (2.) ve atama (3.) adımlarını tekrarlayarak uygulayın, grupları alt
bölümlere ayırın ve her bir sembol ağaçta karşılık gelen bir yaprak haline gelene kadar kod
sözcüklerine bitler ekleyin (Pu, I., 2004)
18
Örneğin;
Şekil 3.7 Shannon Fano adım 1 Şekil 3.8 Shannon Fano adım 2
Şekil 3.9 Shannon Fano adım 3 Şekil 3.10 Shannon Fano adım 4
Şekil 3.11 Shannon Fano adım 5 Şekil 3.12 Shannon Fano adım 6
19
Şekil 3.13 Shannon Fano adım 7 Şekil 3.14 Shannon Fano adım 8
gösterimle bitiriyoruz. Ancak bu dizilim kendisini sıkıştırmaya oldukça müsait kılan bir
yapıya sahiptir.Bir örnekle açıklayalım.
Örnek olarak;
Bu dizinin tüm döngüsel permütasyonlarıyla başlanır. Toplam 11 karakter olduğu için Şekil
3.16 daki gösterilen 11 permütasyon vardır.
Şimdi bu dizileri sözlük sırasına göre sıralayalım (Şekil 3.17). Bu durumda son harf L sırası
şöyledir:
L :sshtth/bii/be
Harflerin nasıl bir araya geldiğini görebiliriz. Daha uzun bir veriye sahip olsaydık, aynı
harflerin dizilişi daha da uzun olacaktı. Dizinin kodlaması L dizisinden ve 10 indeks
değerinden oluştuğundan, orijinal dizinin sıralanmış listede sıra numarası 10 olarak görünecek.
Şimdi de dizinin bir kodlamasına sahip olduğumuzda ve sıralı olan listede L dizisini ve
orijinal dizinin indeks numarasını kullanarak, orijinal dizinin kodunu nasıl çözdüğümüzü
görelim. Unutulmaması gereken önemli noktalardan bir tanesi, ilk dizinin tüm öğelerinin L'de
bulunmasıdır. Sadece bulmamız gereken orijinal diziyi kurtarmamıza izin verecek
permütasyondur. Permütasyonu elde etmekteki ilk aşama, her satırın ilk elemanından oluşan F
dizisini oluşturmaktır. Bunu yapmak basittir. Çünkü dizileri sözlük sıralamasına göre sıraladık.
21
Bu nedenle, F dizisi sözlük sırasına göre basitçe L dizisidir. Örneğimizde bu, F'nin şu şekilde
verildiği anlamına gelir:
F : /b/behhiisstt
Orijinal diziyi oluşturmak için L ve F'yi kullanabiliriz. Sözlük bilimsel sıraya göre sıralanmış
döngüsel olarak kaydırılmış dizileri içeren Şekil 3.17 ye bakın. Her bir satır döngüsel olarak
kaydığı için, orijinal dizide satırın son sütunundan sonra gelen harf, herhangi bir satırın ilk
sütunundaki harftir. Orijinal dizinin k satırda olduğunu bildiğimiz için, F'nin k. öğesinden
başlayarak orijinal diziyi elde etmek için çözmeye başlayabiliriz. (Sayood, K., 2006)
3.2.1 LZ -77
Bu teknik 1977’de bir kayıpsız bir veri sıkıştırma algoritması olarak Lempel ve Ziv tarafından
oluşturulmuştur. Bu algoritma, örneğin, ZIP ve GZIP, LZ77'ye baz aldığından, mevcut
kullanımlarda yaygın bir şekilde vardır.
Sıkıştırma
Girdi dizisi boyunca sırayla tekrarlanır ve herhangi bir yeni eşleşme olduğunda bir arama
arabelleğinde onu tutar. Sıkıştırma işlemi için 3 adım söz konusudur:
Saklamış olarak bulunan arama belleğindeki veriden bir kalıpla aynı konumda başlamış olan
bir dizinin en uzun eşleşmesi bulunur.
o : eşleşen dizinin başlangıcını bulmak için geriye doğru gidilen konumların sayısını gösterir.
ababcbabababa
Başlangıçta, arama arabelleğimiz r boştur ve bir 'a' bulduğumuz soldan başlıyoruz. Arama
arabelleğimizde eşleşen herhangi bir kalıp bulunamamışsa, geriye doğru gidemediğimizden
dolayı (o = 0) üçlü (0, 0, a) çıktı olarak verilir ve arama tamponunda eşleşen herhangi bir
kalıp bulunmamaktadır (yani boş bir dizi ile eşleşme olur: l = 0). Daha sonra yapılamayan
eşleşmeden sonra 'a' karakterini bulmuş oluruz, yani c = a. l+1 pozisyonlarını sağa doğru
kaydırdığımızda kendimizi ikinci bir konuma taşımış oluruz. İmlecin konumunu köşeli
parantez [] kullanarak göstereceğiz.
Şimdiye kadar, arama arabelleğimizde 'b' ile başlayan herhangi bir modelimiz yok. Bu yüzden,
kodlama işlemimiz önceki adımla yaklaşık olarak benzer olacaktır: (0,0,b). Bu noktada işler
ilginçleşmeye başlar:
Daha önce bir 'a' ve hatta 'ab' bulduk, ancak 'abc' bulamadık, bu nedenle 2 konum sola
kaydırmamız (o = 2) ve 2 karakter okumamız gerekiyor (l = 2). Bulunabilecek daha sonraki
karakter 'c', bu yüzden çıktı üçlümüz (2,2,c) olacaktır. Ve aynı şekilde imleci l+1 konumlarını
sağa kaydırarak, kendimizi 'b' karakterinin konumunda buluruz.
ababc [b] ababaa için LZ77 kodlaması: (0,0,a), (0,0,b), (2,2,c) bu şekildedir.
23
Biz esasen bir 'b', ya da 'ba' ya da 'bab' bulmuş oluruz ama bu 'baba' kelimesi değil, bu
nedenledir ki 4 pozisyon sola doğru ilerlemeliyiz (o = 4) ve 3 karakter okunacaktır (l = 3) .
Bulunmuş olacağımız bir sonraki karakter bir 'a' olup ve bu sebeple çıktı üçlümüz (4,3,a)
olmuş olacak. Ve aynı şekilde imleci l+1 konumlarını sağa kaydırarak, kendimizi 'b'
karakterinin konumunda buluruz.
Neredeyse tamamladık bir 'b' ve bir ba' görmüştük, ancak bir 'baa' göremedik. 2 pozisyon sola
kaydırıp ilerlenir (o = 2) ve 2 karakter (l = 2) okumamız gerekecektir. Bu eşleşmeden sonra
bir 'a' bulmuş oluruz, yani son çıkış üçlümüz (2,2,a) olmuş olur.
ababcbababaa LZ77
kodlaması: (0,0,a), (0,0,b), (2,2,c), (4,3,a), (2,2,a)
Sıkıştırma aşamasındaki zaman karmaşıklığının, en kötü durumda, eşleşen bir model (varsa)
bulmak için giriş dizesinin başlangıcına geri dönmemiz gerektiğini düşünürsek, çok iyi
görünmediğini fark etmiş olabilirsiniz. Bu, 0 indeksli bir p konumunda, en kötü durumda p
konumlarını sola kaydırmamız gerektiği anlamına gelir. Dizinin her karakterinin farklı olduğu
bir ütopik durum düşünülürse Zaman karmaşıklığı şu şekilde yani ilk konum için 0 karakter
işlenecek sırasıyla + ikinci için 1 + üçüncü 2… + son konum için n-1 = n(n-1) / 2 = O(n2)
olacaktır. Bu, örneğin imlecin solundaki 6 konuma kadar içeriği yeniden kullanmamıza izin
vererek, arama ara belleğinin boyutuna önceden bir sınır tanımlamanın yaygın olmasının
nedenlerinden biridir.
Bu durumda, arama arabelleğinde 'c'yi bulamayız ve bu nedenle çıkış üçlüsü (7,3,a) yerine
(0,0,c) olur. Bununla birlikte, en kötü durumda, dizenin başında bir eşleşme bulmak için
işlenen her karakterde potansiyel olarak fiyat ödememiz gerekmez. Sonuç olarak, arama
arabelleğinin boyutunu belirlemek, sıkıştırma süremiz ile ihtiyaç duyulan bellek arasında bir
yer değştirme halini alır: küçük bir arama arabelleği sahipsek genellikle sıkıştırma aşamasını
daha hızlı bir şekilde tamamlarız, ancak sonuç olarak ortaya çıkan kodlama bizim için daha
fazla bellek ihtiyacı ortaya çıkarır; karşı tarafta, depolama olarak büyük bir arama
arabelleğinin verilerimizi sıkıştırması genellikle daha çok zaman alacaktır, ancak bellek
kullanımı olarak düşünürsek daha etkili olacaktır.
İmleçte başlamış olan alt dizi ileriye dönük arabelleğin boyutunu sınırlamakta daha yaygın
olacaktır. Bu kavramı, ileriye dönük arabelleğin iki * sembolü arasında temsil edildiği bir
örnekle açıklayalım.
Bu durumda, 6 boyutunda bir arama arabelleğine ve 4 boyutunda bir ileriye dönük arabelleğe
sahibiz. 6,4,c). Bu örnekte, ileriye dönük arabelleğimiz daha büyük olsaydı, bu konumdaki
çıktı üçlüsünün farklı olacağını unutmayın. Örneğin, ileriye dönük arabelleğimiz de 6
24
boyutunda olsaydı, tam olarak arama arabelleğinde bulunan 'babaca' dizesini içerirdi ve bu
nedenle, çıktı üçlüsü (6,6,a) olurdu.
İmlecimiz girdi boyunca metin üzerinde "kaydıkça" hem arama arabelleğinin hem de ileriye
dönük arabelleğin güncel kalması koşuluyla, bu algoritmanın aynı zamanda "kayan
pencereler" olarakta bilindiğini söylememiz iyi olur.
Kod Çözme
LZ77 de orijinal diziyi yeniden oluşturmak için kodlanmış formunu nasıl kullandığını görelim.
Bu teknik, kayıpsız bir veri sıkıştırma tekniğidir; bu, verinin kendisini yani orjinalini
tamamen elde edebileceğimizi söyler. LZ77 durumunda, rastgele bir LZ77 üçlüsünden
açmaya başlayamayacağımızı da belirtmekte fayda var: bunun yerine, ilk üçlüden açmaya
başlamamız gerekiyor. Bunun nedeni, temelde, kodlanmış üçlülerin arama ara belleğini baz
olarak kabul etmesidir.
Orijinal diziyi elde etmek için önceki bölümde elde edilen kodlamayı açarak açma işlemini
gösterelim. Bu nedenle, bu örnekteki kodlamamız aşağıdaki gibi olacaktır:
Geçerli dize: a
Kalan LZ77 kodlaması: (0,0,b), (2,2,c), (4,3,a), (2,2,a)
Geçerli dize: ab
Kalan LZ77 kodlaması: (2,2,c), (4,3,a), (2,2,a)
Bulduğumuz sonraki üçlü (2,2,c) ki bu biraz daha ilginç. Şimdi buradan çıkarılacak olan
şudur: o = 2 konum sola doğru hareket ettirin ve l = 2 karakter ('ab') oku. Buradan sonra c = 'c'
yaz. Burda, bu üçlünün sıkıştırılmış hali 'abc' olacaktır. Kodçözme dizimiz şimdi şöyle
görünür:
Bulduğumuz sonraki üçlü (4,3,a)'dır, bu şu anlama gelir: o = 4 pozisyon sola hareket ettirin ve
l = 3 karakter ('bab') okuyun. Bundan sonra c = 'a' yazın. Dolayısıyla, bu üçlünün sıkıştırılmış
değeri 'baba'dır. Kodçözme dizimiz şimdi şöyle görünür:
Bulunan son üçlü de (2,2,a)'dır, buradan da şu anlam çıkar: o = 2 konumu sola hareket ettir ve
l = 2 karakter ('ba') oku. Bundan sonra c = 'a' yaz. Ve bu şekilde, bu üçlünün sıkıştırılmış
değeri 'baa' şeklinde olmuş olur. Kodçözme dizimiz şimdi şöyle görünür:
Sıkıştırılan veri ile karşılaştırırsak aynı olduğu gözükecektir.( Budhrani, D., 2019)
3.2.2 LZ - 78
Bu teknik Lempel ve Ziv tarafından 1978'de ortaya çıkarılan kayıpsız bir veri sıkıştırma
tekniği olarak bulunmuştur. Örnek olarak, GIF formatı LZ78 'yi baz alarak
tasarlanmıştır. LZ78, verileri sıkıştırmak ve depolamak için sözlük tabanlı bir veri yapısını
kullanmıştır. Bu yüzden bu teknik sıkıştırmayı daha verimli hale getirebilmek için bir üçlü
veri yapısını benzer bir yapı kullanır.
Sıkıştırma
Sıkıştırma adımına geçmeden önce, dize kalıpları sözlüğümüzüzdeki girdileri yani verileri
saklamamıza yardımcı olan üçlü veri yapısı şu şekildedir:
Herhangi bir düğümün değerini elde etmek için, hedef düğümümüzden kök düğüme geçerek
diziyi yukarıdan aşağıya doğru okumamız yeterlidir.
Düğümler arasındaki her kenar, bir alttaki düğümün değerini bulmamız için eklenmesi
gereken olan karakteri içerisinde barındırır.
Geçerli düğümün (kök düğümden başlayarak) 1. adımda okunan karakteri içeren herhangi bir
giden kenarı olup olmadığını kontrol ederiz.
Eğer bu şekildeyse, giden kenarı takip edip ve o düğümü bulunan düğüm olarak
alırız. Ardından adım 1 e geri döneriz.
Aksi takdirde, 1. adımda okunan karakterle yeni bir düğüme yol açan bir giden kenar
oluştururuz. Daha sonra yeni düğümü artan bir dizi ile kaydedilir. Yapıya (pn, c)i olacak
şekilde bir kodlama grubu oluştururuz, burada pn ana düğümün bulunduğu konumu yani
indeksini, c adım 1'de okunan yeni karakteri ve i de yeni düğümün indeksini
göstermektedir. Yeni kodlama şemasına ekledikten sonra, bulunulan düğümü kök düğüm
olarak ayarlıyıp, 1. adıma dönüyoruz.
ababcbabababa
Başlangıçta, trie veri yapımız yalnızca boş bir dizeyi temsil eden kök düğümü içerir. Geçerli
düğümün giden kenarlarından hiçbirinde mevcut olmayan ilk karakteri okuyarak başlıyoruz:
'a'. Daha sonra kök düğümden yeni bir düğüme, indeks 1 ile işaretlenmiş yeni bir kenar
yaratırız. Aşağıdaki değerleri barındıran bir kodlama demeti oluştururuz: pn = 0 (kök düğüm),
c = 'a', i = 1 Bu nedenle, kodlama akışına (0,a)1 ekleriz. Mevcut düğümü kök düğüm olarak
belirledik ve bir sonraki karakteri okuduk (ileride köşeli parantez [] kullanılarak gösterilir).
a [b] abcbababaa
LZ78 kodlaması: (0,a)1
Kök düğümün 'b' ile etiketlenmiş herhangi bir giden kenarı yoktur, bu yüzden onu indeks 2 ile
işaretlenmiş yeni bir düğüm ile birlikte yaratırız. Aşağıdaki değerlere sahip bir kodlama
demeti oluştururuz: pn = 0, c = 'b' , i = 2. Bu nedenle kodlama akımına (0,b)2 ekliyoruz,
mevcut düğümü kök düğüm olarak ayarlıyoruz ve sonraki karakteri okuyoruz.
ab [a] bcbababaa
LZ78 kodlaması: (0,a)1, (0,b)2
Kök düğümün 'a' ile etiketlenmiş bir giden kenarı vardır, bu yüzden onu takip eder ve
kendimizi düğüm 1'de buluruz. Sıradaki 'b' karakterini okuduktan sonra düğüm 1'in 'b' ile
etiketlenmiş olan herhangi bir giden kenarı varolup olmadığını kontrol ederiz. Durum bu
şekilde değilse, dolayısıyla 1. düğümden yeni bir giden kenar oluşturmaya bakkılır, bu da
dizin 3 ile işaretlenmiş olan yeni bir düğüme yol açmış olur. Aşağıdaki değerlerle bir kodlama
grubu oluştururuz: pn = 1, c = 'b', i = 3. Bu sebeple, (1,b)3'ü kodlama akışına dahil etmiş
oluruz. Mevcut düğümü kök düğüm olarak ayarlıyoruz ve bir sonraki karakteri okuyoruz.
Kök düğümün 'c' ile etiketlenmiş bir giden kenarı yoktur, bu yüzden onu indeks 4 ile
işaretlenmiş yeni bir düğümle birlikte yaratırız. Aşağıdaki değerlerle bir kodlama grubu
27
Kök düğümün 'b' ile etiketlenmiş bir giden kenarı vardır, bu yüzden onu takip eder ve
kendimizi 2. düğümde buluruz. Durum bu şekilde değilse, dolayısıyla 2. düğümden yeni bir
giden kenar oluştururuz, bu da bize dizin 5 ile işaretlenmiş yeni bir düğüme yol açmış olur.
Aşağıdaki değerlerle bir kodlama demeti oluşturuyoruz: pn = 2, c = 'a', i = 5. Bu sebeple,
kodlama şemasına (2,a)5 eklenir. Bulunan düğümü kök düğüm olarak ayarlar ve bir sonraki
karakteri okuruz.
ababcba [b] abaa dizesinin LZ78 kodlaması: (0,a)1, (0,b)2, (1,b)3, (0,c)4, (2,a)5
Kök düğüm 'b' ile işaretlenmiş bir giden kenara sahip olur, bu yüzden onu takipte kalır ve
kendimizi düğüm 2'ye geçmiş buluruz. 5. düğüme gideriz. Bu şekilde takip edilerek ve bir
sonraki gelen karakter 'b'yi okuruz. Düğüm 5'in 'b' ile etiketlenmiş herhangi bir giden kenarı
olmadığını görüyoruz, bu yüzden onu indeks 6 ile işaretlenmiş yeni bir düğümle birlikte
oluşturuyoruz. b', i = 6. Bu sebeple, kodlama şemasına (5,b)6 eklemiş oluruz. Mevcut düğümü
kök düğüm olarak ayarlıyoruz ve bir sonraki karakteri okuyoruz.
ababcbabab [a] a
LZ78 kodlaması: (0,a)1, (0,b)2, (1,b)3, (0,c)4, (2,a)5, (5,b)6
Kök düğümün 'a' ile etiketlenmiş bir giden kenarı vardır, bu yüzden onu takip eder ve
kendimizi düğüm 1'de buluruz. Daha sonra gelen 'a' karakterini okunur. Ve sonrasında düğüm
1'in 'a' ile isimlendirilmiş bir giden kenarı olmadığını doğrulamış oluruz. Bu sebeple, a)7
kodlama dizisi gibi 7 ile etiketlenmiş yeni bir düğümle beraber oluştururuz. Giriş dizesini
tamamen okuduk, bu nedenle son kodlama akışı aşağıdaki gibi görünüyor:
ababcbababaa
LZ78 kodlaması: (0,a)1, (0,b)2, (1,b)3, (0,c)4, (2,a)5, (5,b)6, (1,a )7
Şimdi LZ78'in orijinal dizgiyi yeniden oluşturmak için kodlanmış formunu nasıl kullandığını
görelim. LZ78, veri kaybı olmayan yani kayıpsız veri sıkıştırma teknikleri arasında yer
almaktadır; bu, ilk sıkıştırdığımız veriyi aynen kurtarabilmemiz anlamına gelir. LZ77 ye göre,
LZ78 herhangi bir demetten sıkıştırmayı tekrar eski haline getirmeye izin verir.
Şimdi önceki bölümde elde ettiğimiz kodlamayı açalım. Açma işleminde sırasında orijinal
diziyi elde etmek amaçlanmıştır. Bu nedenledir ki, bu örnekteki kodlama dizimiz aşağıdaki
gibi olacaktır:
Daha önceden de bahsedildiği gibi, bir düğüme karşılık gelen orijinal veriyi elde etmek için,
düğüme erişmiş olmak için, kök düğüme ulaşana kadar denememiz gerekmektedir. Sonuç
olarak da bulduğumuz veriyi tersine çevirmek için, yukarıdan aşağıya doğru okumamız
yeterlidir. Bunu bir yerde tutarak, düğümlerin her birine karşılık gelen değerleri basit bir
şekilde açmış oluruz:
1. düğüm: a
2. düğüm: b
4. düğüm : c
Kodlama şemasının akışını takip ederek, veriyi aşağıdaki gibi açmış oluruz:
3.2.3 LWZ
LZW algoritması çok yaygın bir şekilde kullanılan bir sıkıştırma tekniğidir. Bu algoritma
GIF'de ve isteğe bağlı olarak PDF ve TIFF vs buralarda kullanılır. Kayıpsız bir veri sıkıştırma
tekniği olarak bilinmektedir, yani sıkıştırma sırasında hiçbir veri kaybolmaz. Algoritmanın
uygulanması anlaşılırdır ve donanım uygulamalarında çok yüksek sıkıştırma potansiyeline
sahiptir. Yaygın olarak kullanılan bir uygulama olan Unix dosya sıkıştırmada yardımcı
program olarak sıkıştırmada kullanır ve GIF görüntü formatında kullanılır.
Düşünce olarak, veri alanından güzel bir verim elde etmek için tekrar eden kalıpları baz
alır. Veri sıkıştırma tekniklerinin arasında LZW basit kullanımı ve farklı yerlerde kullanışlılığ
29
açısından öncelikli olan tekniklerden biridir. Depolama kapasitesi olarak iki katına çıkardığını
iddia eden birçok bilgisayar yardımcı programının temelinde bulunur.
LZW algoritması çalışırken sıkıştırması için bir dizi sembol okuyarak, sembolleri diziler
halinde gruplar ve dizileri kodlara dönüştürerek çalışmasını sürdürür. Kodlar, değiştirdikleri
dizilerden daha az yer kapladığından sıkıştırma elde ederiz.
LZW sıkıştırması algoritması, tablo girişlerinde sayıyı belirleyebilmek 4096 ile bir kod
tablosu oluşturur. Her zaman giriş dosyasındaki tek baytları kod tablosunda 0-255 arasındaki
sayılar ile kodlar.
Kodlama işlemi başladığında, kod tablosunda sadece ilk 256 giriş vardır, kod tablosunun geri
kalanı ise boş olarak durmaktadır. Sıkıştırma sırasında baytların her birini temsil etmek için
256 ila 4095 arasındaki sayıların kodlarını kullanır.
Kodlama devamında, LZW verilerdeki tekrarlanan dizileri alır ve bunları kod tablosuna ekler.
Kod çözme işlemi ise, kod tablosundan tek tek kodlar alınarak hangi karekteri tesil ediyorsa
onla değiştirerek orijinal veriyi elde ederiz.
ASCII kodu genel olarak, her karakteri, veriler için 256'ya kadar tek tip halinde sembole
etmeye izin veren 8 ikili bit ile depolar. Bu algoritma ise bunu 8 bitten karakter başına 9 ila 12
bite genişleterek depolar. Yeni benzersiz semboller, dizide daha önce kullanılan sembollerin
kombinasyonu ile oluşturulur. Özellikle kısa ve çeşitli dizilerde her zaman iyi bir verim
sağlamaz. Ancak gereksiz verileri sıkıştırmak için çok iyidir ve yeni sözlüğü verilerle birlikte
kaydetmesi gerekmediği için sözlük yoğunlaşmaz: bu yöntem verileri hem sıkıştırabilir hem
de açabilir.
uygulama
LZW KODLAMA
5 IF P + C dize tablosundaysa
6 P=P+C
7 ELSE
8 kodu çıkar P
10 P=C
11 END WHILE
BABAABAAA P=B
C=Boş
Kodlayıcı Çıkış Karakter Tablo
Çıkış Temsili Kelime Karakter
Kodu Kodu
66 B 256 BA
65 A 257 AB
BABAABAAA P=A
C=Boş
Kodlayıcı Çıkış Karakter Tablo
Çıkış Temsili Kelime Karakter
Kodu Kodu
65 B 256 BA
67 A 257 AB
256 BA 258 BAA
BABAABAAA P=A
C=Boş
Kodlayıcı Çıkış Karakter Tablo
Çıkış Temsili Kelime Karakter
Kodu Kodu
65 B 256 BA
67 A 257 AB
256 BA 258 BAA
257 AB 259 ABA
Şekil 3.22 LZW Sıkıştırma Adımı 4
BABAABAAA P=A
C=A
Kodlayıcı Çıkış Karakter Tablo
Çıkış Temsili Kelime Karakter
Kodu Kodu
65 B 256 BA
67 A 257 AB
256 BA 258 BAA
257 AB 259 ABA
65 A 260 AA
Şekil 3.23 LZW Sıkıştırma Adımı 5
BABAABAAA P=AA
C=Boş
Kodlayıcı Çıkış Karakter Tablo
Çıkış Temsili Kelime Karakter
Kodu Kodu
65 B 256 BA
67 A 257 AB
256 BA 258 BAA
257 AB 259 ABA
65 A 260 AA
260 AA
Şekil 3.24 LZW Sıkıştırma Adımı 6
32
LZW Kodçözme
LZW açma işleminde, aynı dizi tablosunu oluştururken ilk olarak tek karakter olan ilk 256
tabloya yerleştirilir. Dizi tablosu, ilk kısım hariç, giriş akışındaki her karakter için tekrar
düzenlenir. Kodlarlar oluşturulan tablodaki kodlar yardımıyla tek tek değiştirilerek kod çözme
işlemi tamamlanır. Algoritması aşağıda verilmiştir.
S = ESKİ'nin çevirisi
S=S+C
ELSE
S = YENİ'nin çevirisi
çıkış S
ESKİ = YENİ
END WHILE
Bu örnekte 72 bit, 72 bit veri ile temsil edilmektedir. Ama makul bir dizi tablosu
oluşturularak sıkıştırma verimli hale getirilir. Özet olarak: Bu algoritma, tekrar eden veri
dizilerini çok verimli bir şekilde sıkıştırır. Kod sözcükleri 12 bit olacağından, herhangi bir tek
kodlanmış karakter, veri boyutunu azaltmak yerine genişletecektir. (Saikia, R.A., 2021)
34
Görüntü işleme alanında, daha büyük görüntülerin veya videoların işlenmesine başlamadan
önce görüntülerin sıkıştırılması önemli bir adımdır. Görüntülerin sıkıştırılmış hali bir
kodlayıcı tarafından gerçekleştirilir. Sıkıştırma süreçlerinde matematiksel dönüşümler hayati
bir rol oynar. Görüntünün sıkıştırılması için bir akış şeması Şekil 4.1 de gösterilmiştir.
Görüntü sıkıştırmaya ihtiyaç duymamızın sebebi; 1000*1000 çözünürlüğe sahip siyah beyaz
bir görüntü düşünün ve her piksel yoğunluğu temsil etmek için 8 bit kullanır. Yani gerekli
olan toplam bit sayısı 1000*1000*8 den görüntü başına 8000000 bit olur. Ve bunu birde
video için düşünürsek, saniyede 30 karesi olan bir video olsun, o zaman 3 saniyelik bir
videoyu depolamak için toplamda 3*(30*(8000000))=720000000 bite ihtiyaç duyulacaktır.
Sadece 3 saniyelik bir videoyu saklamak için gördüğümüz gibi çok büyük bir depolama
alanına ihtiyacımız vardır. Bu sebeple, görüntülerde veri kaybı yaşamadan yani bir piksel bile
kaybetmeden minimum sayıda bit ile bellekte saklamak için bir yola ihtiyaç vardır. Bu
sebepledir ki, görüntü sıkıştırma çok önemli bir durumdadır.
Seviyelerin nicelenmesi
Dizileri kodlama.
Görüntüyü Dönüştürme
Bir vektör uzayı başka bir diğer vektör uzayına eşleme fonksiyonudur. D' nin bir dönüşüm
olduğunu, f(t) : X⇒X' bir fonksiyon olduğunu düşünürsek, o zaman D(f(t)) bir dönüşüm
fonksiyonu olmuş olur.
35
Aslında basit bir şekilde, bir vektör uzayından diğer bir vektör uzayına bir eşleme ve
fonksiyon değiştirmediğimiz için D' nin işlevi değiştirdiğini söyleyebiliriz.
Bu prizmada, beyaz ışığı (f(t)) bileşenlerine ayırdığı bir dönüşüm fonksiyonu görmekteyiz.
Yani beyaz ışığın temsili olduğunu söyleyebiliriz. Burada beyaz ışıktan daha fazla bilgi
çıkarabileceğimizi gözlemliyoruz. İşlevleri daha verimli bir şekilde anlamamıza dönüşümler
bu şekilde yol gösterir.
Görüntü ayrıca piksellerin konumunun bir fonksiyonudur. Yani I(x, y) burada (x, y)
görüntüdeki pikselin koordinatlarıdır. Bu yüzden genellikle bir görüntüyü uzamsal alandan
frekans alanına dönüştürürüz.
(f*g)(t)=F(s)G(s)
Böylece frekans alanına geçerken hesaplama maliyetinin düştüğünü görebiliriz. Ayrıca, bir
entegrasyon operatörüne eşdeğer olan zaman alanında evrişimi görebiliriz, ancak frekans
alanında, terimlerin basit çarpımı haline gelir. Bu şekilde hesaplama maliyeti azaltılmış olur.
Şekil 4.3 dijital gri tonlamalı bir resmin küçük resim versiyonudur . Görüntü, piksel adı
verilen temel öğelerin dikdörtgen şeklinde döşenmesidir . Bir piksel görüntünün o kısmının
için görüntülenecek gri yoğunluğunun miktarını temsil eden bir küçük bir bloktur. Çoğu
görüntü için piksel değerleri, 0 (siyah) ile 255 (beyaz) arasında değişen tam sayılardır. 256
olası gri yoğunluk değeri Şekil 4.4 de gösterilmiştir.
Şekil 4.4 0 (siyah) ile 255 (beyaz) arasındaki yoğunluk değerleri aralığı.
Piksellerin yoğunluklarını tek tek görüntülemek için resmi tam boyutta açsak bile çok güç
olur. Yüksek çözünürlüklü görüntülerde bu avantaj olarak ortaya çıkar. İnç başına daha çok
noktaya sahip olunduğu için daha iyi bir görüntü oluşur. Web uygulamalarında genellikle
görüntüler 200 dpi çözünürlüğe sahip olmasına rağmen bu kitaplarda 300 dpi çözünürlüklü
basılı materyaller halinde olurlar. Şekil 4.3 deki tam boyutlu resim yapay olarak boyutu
arttırılmıştır. Aslında 2.016" x 3.024" veya 508 dpi çözünürlüktedir. Görüntünün sol alt
köşesini temsil eden 15 x 15 piksel bloğunu piksel yoğunluğu değerleri hakkında daha iyi bir
düşünce edinmek için aldık ve büyüttük. Şekil 4.5’de, boyutu arttırılmış bloğu ve Şekil 4.6’da
bunların yoğunluk değerlerini göstermektedir.
37
Şekil 4.6 Resmin sol alt 15 x 15 piksel bölümünün piksel yoğunluğu değerleri.
Bilgisayardaki en küçük depolama birimi bittir. Bir bit 0 veya 1 değerini sahiptir. Bir
bilgisayardaki depolama birimi olan bayt 8 bitten oluşur. Her bit için iki değer söz konusu
olduğundan ve bir baytta 8 bitten oluşturduğundan, 28 = 256 olası farklı durum ortaya
çıkmaktadır. Bu baytları 2 tabanında gösterebiliriz. Örneğin, yoğunluk 141 şu şekilde
yazılabilir.
141 = 128 + 8 + 4 + 1
= 1 x 128 + 0 x 64 + 0 x 32 + 0 x 16 + 1 x 8 + 1 x 4 + 0 x 2 + 1 x 1
= 10001101 2
ASCII kod değerlerine göre her klavye karakterine 256 baytın her biri atanmıştır. Normal bir
klavyede 256 karakter bulunmaktadır.
A x B piksel boyutundaki bir görüntü için bir web sunucusunda veya dijital kamerada başlık
bilgileri vs hariç sadece görüntünün kendisi saklanıyorsa, görüntünün satırlarının bulunduğu
38
sıfır ve birlerden oluşan A x B x 8 bitlik yer kaplar. Örnek görüntü için, bit dizisinin uzunluğu
768 x 512 x 8 = 3.145.728 bit yer kaplamaktadır. (Fleet, P.V. , 2021)
Kırmızı, yeşil ve mavi kanalların her birine ayrı ayrı göz atabiliriz. Aşağıda Şekil 4.8’ den
Şekil 4.11’ e kadar her birinin küçük görüntüleri gösterilmektedir. Asıl görüntümüzün boyutu
768 x 512 piksel boyutundaydı. Her pikseli 3 bayt ile göstereceğimizden için, bellekte
saklama alanımız 768 x 512 x 3 = 1.179.648 bayt yer kaplayacaktır. Bit düzeyinde
düşünürsekte 1.179.648 x 8 = 9.437.184 bit olacaktır.
Şekil 4.8 Dijital bir görüntünün küçük resmi. Şekil 4.9 Kırmızı kanal.
39
Araştırmacılar, görüntü sıkıştırma gibi uygulamalar için RGB renk uzayının optimal
olmadığını öğrendi. Parlaklık ve renklilik açısından insanların beyinlerinin küçük
değişikliklere daha iyi uyum içerisinde olduğu bilinmektedir. Parlaklık kanalı da diğer
kanallar gibi her bir pikselin parlaklığı ile ilgili bilgileri sahiptir. Krominans, aynı parlaklıkta
bir renk ve referans kanalı arasındaki farktır. Bir RGB renk uzayında üç kanal bulunduğundan,
renkli görüntülerdeki sıkıştırmada yeni bir alan oluşturmak üzere bir parlaklık ve iki
krominans kanalı kullanılmaktadır. Bunlardan en yaygın olarak bulunan ve JPEG2000
tarafından kullanılan YCbCr uzayıdır. Y parlaklık kanalını, Cb ve Cr ise krominans kanalları
temsil etmektedir.
Kırmızı, yeşil ve mavi üçlüyü (r,g,b) YCbCr uzayına dönüştürmek için ilk adım, her
yoğunluğu 255'e bölerek elde edilen üçlü [0,1] aralığında değerlere sahip olmaktır.
tanımlansın.
Şekil 4.12 Dijital bir görüntünün küçük resmi. Şekil 4.13 Y kanalı.
Dijital bir görüntüde huffman kodlaması için ağacı çizmek kolay değildir.Çünkü bayt
değerleri aralığı 0'dan 255'e kadar değerler almaktadır. Huffman kodlarını hala
hesaplayabiliriz.
Şekil 4.16 daki resmi düşünün. Toplam 512*768 = 393.216 piksel veya 393.216*8 =
3.145.728 bit için 512 x 768 pikseldir. Görüntüdeki 256 gri tonlama yoğunluğunun tamamının
olduğu düşünüldüğünde, yukarıdaki görüntü için Huffman kodlarını hesapladığımızda,
saklama boyutununun sıkıştırabildiğimizde 3,033,236 bit veya yaklaşık olarak bir bayt için
7,714 bit kullanabileceğimizi görülür. Bu değer, pek de önemli bir sıkıştırma sağlamaz.
41
Burada öğrenilecek ders, Huffman kodları bir görüntüye doğrudan uygulandığında verim
sağlarken, görüntü daha az belirgin yoğunluktan oluşuyorsa çok daha iyi çalışacağıdır. (Fleet,
P.V. , 2021)
4.3.2 JPEG
1992'de JPEG, dijital hareketsiz görüntüleri sıkıştırmak için uluslararası bir standart haline
geldi. Kısaltma JPEG, Joint Photographic Experts Group'tan gelir . JPEG, 1980'lerde
Uluslararası Standardizasyon Örgütü (ISO) ve Uluslararası Telekomünikasyon Birliği (ITU)
üyeleri tarafından kuruldu. (Fleet, P.V. , 2021) İnternet üzerinden gönderilen
görüntülerin %80'inden daha fazlası JPEG formatını kullanılarak depolanmaktadır. JPEG’ in
sık kulanılmasına rağmen eksiklikleri tespit edilip bir sonraki versiyonlarda eksiklikler
giderilmesi düşünülmüştür. Bu bölümde, basit bir JPEG algoritması açıklanacaktır, nasıl
çalıştığını bir örnek ile açıklayacağız, kodlanan görüntünün tersine çevirme işlemini ele
alınacaktır ve ardından formatla ilgili sorunlar belirlenecektir.
Algoritmada dört temel adım vardır - ön işlem, dönüşüm, niceleme, kodlama. Huffman
kodlamasını 3. bölümde zaten anlatılmıştır. JPEG ise kodlamayı gerçekleştirmek için
Huffman kodlamanın daha üst düzey halini kullanmaktadır.
Algoritmanın adımlarını açıklamak için Şekil 4.17 deki görüntüyü çalışan bir örnek olarak
kullanacağız. Resmin boyutları 160 x 240 piksel.
Adım 1 Ön İşleme
İlk öncelikle JPG formatındaki renkli görüntüler sıkıştırmak amacıyla, kırmızı, yeşil, mavi
renk kanallarının YCbCr uzayına taşınır. Bundan sonraki aşamada da gri tonlamalı
görüntüdeki gibi sıkıştırma işlemi için yapılanlar Y, Cb ve Cr kanallarına aynı şekilde yapılır.
42
Daha sonra görüntü 8 x 8 piksel boyutunda bloklar halinde ayrılır. Resmimizin boyutları 8'e
bölünemiyorsa biraz daha çalışma gerekli, ancak sunum için boyutları 160 x 240 = 8*20 x
8*30 olan bir resim seçtik. Burada 20 x 30 = 600 blok oluşturmuş olur.
Blok satır ve sütun için sırasıyla 4, 28'deki piksellerin vurgulanması önem taşır. Dönüşüm ve
niceleme adımlarındaki matematiksel işlemler gösterilmek üzere bu matrisin elemanları
kullanılır. Bu bloğun büyütülmüş hali(Şekil 4.18) ve bloğu oluşturan 64 piksel yoğunlukları
Şekil 4.19 ve Şekil 4.19 da görülmektedir.
Örnek bloğun büyütülmesi. Blok satırı 4, blok sütun 28'in piksel yoğunlukları
Ön işlemedeki son işlem de, her bloktaki her piksel yoğunluğunu 127 azaltmaktır. Burada 0
değeri merkezde kabul edilerek dönüşüm ve niceleme adımlarındaki matematiksel işlemlerin
kolaylaştırılmsı amaçlanır. Çalışan örnek bloğumuz için yeni değerler Şekil 4.21 de
gösterilmiştir.
Şekil 4.21
Blok satırı 4, blok sütun 28'de piksel yoğunluğu değerleri 127'den az.
43
Adım 2 Dönüşüm
Bir önceki adım, algoritmanın kodlama kısmını daha iyi bir hale getirecek hiçbir şey
yapılmamıştır. Kodlayıcının daha iyi bir hale gelmesini sağlayan önemli noktalardan bir
tanesi de dönüşüm aşamasıdır. JPEG’in ayrı bir durumu da, görüntüyü dönüştürmek
için Ayrık Kosinüs Dönüşümüne (DCT) dayanmasıdır. DCT, bir C = UBU^T dir, burada B ,
önceden işlenmiş görüntünün önceden işlenmiş 8 x 8 bloğudur. U ,spesifik bir 8 x 8 matrisdir.
DCT, 8 x 8 bloktaki daha büyük değerleri bilgilerin çoğunu C'nin sol üst tarafına doğru
taşımayı amaçlamaktadır. C'de kalan değerler nispeten küçük değerler
bulundurmaktadır. DCT, bunu tüm 8 x 8 lik bloğa uygulanmaktadır. Şekil 4.22 deki görüntü,
vurgulanan bloğumuzun DCT'sini gösterirken, Şekil 4.23 deki görüntü, önceden işlenmiş
görüntünün her bloğuna uygulanan DCT'yi gösterir.
Şekil 4.22 Örnek bloğun DCT'si. Şekil 4.23 Her bloğa uygulanan DCT.
Şekil 4.24 deki matriste bulunan elemanların değerleri 3 haneye yuvarlanmıştır, değerlerin
büyük bir kısmı irrasyonel sayılar olarak bulunmaktadır. Günümüzdeki gelişmiş teknoloji
sebebiyle birçok bilgisayar, kayan noktalı sayıları 16 basamağına kadar son basamakta hata
vererek hesaplamaktadır. Sayıların son basamakta yuvarlama hatasıyla 16 basamak olarak
kalması durumu zorlaştırmaktadır, bir sayının iki farklı gösteriminin olmasını mümkün
kılar. Burada da, Huffman kodunun daha verimli sonuçlar verebilmesi için bir şey
44
yapılmalıdır. Bu yüzden DCT çok sayıda sıfıra yakın değer oluşturur, ancak verileri yine
kodlayabilmek için daha iyi hazırlamak gerekir. Bunun içinde bir niceleme adımına ihtiyaç
duyulmaktadır.
Adım 3 Niceleme
JPEG algoritmasını kayıplı sıkıştırmanın bir örneği haline getiren adım niceleme
adımıdır. DCT adımı tamamen tersine çevrilebilir, yani, DCT'yi C =
UBU^T hesaplayarak her B bloğuna uygular . B hesaplama ile B = U ^ TCU yi
kurtarabilirsiniz çıkıyor . Değerleri "küçülttüğümüzde" onları kurtarmak mümkündür. Ancak,
küçük değerleri 0'a dönüştürmek ve nicelenmiş tüm değerleri yuvarlamak, tersine çevrilebilir
adımlar değildir. Orijinal görüntüyü kurtarma yeteneğimizi sonsuza kadar
kaybederiz. Niceleme yapmamızın sebebi tamsayı olmayan verileri tamsayı değeri olarak elde
edebilmek için yapılır. Huffman kodlama algoritması nicelenmiş verilerle çok daha etkili
olacak ve umut şu ki, sıkıştırılmış görüntüyü gördüğümüzde, çok fazla çözünürlükten kayıp
vermemişizdir.
Asıl olan bloğumuzun DCT'sine ve onu oluşturan değerler bir kez daha aşağıda Şekil 4.25 ve
Şekil 4.26 da verilmiştir.
Şekil 4.25 Örnek bloğun DCT'si. Şekil 4.26 4. blok satırı, 28. blok sütunundaki DCT değerleri.
Şekil 4.27 Örnek bloğun nicelenmiş DCT'si. Şekil 4.28 4. blok satırı, 28. blok sütunundaki DCT değerleri.
45
Şekil 4.29 Her bloğa uygulanan DCT. Şekil 4.30 Her bloğa uygulanan DCT ve nicemleme.
Adım 4 Kodlama
Aşağıdaki Şekil 4.31deki resimde orijinal resmi ve Şekil 4.32 de JPEG sıkıştırılmış resmi
göstermektedir.
46
Şekil 4.31 Dijital gri tonlamalı bir görüntü. Şekil 4.32 Sıkıştırılmış gri tonlamalı görüntü.
Son olarakta, blok satır 4, blok sütun 28 örneğimizi bloğun sıkıştırılmış haliyle kıyaslıyoruz.
Şekil 4.35 Sıkıştırılmış bloğun büyütülmesi. Şekil 4.36 Sıkıştırılmış bloğun piksel yoğunlukları.
JPEG, dijital ortamdaki görüntüleri sıkıştırıp depolamak için çok etkili bir yöntemdir, ancak
bazı sorunlar mevcuttur. Mesela, DCT'yi uygulamadan önce meydana gelen bloklara
böldüğümüz kısımdır. Görüntüyü 8x8 bloklara ayırmak, sıkıştırılmış görüntünün bazı
durumlarda "bloklu" gözükmesine neden olabilir. Aşağıda Şekil 4.37 ve Şekil 4.38 de
görsellerde orijinal görselin ve sıkıştırılmış görselin sağ üst köşelerini yakınlaştırdık. Blok
yapılarının sıkıştırıldığında nasıl olduğunu görebiliriz.
47
Şekil 4.37 Orijinal görüntünün sağ üst köşesi. Şekil 4.38 Sıkıştırılmış görüntünün sağ üst köşesi.
4.3.3.Renkli Görüntüler
JPEG Görüntü Sıkıştırma Standardını kullanarak renkli görüntüleri sıkıştırmak, gri tonlamalı
görüntüleri sıkıştırmak için kullanılan işleme çok benzer. Sadece görüntünün dosya, başlık vs
bilgileri hariç bilgileri, renkli görüntüler üç matriste tutar. Bu matrisler sırasıyla kırmızı, yeşil
ve mavi için ayrı ayrı yoğunluk değerlerini tutmaktadır. Ön işleme adımının bir parçası olarak,
RGB formatındaki renkli görüntüler Y Cb Cr alanına dönüştürülür.Gri tonlamalı görüntüler
için kullanılan algoritma daha sonra Y, Cb ve Cr kanallarının her birine uygulanır. İşlemi
göstermek için Şekil 4.39 deki resim örneğini kullanalım.
Şekil 4.40, Şekil 4.41 ve Şekil 4.42 da gösterilen üç renk kanalıyla başlıyoruz,
Tüm Y, C, her eleman bir sonraki substract 127 b ve Cr 8 x 8 bloklar halinde kanalları ve
bölme sonuç. Her kanaldaki her bloğa ilk olarak DCT ve ardından niceleme işlemi adımı,
uygulanır. Bir sonraki adımda da, üç kanaldaki nicelenmiş blokların her birine tek tek
huffman kodlaması uygulaması yapılır.
Sıkıştırılan görüntüye kodçözme işlemi uygulanırken, sıkıştırılmış kanalların her birine ayrı
ayrı ters çevirme işlemi için aynı algoritmayı uygularız. Bunu yaparak Y, Cb ve Cr
kanallarının değiştirilmiş hallerini elde etmiş oluruz. Bu işlem uygulanmış kanallar daha sonra
tekrardan RGB alanına dönüştürülür.
4.3.4 JPEG2000
Şekil 4.54
51
Algoritmanın adımlarını açıklamak için Şekil 4.54 deki görüntüyü çalışan bir örnek olarak
kullanacağız. Resmin boyutları 160 x 240 piksel.
Adım 1 Ön İşleme
Adım 2 Dönüşüm
JPEG2000 de, JPEG e göre önemli değişikliklerden biri de, DCT yerine Ayrık Dalgacık
Dönüşümü’nü (DWT) kullanmasıdır. DWT'yi CDF97 filtresi ile kullanırsak kayıplı sıkıştırma
vardır, DWT'yi LeGall53 filtresi ile birlikte kullanırsak kayıpsız sıkıştırma vardır. Ve
hesaplamayı Wim Sweldens sebebiyle kaldırma yöntemini kullanarak yapar. Her iki durumda
da DWT'nin 2-3 yinelemesini hesaplamış oluruz. Örnekte, her dönüşüm için iki yinelemesini
hesaplar.
Şekil 4.55
Adım 3 - Niceleme
Şekil 4.56
52
İki kez yineleme yapmak için, DWT yedi tane blok oluşturup, bu blokların her birini tek tek
nicelemektedir. Her bloktaki değerleri, sıfıra dönüştürür veya sıfıra yakınlaştırır ve arkasından
kat fonksiyonu ile bir tam sayıya dönüştürür. Çalışan örneğimizin sonucu Şekil 4.55
görüntülenir.
Adım 4 Kodlama
Sıkıştırma aşamasındaki son adımda, EBCOT yöntemini kullanırız. Ama burada ona
değinmiyeceğiz.
Kayıp göze alındığında sıkıştırma için, EBCOT asıl boyuta sahip olan 160*240*8 = 307.200
bit yerine yalnızca 84.504 bit kullanır saklamak için. O zaman sıkıştırma oranını da yaklaşık
olarak 2.2bpp bulmuş oluruz. Aynı görüntüyü JPEG kullanarak sıkıştırırsak, 2,7bpp sıkıştırma
oranı için 103.944 bit gerekir. Sırasıyla orijinal görüntü, JPEG2000 görüntüsü ve JPEG
sıkıştırılmış görüntüsü aşağıda kıyaslanmıştır.
Şekil 4.57 Dijital gri tonlamalı bir görüntü Şekil 4.58 JPEG2000 sıkıştırılmış görüntü (2.2bpp)
Aşağıdaki resimlerde, yukarıdakilerin her birinin sol üst köşelerini içeren kısımları
gösterilmektedir. JPEG2000 köşesinde gözükmeyen fakat JPEG köşesinde gözüken bloklu
yapılar bulunmaktadır.
53
SONUÇ
Sonuç olarak bilginin git gide arttığı örneğin tıp alanındaki görüntülerin artması vs. göz
önünde bulundurulduğunda özellikle görüntü sıkıştırma üzerine daha çok yoğunlaşmanın
daha verilerin saklanması konusunda daha yararlı olacağı düşünülmektedir.
55
KAYNAKLAR
Çölkesen, R., 2014, Veri Yapıları ve Algoritmalar, Papatya Yayıncılık, İstanbul, 424s.
Diri B., 1999, Türkçe'nin Biçimbilim Yapısına Dayalı Bir Metin Sıkıştırma Sistemi, Fen
Bilimleri Enstitüsü Yıldız Teknik Üniversitesi, İstanbul
Krajci S., Liu C., Mikes L., ve Moser S., 2015, Performance Analysis of Fano Coding,
Department of Electrical and Computer Engineering , National Chiao-Tung University
(NCTU) , Hsinchu , Taiwan
Mesut A., 2006 Veri Sıkıştırmada Yeni Yöntemler, Trakya Üniversitesi Fen Bilimleri
Enstitüsü Bilgisayar Mühendisliği Ana Bilim Dalı, Trakya, 167s.
Pu, I., 2004, Data compression, Undergraduate study in Computing and related programmes,
London, 47p.
56
KAYNAKLAR(DEVAM)
Salomon, D. ve Motta, G., 2010, Handbook of Data Compression, Springer Science and
Business Media LLC, 1370p.
Storer J., Syzmanski T., 1982, Data Compression Via Textual Substitution, Journal of the
ACM, 928p.
TEŞEKKÜR
06/09/2021
Volkan ARIKAN
58
ÖZGEÇMİŞ