You are on page 1of 74

T.C.

EGE ÜNİVERSİTESİ

Fen Bilimleri Enstitüsü

VERİ SIKIŞTIRMA YÖNTEMLERİNİN ANALİZİ

Volkan ARIKAN

Danışman : Prof. Dr. Urfat Nuriyev

Matematik Anabilim Dalı

Bilgisayar Bilimleri Yüksek Lisans Programı

İzmir-2021
ii
i
ii

EGE ÜNİVERSİTESİ FEN BİLİMLERİ ENSTİTÜSÜ

ETİK KURALLARA UYGUNLUK BEYANI

EÜ Lisansüstü Eğitim ve Öğretim Yönetmeliğinin ilgili hükümleri uyarınca Yüksek Lisans


Tezi / Doktora Tezi olarak sunduğum “Veri Sıkıştırma Yöntemlerinin Analizi ” başlıklı bu
tezin kendi çalışmam olduğunu, sunduğum tüm sonuç, doküman, bilgi ve belgeleri bizzat ve
bu tez çalışması kapsamında elde ettiğimi, bu tez çalışmasıyla elde edilmeyen bütün bilgi ve
yorumlara atıf yaptığımı ve bunları kaynaklar listesinde usulüne uygun olarak verdiğimi, tez
çalışması ve yazımı sırasında patent ve telif haklarını ihlal edici bir davranışımın olmadığını,
bu tezin herhangi bir bölümünü bu üniversite veya diğer bir üniversitede başka bir tez
çalışması içinde sunmadığımı, bu tezin planlanmasından yazımına kadar bütün safhalarda
bilimsel etik kurallarına uygun olarak davrandığımı ve aksinin ortaya çıkması durumunda her
türlü yasal sonucu kabul edeceğimi beyan ederim.

27/09/2021

İmzası

Volkan ARIKAN
iii

ÖZET

VERİ SIKIŞTIRMA YÖNTEMLERİNİN ANALİZİ

ARIKAN, Volkan

Yüksek Lisans Tezi, Matematik Anabilim Dalı


Tez Danışmanı: Prof. Dr. Urfat NURİYEV
Eylül 2021, 74 sayfa

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.

Veri sıkıştırmanın avantajları ve dezavantajları vardır. Avantajlarının yanında


dezavantajları önemsenmeyecek kadar azdır. Çünkü o da teknik nedenlerden
kaynaklanmaktadı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

ANALYSIS OF DATA COMPRESSION METHODS

ARIKAN, Volkan

Master's Thesis in Mathematics


Supervisor: Prof. Dr. Urfat NURİYEV
Eylül 2021, 74 pages

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.

Keywords: Data compression, Character Type Compression Techniques, Dictionary


Based Compression Techniques, Huffman Coding, Image Compression Techniques.
v

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

Tezin yazılmaya başlanması aşamasında birçok kaynaktan araştırma yapılmış, bunlar


irdelenerek bunlar hakkında bilgiler örneklerle açıklanmaya çalışılmıştır. Ve hesaplama
denemeleri yapılarak, farklı yöntemlerin kıyaslamaları yapılmıştır.

İZMİR

06.09.2021 Volkan ARIKAN


vi

İÇİNDEKİLER

Sayfa

İç Kapak

Kabul ve Onay Sayfası………………………………………………………………………….ⅰ

Etik Kurallara Uygunluk Beyanı………………………………………………………………ⅱ

Özet……………………………………………………………………………………………ⅲ

Abstract………………………………………………………………………………………..ⅳ

Önsöz…………………………………………………………………………………………..ⅴ

İçindekiler……………………………………………………………………………………..ⅵ

Şekiller Dizini…………………………………………………………………………………ⅸ

Simgeler ve Kısaltmalar Dizini………………………………………………………………ⅱⅸ

GİRİŞ………………………………………………………………………...………………...1

1. VERİ SIKIŞTIRMA……………………………………………………..…………….........2

1.1 Kayıplı Veri Sıkıştırma ………………………………………………………………….2

1.2 Kayıpsız Veri Sıkıştırma ……………………………………………...…………………...3

2. VERİ SIKIŞTIRMA İLE İLGİLİ TEMEL KAVRAMLAR………...……………………...4

2.1 Entropi……………………………………………………………………………………...4

2.2 Ortalama Mesaj Boyutu……………………………………………………………………5

2.3 Tekrarlanma ……………………………………………………………………………….5

2.4 Sıkıştırma Oranı …………………………………………………………………………...5

2.5 Sıkıştırma Faktörü………………………………………………………………………….5

2.6 Sıkıştırma Verimi…………………………………………………………………………..6

2.7 Kraft-Macmillan Eşitsizliği………………………………………………………………...6

3. KARAKTER TİPLİ VERİ ŞIKIŞTIRMA TEKNİKLERİ……………………...…………..7

3.1 İSTATİSTİKSEL TABANLI TEKNİKLER…………………….………………………...7

3.1.1 Huffman Algoritması Hakkında Genel Bilgi…………….………………………………7

3.1.1.1 Huffman Kodlaması……………………………………………………………………7


vii

İÇİNDEKİLER(DEVAM)

3.1.1.2 Huffman Ağacının Oluşturulması………...…………….…………………………….12

3.1.1.3 Sıkıştırılan Kodun Tekrar Çözülmesi…...….….……….…………………………….15

3.1.2 Aritmetik Kodlama……………………………………….…………………………….16

3.1.3 Shannon-Fano…………………………………………….…………………………….17

3.1.4 BWCA (Burrows-Wheeler Sıkıştırma Algoritması)…….……………………………...19

3.2 DİNAMİK SÖZLÜK TABANLI TEKNİKLER…………….…………………………...21

3.2.1 Lz – 77……………………………………………………….…………………………22

3.2.2 Lz – 78………………………………………………………..………………………...25

3.2.3 Lwz……………………………………………………………………………………...28

4. GÖRÜNTÜ SIKIŞTIRMA TEKNİKLERİ………………………………………...……...34

4.1 Görüntü İşlemedeki Dönüşümler…………………………………………………………35

4.2 Dijital Görüntü Temelleri………………………………….……………………………...36

4.2.1 Gri Tonlamalı Görüntüler……………………………….……………………………...36

4.2.2 Renkli Görüntüler……………………………………….……………………………...38

4.2.3 Renk Alanı Dönüşümü………………………………….………………………………39

4.3 Görüntü Sıkıştırma…..……...…………………………….………………………………40

4.3.1 Huffman Kodlama ve Dijital Görüntüler……………….………………………………40

4.3.2 JPEG…………………………………………………….………………………………41

4.3.2.1 Temel Algoritma……………………………………………………………………...41

4.3.2.2 Kodlanmış Görüntüye Kod Çözme İşlemi……………………………………………45

4.3.2.3 Sorunlar ve Problemler……………………………………………………………….46

4.3.3 Renkli Görüntüler……………………………………...…………….…………………47

4.3.3.1 Renkli JPEG Süreci…………………………………………………………………...48

4.3.3.1.1 Kodlama Adımı……………………………………………………………………..49

4.3.3.1.2 Sıkıştırılan Görüntüye Kodçözme İşlemi…………………………………………...49

4.3.4 JPEG2000………………………………………………………….……………………50
viii

İÇİNDEKİLER(DEVAM)

4.3.4.1 Temel Algoritma……………………………………………………………………...51

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

Şekil 3.2 Huffman sürecinde 2. Adım………………………………………………………...13

Şekil 3.3 Huffman sürecinde 3. Adım………………………………………………………...13

Şekil 3.4 Huffman sürecinde 4. Adım………………………………………………………...14

Şekil 3.5 Huffman sürecindeki 5. Adım……………………………………………………...14

Şekil 3.6 Aritmetik kodlama aralık gösterimi………………………………………………...17

Şekil 3.7 Shannon Fano adım 1………………………………………………………………18

Şekil 3.8 Shannon Fano adım 2………………………………………………………………18

Şekil 3.9 Shannon Fano adım 3………………………………………………………………18

Şekil 3.10 Shannon Fano adım 4……………………………………………………………..18

Şekil 3.11 Shannon Fano adım 5……………………………………………………………..18

Şekil 3.12 Shannon Fano adım 6……………………………………………………………..18

Şekil 3.13 Shannon Fano adım 7……………………………………………………………..19

Şekil 3.14 Shannon Fano adım 8……………………………………………………………..19

Şekil 3.15 Shannon Fano adım 9……………………………………………………………..19

Şekil 3.16 BWCA permütasyonu 1…………………………………………………………...20

Şekil 3.17 BWCA permütasyonu 2…………………………………………………………...20

Şekil 3.18 ababcbababaa LZ78 üçlüsü………………………………………………………..27

Şekil 3.19 LZW Sıkıştırma Adımı 1………………………………………………………….30

Şekil 3.20 LZW Sıkıştırma Adımı 2………………………………………………………….30

Şekil 3.21 LZW Sıkıştırma Adımı 3………………………………………………………….31

Şekil 3.22 LZW Sıkıştırma Adımı 4….………………………………………………………31

Şekil 3.23 LZW Sıkıştırma Adımı 5….………………………………………………………31

Şekil 3.24 LZW Sıkıştırma Adımı 6…..……………………………………………………...31


x

ŞEKİLLER DİZİNİ(DEVAM)

Şekil 3.25 LZW Sıkıştırma Adımı 1….………………………………………………………32

Şekil 3.26 LZW Sıkıştırma Adımı 2….………………………………………………………33

Şekil 3.27 LZW Sıkıştırma Adımı 3…..……………………………………………………...33

Şekil 3.28 LZW Sıkıştırma Adımı 4…..……………………………………………………...33

Şekil 3.29 LZW Sıkıştırma Adımı 5………………………………………………………….33

Şekil 4.1 Görüntü sıkıştırma akış şeması….………………………………………………….34

Şekil 4.2 Gerçek hayattan bir örnek…..………………………………………………………35

Şekil 4.3 Dijital gri tonlamalı bir görüntünün küçük resmi…………………………………..36

Şekil 4.4 0 (siyah) ile 255 (beyaz) arasındaki yoğunluk değerleri aralığı…………………....36

Şekil 4.5 Resmin sol alt 15 x 15 piksel kısmı………………………………………………...37

Şekil 4.6 Resmin sol alt 15 x 15 piksel bölümünün piksel yoğunluğu değerleri……………..37

Şekil 4.7 RGB renk alanı küpü……………………………………………………………….38

Şekil 4.8 Dijital bir görüntünün küçük resmi………………………………………………....38

Şekil 4.9 Kırmızı kanal……………………………………………………………………….38

Şekil 4.10 Yeşil kanal………………………………………………………………………...39

Şekil 4.11 Mavi kanal………………………………………………………………………...39

Şekil 4.12 Dijital bir görüntünün küçük resmi………………………………………………..40

Şekil 4.13 Y kanalı……………………………………………………………………………40

Şekil 4.14 Cb kanalı…………………………………………………………………………..40

Şekil 4.15 Cr kanalı………………………………………………………...…………………40

Şekil 4.16 Dijital gri tonlamalı bir görüntünün küçük resmi…………………………………40

Şekil 4.17 Dijital gri tonlamalı bir görüntü…………………………………………………...41

Şekil 4.18 Görüntünün 8x8 bloklara bölünmesi……………………………………………...42

Şekil 4.19 Örnek bloğun büyütülmesi………….……………………………………………..42

Şekil 4.20 Blok satırı 4, blok sütun 28'in piksel yoğunlukları………………………………..42

Ş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)

Şekil 4.22 Örnek bloğun DCT'si……………………………………………………………...43

Şekil 4.23 Her bloğa uygulanan DCT………………………………………………………..43

Şekil 4.24 4.blok satırı, 28. blok sütunundaki DCT değerleri………………………………..43

Şekil 4.25 Örnek bloğun DCT'si……………………………………………………………...44

Şekil 4.26 4. blok satırı, 28. blok sütunundaki DCT değerleri……………………………….44

Şekil 4.27 Örnek bloğun nicelenmiş DCT'si………………………………………………….44

Şekil 4.28 4. blok satırı, 28. blok sütunundaki DCT değerleri……………………………….44

Şekil 4.29 Her bloğa uygulanan DCT………………………………………………………...45

Şekil 4.30 Her bloğa uygulanan DCT ve nicemleme…………………………………………45

Şekil 4.31 Dijital gri tonlamalı bir görüntü…………………………………………………...46

Şekil 4.32 Sıkıştırılmış gri tonlamalı görüntü………………………………………………...46

Şekil 4.33 Bloğun büyütülmesi……………………………………………………………….46

Şekil 4.34 Bloğun piksel yoğunlukları………………………………………………………..46

Şekil 4.35 Sıkıştırılmış bloğun büyütülmesi………………………………………………….46

Şekil 4.36 Sıkıştırılmış bloğun piksel yoğunlukları…………………………………………..46

Şekil 4.37 Orijinal görüntünün sağ üst köşesi………………………………………………...47

Şekil 4.38 Sıkıştırılmış görüntünün sağ üst köşesi…………………………………………...47

Şekil 4.39 Bir JPEG görüntüsünün küçük resmi……………………………………………...47

Şekil 4.40 Kırmızı kanal……………………………………………………………………..48

Şekil 4.41 Yeşil kanal………………………………………………………………………...48

Şekil 4.42 Mavi kanal. ……………………………………………………………………….48

Şekil 4.43 Y kanalı. …………………………………………………………………………..48

Şekil 4.44 Cb kanalı. ………………………………………………………………………….48

Şekil 4.45 Cr kanalı. ………………………………………………………………………….48

Şekil 4.46 Kırmızı kanal.. ……………………………………………………………………49

Şekil 4.47 Sıkıştırılmış kırmızı kanal…………………………………………………………49


xii

ŞEKİLLER DİZİNİ(DEVAM)

Şekil 4.48 Yeşil kanal………………………………………………………………………...49

Şekil 4.49 Sıkıştırılmış yeşil kanal……………………………………………………………49

Şekil 4.50 Mavi kanal………………………………………………………………………...50

Şekil 4.51 Sıkıştırılmış mavi kanal…………………………………………………………...50

Şekil 4.52 Orijinal görüntü……………………………………………………………………50

Şekil 4.53 Sıkıştırılmış görüntü………………………………………………………………50

Şekil 4.54……………………………………………………………………………………..50

Şekil 4.55..……………………………………………………………………………………51

Şekil 4.56……………………………………………………………………………………..51

Şekil 4.57 Dijital gri tonlamalı bir görüntü…………………………………………………...52

Şekil 4.58 JPEG2000 sıkıştırılmış görüntü (2.2bpp) ………………………………………...52

Şekil 4.59 JPEG sıkıştırılmış görüntü (2.7bpp).. …………………………………………….52

Şekil 4.60 Orijinal köşe……………………………………………………………………….53

Şekil 4.61 JPEG2000 köşesi………………………………………………………………….53

Şekil 4.62 JPEG köşesi..……………………………………………………………………...53


xiii

SİMGELER VE KISALTMALAR

ASCII American Standard Code for Information Interchange

BWCA Burrows-Wheeler Compression Algorithm

DCT Discrete cosine transform

DWT Discrete Wavelet Transform

EBCOT Embedded Block Coding with Optimized Truncation

GIF Graphics Interchange Format

ISO International Organisation for Standardisation

ITU International Telecommunication Union

JPEG Joint Photographic Experts Group

JPG Joint Photographic Eperts Group

LZ77 Lempel Ziv 77

LZ78 Lempel Ziv 78

LZW Lempel Ziv Welch

NTSC National Television System Committee

PNG Portable Network Graphics

RGB Red Green Blue

TIFF Tagged Image File Format


1
1

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.

Tezin giriş bölümünde tezin içeriğinden, veri sıkıştırmanın ne olduğundan, kayıplı ve


kayıpsız sıkıştırmanın tanımından bahsedilecektir.

Tez ile ilgili veri sıkıştırmadaki temel kavramlar 2. bölümde aktarılacaktı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.

4. Bölümde de görüntülerin djital ortamda tutulması ve görüntü sıkıştırmanın nasıl


olduğunun bilgisi paylaşılacaktır.

Tezin sonraki bölümünde ise elde edilen sonuçlardan özet olarak bahsedilmiştir.

Tezin en son bölümünde ise kaynaklar dizini verilmiştir.


2

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)

1.1 Kayıplı Veri Sıkıştırma


Kayıplı sıkıştırma teknikleri bazı bilgi kayıpları içerir yani kayıplı sıkıştırma sınıfındaki
sıkıştırmalarda veriyi sıkıştırıp tekrar açtığımızda orijinal verinin bir kısmını kaybederiz.

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

Bir veri sıkıştırma planı geliştirdikten sonra, performansını ölçebilmeliyiz. Performansı


tanımlamak ve ölçmek için farklı uygulama alanlarının sayısı nedeniyle farklı terimler
geliştirilmiştir.Kısaca, Kayıplı sıkıştırma grubundaki sıkıştırma algoritmalarında sonuç metni
ile giriş metni aynı değildir. Sonuç metni giriş metninde daha azdır.

1.2 Kayıpsız Veri Sıkıştırma

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.

Uydulardan elde edilen veriler genellikle vejetasyon, ormansızlaşma ve benzeri sayısal


göstergeleri elde etmek için daha sonra işlenir. Yeniden yapılandırılan veriler orijinal verilerle
aynı değilse, işlemler farklılıkların "geliştirilmesi" ile sonuçlanabilir. Geri dönüp aynı veriyi
tekrar elde etmek mümkün olmayabilir. Bu nedenle, sıkıştırma işleminde herhangi bir
farklılığın görülebilmesi için izin verilmesi önerilmez.

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

2. VERİ SIKIŞTIRMA İLE İLGİLİ TEMEL KAVRAMLAR

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.

Toplam 6 ay vardır ve bu ayları 3 ikili bit ile kodlayabiliriz:

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.

Çoğunlukla bir bilginin entropisini hesaplarken formülünü kullanırız. Burada n


birbirinden farklı olasılıkların sayısıdır. Örneğin ilkbahar ve sonbahar aylarında bu sayı 6’dır
5

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)

2.2 Ortalama Mesaj Boyutu


Huffman ortalama mesaj boyutunu, kaynak alfabedeki her bir karakterin oluşma olasılığı ile
bu karakteri kodlamak için gerekli olan bit sayısını (βi) , çarpımlarının toplamı olarak temsil
eder. Ortalama mesaj boyutu aşağıdaki gibi ifade edilir. (Diri B., 1999)

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

2.4 Sıkıştırma Oranı

Sıkıştırma oranı, çıktı bilgisi boyutunun, girdi bilgisi boyutuna oranı olarak aşağıdaki
formüldeki gösterilir.

p = Çıktı Bilgisi Boyutu / Girdi Bilgisi Boyutu

Ö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)

2.5 Sıkıştırma Faktörü

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

2.6 Sıkıştırma Verimi

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.7 Kraft-Macmillan Eşitsizliği


Bu eşitsizlik, değişken uzunluklu benzersiz çözümü olan kodlamalarla ilgilidir. N adet Li
boyutundaki değişken uzunluklu kodlar için Kraf-MacMillan eşitsizliği (2.1)'de gösterilen
formül yazılır. (2.1)'i sağlayan değişken uzunluklu kod için, benzersiz çözümü olan kod
denebilir.

∑ (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

3. KARAKTER TİPLİ VERİ ŞIKIŞTIRMA TEKNİKLERİ

3.1 İSTATİSTİKSEL TABANLI TEKNİKLER

İ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)

3.1.1 Huffman Algoritması Hakkında Genel Bilgi

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.

3.1.1.1 Huffman Kodlaması

Huffman Kodlamasının algoritmaları, karakterler için kaynak alfabenin ihtimal dağılımını


kullanır. İhtimal dağılımını hesaplamak için kaynağın tek tek her bir karakterlerinin frekans
dağılımı hesaplanarak ortaya konur. İhtimallere göre, kod kelimeleri ataması olur. Daha
yüksek ihtimaller için daha kısa kod sözcükleri ve daha küçük ihtimaller için ise daha uzun
kod sözcükleri ataması yapılır. (Krajci S., Liu C., Mikes L. ve Moser S.,2015)
8

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

(a kodundaki bit sayısı)*(verideki a sayısı) + (c kodundaki bit sayısı)*(verideki c sayısı) + (s


kodundaki bit sayısı)*(verideki s sayısı) = 1*9 + 2*2 + 2*1 = 15 bit ihtiyacı olacaktır.
Hâlbuki bütün karakterleri 8 bit ile belleğe kodlasaydık 8*12 = 96 bite ihtiyacımız olacaktı.
Dolayısıyla yaklaşık olarak %85 ‘in üzerinde bir sıkıştırma oranına sahip olurduk.

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

Başlangıç olarak her harfin olasılıklarının bulunduğu küme oluşturulur.

Harf Kod Olasılık Küme Küme Olasılığı


x 0.2 x 0.2
y 0.4 y 0.4
Z 0.2 z 0.2
T 0.1 t 0.1
w 0.1 e 0.1
9

1. Harfler olasılıklarına göre küçükten büyüğe doğru sıralanır.

Harf Kod Olasılık Küme Küme Olasılığı


x 0.2 t 0.1
y 0.4 w 0.1
z 0.2 x 0.2
t 0.1 z 0.2
w 0.1 y 0.4

En üstteki setin koduna önek '1' eklenir.

Harf Kod Olasılık Küme Küme Olasılığı


x 0.2 t 0.1
y 0.4 w 0.1
z 0.2 x 0.2
t 1 0.1 z 0.2
w 0.1 y 0.4

3. İkinci setin koduna önek '0' eklenir.

Harf Kod Olasılık Küme Küme Olasılığı


x 0.2 t 0.1
y 0.4 w 0.1
z 0.2 x 0.2
t 1 0.1 z 0.2
w 0 0.1 y 0.4

4. İlk iki set birleştirilir.

Harf Kod Olasılık Küme Küme Olasılığı


x 0.2 tw 0.2
y 0.4 x 0.2
z 0.2 z 0.2
t 1 0.1 y 0.4
w 0 0.1

1. Harfler olasılıklarına göre küçükten büyüğe doğru sıralanır.

Harf Kod Olasılık Küme Küme Olasılığı


x 0.2 tw 0.2
y 0.4 x 0.2
z 0.2 z 0.2
t 1 0.1 y 0.4
w 0 0.1
10

2. En üstteki setin koduna önek '1' eklenir.

Harf Kod Olasılık Küme Küme Olasılığı


x 0.2 tw 0.2
y 0.4 x 0.2
z 0.2 z 0.2
t 11 0.1 y 0.4
w 10 0.1

3. İkinci setin koduna önek '0' eklenir.

Harf Kod Olasılık Küme Küme Olasılığı


x 0 0.2 tw 0.2
y 0.4 x 0.2
z 0.2 z 0.2
t 11 0.1 y 0.4
w 10 0.1

4. İlk iki set birleştirilir.

Harf Kod Olasılık Küme Küme Olasılığı


x 0 0.2 twx 0.4
y 0.4 z 0.2
z 0.2 y 0.4
t 11 0.1
w 10 0.1

1. Harfler olasılıklarına göre küçükten büyüğe doğru sıralanır.

Harf Kod Olasılık Küme Küme Olasılığı


x 0 0.2 z 0.2
y 0.4 twx 0.4
z 0.2 y 0.4
t 11 0.1
w 10 0.1

2. En üstteki setin koduna önek '1' eklenir.

Harf Kod Olasılık Küme Küme Olasılığı


x 0 0.2 z 0.2
y 0.4 twx 0.4
z 1 0.2 y 0.4
t 11 0.1
w 10 0.1
11

3. İkinci setin koduna önek '0' eklenir.

Harf Kod Olasılık Küme Küme Olasılığı


x 00 0.2 z 0.2
y 0.4 twx 0.4
z 1 0.2 y 0.4
t 011 0.1
w 010 0.1

4. İlk iki set birleştirilir.

Harf Kod Olasılık Küme Küme Olasılığı


x 00 0.2 ztwx 0.6
y 0.4 y 0.4
z 1 0.2
t 011 0.1
w 010 0.1

1. Harfler olasılıklarına göre küçükten büyüğe doğru sıralanır.

Harf Kod Olasılık Küme Küme Olasılığı


x 00 0.2 y 0.4
y 0.4 ztwx 0.6
z 1 0.2
t 011 0.1
w 010 0.1

2. En üstteki setin koduna önek '1' eklenir.

Harf Kod Olasılık Küme Küme Olasılığı


x 00 0.2 y 0.4
y 1 0.4 ztwx 0.6
z 1 0.2
t 011 0.1
w 010 0.1

3. İkinci setin koduna önek '0' eklenir.

Harf Kod Olasılık Küme Küme Olasılığı


x 000 0.2 y 0.4
y 1 0.4 ztwx 0.6
z 01 0.2
t 0011 0.1
w 0010 0.1
12

4. İlk iki set birleştirilir.

Harf Kod Olasılık Küme Küme Olasılığı


x 000 0.2 xyztw 1
y 1 0.4
z 01 0.2
t 0011 0.1
w 0010 0.1

3.1.1.2 Huffman Ağacının Oluşturulması

İlk olarak, veri setine ait frekans tablosu oluşturulur.

Ardından, hangi karakterin hangi bitlerle temsil edileceğini gösteren Huffman ağacı
oluşturulur.

Örnek:

Bir Huffman kodlama örneğini inceleyelim. Örnek olarak “asfasrass” kelimesini


kodlamak istiyoruz. Kelimedeki her harfe bir ASCII numarası atanır. Aşağıdaki tabloda da
kelimedeki her harf için ASCII numaları ve bit temsillerini verilmiştir.

Frekans
Harf ASCII İkili Kod Frekans
Olasılığı

s 115 01110011 4 4/9

a 97 01100001 3 1/3

f 102 01100110 1 1/9

r 114 01110010 1 1/9

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ışı:

01100001 01110011 01100110 0111001 01110011 01110010 01100001 01110011 01110011

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

Frekans olasılıklarına göre sıralanmış asfasrass kelimesindeki dört karakter .

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

Huffman sürecinde 2. Adım.

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

Huffman sürecinde 3. Adım.


14

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

Huffman sürecinde 4. Adım.

Adım 5

Huffman kodlamasındaki son işlem, düğümleri birbirine bağlayan tüm dalları


isimlendirmektir. Eğimi pozitif olan dallara 1 ile isimlendirilirken eğimi negatif olan dalları 0
ile etiketler. Sonuç olarak bir Huffman Ağacının son hali şu şekilde görülür:

Şekil 3.5

Huffman sürecindeki 5. Adım.


15

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.

Harf İkili Huffman

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.

3.1.1.3 Sıkıştırılan Kodun Tekrar Çözülmesi

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.

Örneğimize bakacak olursak, aşağıdaki Huffman sözlüğünü ve bit dizisini düşünelim:


16

Harfler Huffman kodu

a 00

r 11

s 100

k 101

Bit akışı: 10010111001110100111010010111

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.

3.1.2 Aritmetik Kodlama

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 Aritmetik kodlama aralık gösterimi

Ş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)

Fazla sayıda tekrarlı karakterlerin bulunduğu bir veriyi incelendiğimizde Huffman


Kodlamasına göre, daha iyi sonuç verdiği, daha az bit sayısında alan kapladığı görülmüştür.

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ı:

Bir sembol listesi verildiğinde, algoritma aşağıdaki adımları içerir:

1. Bir frekans (veya olasılık) tablosu geliştirin

2. Tabloyu frekansa göre sıralayın (en sık olanı en üstte)

3. Tabloyu benzer sıklık sayılarıyla 2 yarıya bölün

4. Listenin üst yarısına 0 ve alt yarısına 1 atayın.

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

Şekil 3.15 Shannon Fano adım 9

3.1.4 BWCA (Burrows-Wheeler Sıkıştırma Algoritması)

Burrows-Wheeler Transform (BWT) algoritması da kodlanan sembolün bağlamını kullanır,


ancak kayıpsız sıkıştırma için çok değişik bir şekilde. Bu algoritmanın önemli bir parçası olan
dönüşüm 1983 yılında Wheeler tarafından geliştirilmiş yani ortaya atılmıştır. (Sayood, K.,
2006) Ancak bu dönüşümü kullanan BWT sıkıştırma algoritması 1994 yılında gün ışığına
çıkmıştır. Önceki algoritmaların çoğuna göre baktığımızda tam tersine, BWT algoritması,
kodlama yapılmadan önce kodlanacak dizinin tamamını kodlayıcı tarafından kullanılabilir
olmasını gerekir. Ayrıca, önceki algoritmalardan farklı olarak, kodlama prosedürünü bilsek
bile, kod çözme prosedürü hemen belli olmaz. İlk önce kodlama prosedürünü
tanımlanmaktadır. Bu özel kodlamanın nasıl tersine çevrilebileceği açıklanmaktadır.
Algoritmayı aşağıdaki gibi özetleyebiliriz. N uzunluklu bir dizide, bu N dizileri sözlük
sırasına göre düzenlenmiş biçimde, bu N-1 dizinin her birinin orijinal dizinin bir kayması
olarak N-1 başka diziler oluştururuz. Kodlayıcı ise daha sonra sıralanmış olan, döngüsel
olarak kaydırılmış her dizinin son harfini alarak bir N dizisi oluşturur ve oluşturulan N
uzunluğundaki diziyi iletir. Bu son harf dizisi L ve sıralanmış listedeki orijinal dizinin
konumu kodlanır ve kod çözücüye gönderilir. Gördüğümüz üzere bu bilgi orijinal diziyi elde
etmek için yeterli olacaktır. N uzunluğunda bir diziyle başlıyoruz ve N +1 eleman içeren bir
20

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;

“this/bis/bthe” dizisini kodlayalım.

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.

Şekil 3.16 BWCA permütasyonu 1

Şekil 3.17 BWCA permütasyonu 2

Ş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 DİNAMİK SÖZLÜK TABANLI TEKNİKLER

İstaiksel tabanlı sıkıştırma teknikleri, verilerin istatistiksel bir modellemesi kullanmaktadır, bu


sebeple elde edilen sıkıştırmanın verim kalitesi, o modelin ne kadar iyi olduğuna bağlı
olmaktadır. Sözlük tabanlı veri sıkıştırma teknikleri istatistiksel bir modelleme kullanmazlar
ve değişken uzunluklu kodlar kullanırlar. Bunun yerine sembol dizileri belirlenir ve her diziyi
bir sözlük kullanılarak bir belirteç olarak kodlama yaparlar. Sözlük, sembol dizilerini bellekte
tutar ve statik veya dinamik (uyarlanabilir) şekilde olabilir. İlki kalıcıdır, bazen dizelerin
eklenmesine izin verir, ancak silme işlemine izin vermez, ikincisi ise giriş akışında daha önce
bulunan dizeleri tutar ve yeni girdi okunurken dizelerin eklenmesine ve silinmesine izin verir.
Bu nedenle, girdi dosyası çok büyükse sözlük tabanlı sıkıştırıcılar entropi kodlayıcılardır.
Pratik uygulamalardaki birçok dosya için, sözlük tabanlı sıkıştırıcılar, iyi sonuçlar üretir
çünkü, bu tür kodlayıcıyı çok popüler hale getirmek için. Bu tür kodlayıcılar aynı zamanda
metin üzerinde çalıştıkları kadar görüntüler ve ses verileri üzerinde de çalışırlar bu yüzden
genel amaçlıdır. İngilizce metni sıkıştırmak için kullanılan İngilizce dilinin sözlüğünün
kullanılması statik sözlüğün en basit örneğidir. Mesela yarım milyon kelime bulunan bir
sözlük düşünelim. Giriş akışının olduğu yerden bir sözcük yani boşluk veya noktalama
işaretiyle sonlandırılan bir sembol dizisi okunur ve sözlük aranır. Bir eşleşme bulunursa, çıktı
akışına sözlüğe bir dizin yazılır. Aksi takdirde, sıkıştırılmamış kelimenin kendisi yazılır. (Bu
bir mantıksal sıkıştırma örneğidir.) Sonuç olarak, çıktı akışı dizinleri ve ham sözcükleri içerir
ve bunlar arasında ayrım yapmak önemlidir. Bunu başarmanın bir yolu, yazılan her öğede
fazladan bir bit ayırmaktır. Prensip olarak, 219 = 524288 kelimelik bir sözlükte bir öğeyi
belirtmek için 19 bitlik bir dizin yeterlidir. Böylece, bir eşleşme bulunduğunda, bir bayrak
bitinden (belki bir sıfır) ve ardından 19 bitlik bir indeksten oluşan 20 bitlik bir belirteç
yazabiliriz. Eşleşme bulunmadığında, 1 bayrağı, ardından eşleşmeyen kelimenin boyutu ve
ardından kelimenin kendisi yazılır.
22

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.

Üçlü örnek (o, l, c) çıktısı alındığında, buradaki,

o : eşleşen dizinin başlangıcını bulmak için geriye doğru gidilen konumların sayısını gösterir.

l : uzunluk anlamı taşır ve dizinin uzunluğunu gösterir.

c : karakter, eşleşmeden sonra gelen karakteri gösterir.

Bir örnekle daha derin bir fikir edinelim:

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.

a [b] abcbababaa LZ77


kodlaması: (0,0,a)

Ş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:

ab [a] bcbababaa LZ77


kodlaması: (0,0,a), (0,0,b)

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.

ababcbaba [b] aa LZ77


kodlaması: (0,0,a), (0,0,b), (2,2,c), (4,3,a)

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.

ababc (baba) [c] baaaa

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.

ababc (babaca) *[b] aba* caa

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:

(0,0,a), (0,0,b), (2,2,c), (4,3,a), (2,2,a)

(0,0,a) ile başlayarak, o = 0 konumlarını sola kaydırmamız ve l = 0 karakter okumamız


gerekir (bu sadece boş bir dizedir). Daha sonra c = 'a' yazalım. Bu da, bu üçlünün sıkıştırılmış
değeri 'a'dır. Bu noktada, kodçözme dizgimiz şöyle görünür:

Geçerli dize: a
Kalan LZ77 kodlaması: (0,0,b), (2,2,c), (4,3,a), (2,2,a)

Bulduğumuz sonraki üçlü (0,0,b)'dir, bu şu anlama gelir: o = 0 konumunu sola kaydır ve l = 0


karakter oku (boş dize). Daha sonra c = 'b' yazalım. Bu da, bu üçlünün sıkıştırılmamış değeri
'b' olur. Kodçözme dizimiz şimdi şöyle görünür:

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:

Geçerli dize: ababc


Kalan LZ77 kodlaması: (4,3,a), (2,2,a)

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:

Kalan LZ77 kodlaması: (2,2,a)


25

Geçerli dize: ababcbaba

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:

Tamamen sıkıştırılmış dize: ababcbababaa

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.

Bu teknik, LZ77'nin performansını arttırmak için ortaya çıkmış ve gerekli olan


parametrelerden kurtulmaya çalışmaktadır. Her şarta optimum performans sağlayacak dünya
genelinde bir parametre yoktur, örnekle açıklarsak, LZ77'de arama arabelleğimiz çok küçük
olsaydı, sıkıştırma süresi daha az olsa da elde edilen kodlama daha çok alaa ihtiyaç duyacaktı.
Eğer karşı tarafta, arama arabelleğimiz çok fazla olsaydı, bu sefer de sıkıştırma süresinde
sıkıntı olurdu daha uzun sürerdi, ancak gerekli alana ihtiyaç daha az olurdu. Bu parametreleri
girdi verilerimizin modeline bağlı olarak optimize etmemiz bu yüzden önem
taşımaktadır. Kısaca, LZ78 'in girdi hakkında herhangi bir bilgiye ihtiyaç duymaması,
arkasındaki ana işlemlerden biridir ve dünya genelinde bir sıkıştırma algoritması olması
amaçlanmıştı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:

Üçlü bir ağaç yapısı vardır.

Her işlenen düğüm kendi sözlük dizini ile kodlanır.

Kök düğüm boş bir diziye sahiptir.

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.

Burada bu üçlü yapıyı düşünerek sıkıştırma sürecini tanımlayabiliriz:

Giriş dizesinden sonra gelen ilk karakteri okuruz.


26

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.

Aşağıdaki dizeyi sıkıştırmaya çalışarak bu işlemi bir örnekle gösterelim:

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.

abab [c] bababaa


LZ78 kodlaması: (0,a)1, (0,b)2, (1,b)3

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

oluştururuz: pn = 0, c = 'c' , i = 4. Bu sebeple, kodlama şemasına (0,c)4 eklenmiş olur. Mevcut


düğümü kök düğüm olarak ayarlıyoruz ve bir sonraki karakteri okuyoruz.

ababc [b] ababaa


LZ78 kodlaması: (0,a)1, (0,b)2, (1,b)3, (0,c)4

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

Aşağıdaki görüntü, denemenin son durumunu temsil eder:

Şekil 3.18 ababcbababaa LZ78 üçlüsü


28

Kod Çözme işlemi

Ş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:

(0,a)1, (0,b)2, (1,b)3, (0,c)4, (2,a)5, (5,b)6, (1,a)7

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

3. düğüm : (1. düğüm) + b = ab

4. düğüm : c

5. düğüm : (2. düğüm) + a = ba

6. düğüm: (5. düğüm) + b = bab

7. düğüm : (1. düğüm) + a = aa

Kodlama şemasının akışını takip ederek, veriyi aşağıdaki gibi açmış oluruz:

Orijinal veri: ababcbababaa şeklinde açılmış olur. (Budhrani, D., 2019)

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' nin karakteristik özellikleri sıralayacak olursak şu şekildedir:

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

Sıkıştırma algoritmasının şu şekildedir: giriş verileri işlenirken, bir sözlük, karşılaşılan en


uzun kelimeler ve bir kod değerleri listesi arasında bir yazı tutar. Daha sonra her sözcüğe
denk gelen kod değiştirilir ve böylece girdi dosyası sıkıştırılmış olur. Giriş verileri ne kadar
uzun ve çok tekrar ediyorsa algoritma daha çok verimli sonuç verir.
30

LZW KODLAMA

1 Tabloyu tek karakterli dizelerle başlat

2 P = ilk giriş karakteri

3 WHILE giriş akışının sonu değil

4 C = sonraki giriş karakteri

5 IF P + C dize tablosundaysa

6 P=P+C

7 ELSE

8 kodu çıkar P

9 için dizi tablosuna P + C ekleyin

10 P=C

11 END WHILE

12 P için çıkış kodu

LZW kullanarak sıkıştırma

Örnek: Diziyi sıkıştırmak için LZW algoritmasını kullanın: BABAABAA


İlgili adımlar aşağıdaki şemada sistematik olarak gösterilmektedir.
BABAABAAA P=A
C=Boş
Kodlayıcı Çıkış Karakter Tablo
Çıkış Temsili Kelime Karakter
Kodu Kodu
66 B 256 BA

Şekil 3.19 LZW Sıkıştırma Adımı 1

BABAABAAA P=B
C=Boş
Kodlayıcı Çıkış Karakter Tablo
Çıkış Temsili Kelime Karakter
Kodu Kodu
66 B 256 BA
65 A 257 AB

Şekil 3.20 LZW Sıkıştırma Adımı 2


31

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

Şekil 3.21 LZW Sıkıştırma Adımı 3

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.

LZW Kodçözme Algoritması

Tabloyu tek karakter dizileriyle başlat

ESKİ = ilk giriş kodu

ESKİ'nin çıktı çevirisi

WHILE giriş akışının sonu değil

YENİ = sonraki giriş kodu

IF YENİ, dize tablosunda değilse

S = ESKİ'nin çevirisi

S=S+C

ELSE

S = YENİ'nin çevirisi

çıkış S

C = S'nin ilk karakteri

ESKİ + C dize tablosuna

ESKİ = YENİ

END WHILE

LZW Kodçözme: <66><65><256><257><65><260>

Aşağıdaki şemada sistematik olarak gösterilmektedir.


<66><65><256><257><65><260> Eski=65 S=A
Yeni=66 C=A
Kodlayıcı Çıkış Karakter Tablo
Karakter Kelime Karakter
Kodu
B
A 256 BA

Şekil 3.25 LZW Sıkıştırma Adımı


33

<66><65><256><257><65><260> Eski=256 S=BA


Yeni=256 C=B
Kodlayıcı Çıkış Karakter Tablo
Karakter Kelime Karakter
Kodu
B
A 256 BA
BA 257 AB

Şekil 3.26 LZW Sıkıştırma Adımı 2

<66><65><256><257><65><260> Eski=257 S=AB


Yeni=257 C=A
Kodlayıcı Çıkış Karakter Tablo
Karakter Kelime Karakter
Kodu
B
A 256 BA
BA 257 AB
AB 258 BAA
Şekil 3.27 LZW Sıkıştırma Adımı 3

<66><65><256><257><65><260> Eski=65 S=A


Yeni=66 C=A
Kodlayıcı Çıkış Karakter Tablo
Karakter Kelime Karakter
Kodu
B
A 256 BA
BA 257 AB
AB 258 BAA
A 259 ABA
Şekil 3.28 LZW Sıkıştırma Adımı 4

<66><65><256><257><65><260> Eski=260 S=AA


Yeni=260 C=A
Kodlayıcı Çıkış Karakter Tablo
Karakter Kelime Karakter
Kodu
B
A 256 BA
BA 257 AB
AB 258 BAA
A 259 ABA
AA 260 AA
Şekil 3.29 LZW Sıkıştırma Adımı 5

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

4. GÖRÜNTÜ SIKIŞTIRMA TEKNİKLERİ

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.

Şekil 4.1 Görüntü sıkıştırma akış şeması

Burada görüntü sıkıştırma tekniklerinde yer alan kavramlara genel bakışı


açıklanacaktır.Görüntünün bir bilgisayardaki genel temsili, bir piksel vektörü gibidir. Her
piksel için kullanılan bit sayısı sabittir. Bu bitler, rengin yoğunluğunu belirler (siyah beyaz bir
görüntüde gri tonlamada ve renkli görüntülerde üç RGB kanalına sahiptir.)

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.

Görüntü sıkıştırmada temel adımlar:

Görüntü dönüşümünü uygulama

Seviyelerin nicelenmesi

Dizileri kodlama.

Görüntüyü Dönüştürme

Matematiksel olarak dönüşümü açıklarsak:

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.

Bir dönüşümün gerçek hayattan bir örneği Şekil 4.2 de gösterilmiştir.

Şekil 4.2 Gerçek hayattan bir örnek

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.

4.1 Görüntü İşlemedeki Dönüşümler

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.

Görüntüyü oluşturan ve sıkıştırılmış gösterimde yardımcı olan tüm temel bileşenlerin ne


olduğunu bilmek imajın dönüşümünde önemlidir ve işimizi kolaylaştırır. Hesaplamalar da
kolaylaşmış olur. Örnek: dönüşümden önce zaman alanında evrişim bulma:

Dönüşümden sonra frekans alanında evrişim bulma:

(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.

Böylece görüntüyü etki alanından diğerine dönüştürdüğümüzde uzamsal filtreleme işlemlerini


yapmak daha kolay hale gelir. (Geeks for Geeks, 2020)
36

4.2 Dijital Görüntü Temelleri

4.2.1 Gri Tonlamalı Görüntüler

Ş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.3 Dijital gri tonlamalı bir görüntünün küçük resmi

Ş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.5 Resmin sol alt 15 x 15 piksel kısmı.

Ş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

= 1 x 27 + 0 x 26+ 0 x 25+ 0 x 24+ 1 x 23+ 1 x 22+ 0 x 21+1 x 20

= 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)

4.2.2 Renkli Görüntüler


Gri tonlamalı görüntüler, renkli görüntülerden daha az saklama alanına ihtiyaç duyar. Gri
tonlamalı görüntülerde renkli görüntülere göre piksellerin ekrandaki yoğunluk değerlerini
belirlemek için yalnızca bir bayta ihtiyaç duyarız. Renkli görüntüler için ise tüm renkler
kırmızı, yeşil ve mavinin kombinasyonları kullanılarak elde edilebileceğinden pikseller üç
değer ile yani (r,g,b) olacak şekilde saklanır. Kırmızı, yeşil ve mavinin yoğunluk değerlerini,
her piksel için ayrı ayrı gösterilir. Yoğunluk aralığı, gri tonlamalı görüntü de olduğu gibi 0-
256 aralığında değişmektedir. 255, pikselde en yüksek renge sahip olunduğunu, 0, pikselde
hiçbir renge sahip olunmadığı anlamına taşır. Örneğin, üçlü (128, 0, 128) orta moru temsil
ederken (255, 215, 0) altını temsil eder.Tüm üçlüler kümesi RGB Renk Uzayını oluşturur.

Şekil 4.7 RGB renk alanı küpü

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

Şekil 4.10 Yeşil kanal. Şekil 4.11 Mavi kanal.

(Fleet, P.V. , 2021)

4.2.3 Renk Alanı Dönüşümü

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.

(r ' ,g ' ,b ' ) = (r/255,g/255,b/255)

tanımlansın.

Y yi elde etmek için formülü kullanalım.

y = 0,299*r' + 0,587*g' +0,114*b'

(r,g,b) = (0,0,0) (siyah) ise y = 0 olduğuna görülmektedir. Eğer (r,g,b) = (255,255,255)


(beyaz), o zaman y = 0,299 + 0,587 + 0,114 = 1. y için yukarıdaki formülün r ' , g ' ve
b ' nin dışbükey bir birleşimi olduğunu söylüyoruz çünkü 0,299 , 0,587 ve 0,114 çarpanları
negatif değildir ve toplamı birdir. Aslında bu durum, Ulusal Televizyon Sistemi Komitesi'nin
(NTSC) renkli yayınları siyah beyaz televizyon yayınlarına dönüştürmek için kullanılması
önerilen formüldür.

Y, Cb ve Cr kanalları için renkli bir görüntünün durumları aşağıda gösterilmiştir.


40

Şekil 4.12 Dijital bir görüntünün küçük resmi. Şekil 4.13 Y kanalı.

Şekil 4.14 Cb kanalı. Şekil 4.15 Cr kanalı.

4.3 Görüntü Sıkıştırma

4.3.1 Huffman Kodlama ve Dijital Görüntüler

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 Dijital gri tonlamalı bir görüntünün küçük resmi.

Ş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

256 piksel yoğunluğunun tamamının görüntüde görünmesi, Huffman sürecini maksimum


sayıda düzey oluşturmaya zorladı ve bu, çoğu yeni bit temsilini orijinal olanlardan yalnızca
biraz daha kısa yaptı.

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.

4.3.2.1 Temel Algoritma

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.

Şekil 4.17 Dijital gri tonlamalı bir görüntü

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.

Şekil 4.18 Görüntünün 8x8 bloklara bölünmesi.

Şekil 4.19 Şekil 4.20

Ö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.23 de de gözükdüğü üzere, ayrık kosinüs ile dönüştürülmüş görüntüdeki


yoğunlukların çoğu olduğunca küçük ve ilk aklımıza gelen de Huffman kodlamasının bu
görüntü için çok iyi verimi sonçlar ortaya çıkaracağı düşüncesidir. Ama hala bazı sorunlar
nedeniyle olmamaktadır. Örnek bloğumuzun DCT değerlerine (üç haneye yuvarlanmış) bir
göz atalım Şekil 4.24 e.

Şekil 4.24 4.blok satırı, 28. blok sütunundaki DCT değerleri.

Ş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

Niceleme adımı JPEG algoritmasındaki bir sonraki adımdır. Burada dönüştürülmüş


görüntüdeki değerler hakkında sıfıra yakın olanların sıfıra dönüştürülmesi diğerlerinin ise
sıfıra yakın olarak küçültülmesi kararları verilecektir. Her bir niceleme uygulanmış değer tam
sayılara yuvarlanır.

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.

Örnek bloğa uygulanan nicelemenin sonucudur.

Şekil 4.27 Örnek bloğun nicelenmiş DCT'si. Şekil 4.28 4. blok satırı, 28. blok sütunundaki DCT değerleri.
45

Karşılaştırmak amacıyla, dönüştürülmüş görüntünün nicelenmiş hali ile yukarıdan


dönüştürülmüş görüntü verilmiştir. Diğer görüntü ise görüntülemeyi kolaylaştırmak için
verilmiştir.

Şekil 4.29 Her bloğa uygulanan DCT. Şekil 4.30 Her bloğa uygulanan DCT ve nicemleme.

Adım 4 Kodlama

JPEG sıkıştırmasının bu adımında dönüştürülmüş ve nicelenmiş görüntünün kodlama işlemi


yapılır. Özetleyecek olursak 3. Bölümde detaylı bir şekilde açıklanmış olan temel Huffman
kodlama algoritması kullanılacaktır. Asıl olan görüntünün boyutları 160 x 240 olduğundan,
bellekte saklamak için 160*240*8 = 307.200 bit gerekmektedir. Görüntü dönüştürülmüş ve
nicelenmiş durumdayken huffman kodlamasını uygularsak görüntü bellekte 85.143 bit’lik yer
tutacaktır. Sıkıştırma oranı yaklaşık olarak 2.217 bpp bulunacaktır. Bu bize, görüntüyü
bellekte saklamak için gereken bit miktarının %70'inden fazla bir sıkıştırma olduğunu
söylemektedir.

4.3.2.2 Kodlanmış Görüntüye Kod Çözme İşlemi


Kodçözme işlemi oldukça basittir. İşlemlerin tam tersi yapılarak orijinal görüntü elde edilir.
İlk olarak 1. adımdaki, huffman kodlarının kod sözlüğü kullanılarak, nicelenmiş görüntünün
DCT'sini elde ederiz. Görüntülere uyguladığımız küçültme işlemini de geri eski boyutuna
getirmek için, her 8x8 bloktaki elemanlar gerekli oranlarda büyütülür. Bu aşamadan sonra,
nicelemeden önceki orijinal DCT'nin C = UBU^T olduğu C^' bloklar vardı. Daha sonra her
blok için B^' = U^TC^'U hesaplanır ve DCT'yi ters çevirilir. Son olarakta, her bloktaki
azalttığımız her öğeye 127 ekleme yaparız. Ortaya çıkan matris elemanlarını, orijinal
görüntüye bir adım daha yaklaştırmış olur.

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.33 Bloğun büyütülmesi. Şekil 4.34 Bloğun piksel yoğunlukları.

Ş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ı.

4.3.2.3 Sorunlar ve Problemler

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.

(Dr. Patrick Van Fleet , 2021)

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.39 Bir JPEG görüntüsünün küçük resmi


48

4.3.3.1 Renkli JPEG Süreci

Şekil 4.40, Şekil 4.41 ve Şekil 4.42 da gösterilen üç renk kanalıyla başlıyoruz,

Şekil 4.40 Kırmızı kanal. Şekil 4.41 Yeşil kanal.

Şekil 4.42 Mavi kanal.

ve bunları Y Cb Cr alanına dönüştürelim:

Şekil 4.43 Y kanalı. Şekil 4.44 Cb kanalı.

Şekil 4.45 Cr kanalı.


49

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.

4.3.3.1.1 Kodlama Adımı

Basitlik adına , algoritmanın etkinliğini ölçmek için normal Huffman kodlaması


uyguluyoruz. Her biri 160 x 240 piksel boyutundaki orijinal kanallardır. Bu şekilde, bellekte
toplam bit sayısı 160 satır * 240 sütun * 3 kanal * piksel başına 8 bit = 921.600 bit olacak
şekilde bellekte depolanır. Huffman kodlamasını kullanarak, Y kanalındaki öğeleri depolamak
için 76.284 bit, Cb kanalını depolamak için 48.775 bit ve Cr kanalını depolamak için 47.769
bit olmak üzere toplam 172.828 bit veya yaklaşık 1.5bpp'ye ihtiyacımız var. Görüntüyü
bellekte saklamak için gereken orijinal alanın %80'inden fazla bir sıkıştırma oranı elde edilir.

4.3.3.1.2 Sıkıştırılan Görüntüye Kodçözme İşlemi

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.

Şekil 4.46 Kırmızı kanal. Şekil 4.47 Sıkıştırılmış kırmızı kanal.

Şekil 4.48 Yeşil kanal. Şekil 4.49 Sıkıştırılmış yeşil kanal.


50

Şekil 4.50 Mavi kanal. Şekil 4.51 Sıkıştırılmış mavi kanal

Aşağıdaki iki görüntü ait orijinal görüntü ve sıkıştırılmış görüntü verilmiştir.

Şekil 4.52 Orijinal görüntü. Şekil 4.53 Sıkıştırılmış görüntü

4.3.4 JPEG2000

4.3.4.1 Temel Algoritma


Bir önceki JPEG’ de benzer şekilde JPEG2000 algoritmasında da dört temel adım
bulunmaktadır. Bunlar ön işleme, dönüştürme, niceleme, kodlama adımlarıdır. JPEG'den
farklı olarak, kullanıcı kayıpsız sıkıştırma yapmak isterse, niceleme adımı isteğe
bağlıdır. JPEG, Huffman kodlamasının gelişmiş bir versiyonunu kullandığından dolayı,
JPEG2000 de yeni bir kodlama yöntemi olan Optimize Edilmiş Kesme ile Gömülü Blok
Kodlama (EBCOT)’u kullanır.

Ş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

Gri tonlamalı yoğunluk değerlerinin ortalaması üzerinde ön işlem adımı uygulanacaktır. Bu


amaç doğrultusunda, görüntü matrisindeki elemanların her birinin yoğunluk değerini 127
azaltırız.

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

Kayıpsız sıkıştırma yapıyorsak sağ üstteki resimdeki DWT kodlanır ve algoritma


tamamlanır. JPEG2000, kayıplı sıkıştırma için 8 x 8 bloklarda JPEG ile kullanılana az çok
benzeyen bir niceleme akışı kullanır.

Ş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ıpsız sıkıştırma için, LeGall filtresiyle oluşturulan dalgacık dönüşümünün öğelerini


kodlamak için EBCOT'u kullanırız. Bu aşamada görüntüyü saklamak için 215.544 bit
kullanmış oluruz. Orijinal görüntü, ham formatta, 307.200 bit depolama gerektirir, bu nedenle
kayıpsız yöntem yaklaşık %30'luk bir tasarrufu temsil eder. Sıkıştırma miktarı da 5.6bpp
olmuş olur.

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)

Şekil 4.59 JPEG sıkıştırılmış görüntü (2.7bpp).

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

Şekil 4.60 Orijinal köşe Şekil 4.61 JPEG2000 köşesi

Şekil 4.62 JPEG köşesi. (Dr. Patrick Van Fleet , 2021)


54

SONUÇ

Bu tez çalışmasında veri sıkıştırma teknikleri üzere detaylı araştırılma yapılmıştır. Ve


tezin ilk bölümünde veri sıkıştırma hakkında bilgiler verilmiştir. Daha sonra karakter tabanlı
veri sıkıştırma teknikleri olasılık tabanlı ve sözlük tabanlı olmak üzere ayrılarak örnekler
verilerek açıklanmıştır.

Diğer bölümde de görüntü tabanlı kaynakların dijital ortama işlenmesi ve saklama


noktasında nasıl sıkıştırma yapılacağı açıklanmıştır.

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

Budhrani, D., 2019, “Towards Data Science” , https://towardsdatascience.com/how-data-


compression-works-exploring-lz77-3a2c2e06c097 (Erişim Tarihi:18/08/2021)

Çö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

Fleet, P.V. , 2021, “Görüntü Sıkıştırma” ,


https://www.whydomath.org/node/wavlets/imagecompression.html (Erişim tarihi:10.08.2021)

Geeks for Geeks, 2020 , “Görüntü Sıkıştırma” , https://www.geeksforgeeks.org/what-is-


image-compression/ (Erişim Tarihi:18/8/2021)

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

Lelewer, D.A. ve Hirschberg D.S., 1987 , Data Compression, 60p.

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.

Özcan, İ. , 2010, Robotlar Arasında Hızlı ve Güvenli Haberleşmenin Sağlanması, Yüksek


Lisans Tezi, Balıkesir Üniversitesi Fen Bilimleri Enstitüsü Elektrik-Elektronik Mühendisliği
Anabilim Dalı, 94s.

Pu, I., 2004, Data compression, Undergraduate study in Computing and related programmes,
London, 47p.
56

KAYNAKLAR(DEVAM)

Saikia, R.A. , 2021, “GeeksforGeeks” ,https://www.geeksforgeeks.org/lzw-lempel-ziv-welch-


compression-technique/,(Erişim tarihi:10.08.2021)

Salomon, D. ve Motta, G., 2010, Handbook of Data Compression, Springer Science and
Business Media LLC, 1370p.

Sayood, K. , 2006 , Introduction to Data Compression, San Francisco, 703p.

Shukla K., 2016, A Comprehensive Review of Image Compression Techniques, Institute of


Engineering and Technology, 4p.

Storer J., Syzmanski T., 1982, Data Compression Via Textual Substitution, Journal of the
ACM, 928p.

Şeker, Ş.E., 2008, “Entropi” https://bilgisayarkavramlari.com/2008/12/17/entropi-entropy/


(Erişim Tarihi:10/08/2021)
57

TEŞEKKÜR

Bu tez çalışmam boyunca değerli bilgileriyle yardımcı olan saygıdeğer danışman


hocam Prof. Dr. Urfat NURİYEV ’e sonsuz teşekkürlerimi sunarım.

06/09/2021

Volkan ARIKAN
58

ÖZGEÇMİŞ

İlkokul eğitimimi Fethiye de tamamladım. Sonrasında lise eğitimi için Antalya’nın


Akseki ve Alanya ilçelerinde bulundum. Ardından Ege Üniversitesi Matematik Bölümünü
kazandım. Burada 1 yıl hazırlık ve 4 yıl bölümüm olmak üzere 2011-2017 yılları arasında
eğitimimi tamamladım. Bu yıllar içerisinde pedegolojik formasyon eğitimimi de alarak
tamamladım. Bir sonraki yıldan itibaren yüksek lisans eğitimime başladım.

Yüksek lisansımı tamamlarken aynı zamanda da özel sektörde farklı kurumlarda


öğretmen olarak çalışmaktaktayım.

You might also like