Data Compression :: Running RLE Algorithm on BMP and PGM Image Files Using C#

    source:http://mennan.kagitkalem.com/DataCompressionRunningRLEAlgorithmOnBMPAndPGMImageFilesUsingC.aspx

      Aşağıda, Data Compression için hazırlamış olduğum çalışmayı inceleyebilirsiniz. Bu çalışmada, sıkıştırma algoritmalarından RLE(Run Length Encoding) i, BMP ve PGM dosyaları üzerinde farklı şekillerde uygulanması gösterilecektir. Çalışma için, görüntü işleme camiasında sıkça kullanılan Lenna resmi kullanılacaktır.

1.   Konu 

Aşağıda özellikleri verilen 2 tane 512x512 boyutunda resim dosyasının RLE (Run Length Encoding) yöntemi ile sıkıştırma ve sonra orijinal olarak geri açma istenmektedir.

 

·         BMP (siyah - beyaz),

·         PGM (8 bit grayscale)

 

RLE uygularken aşağıdaki sıra ile kodlama(encoding) ve geri açma(decoding) yapılmalı her resim ve yöntem için analiz yapılmalıdır

 

1.      Her satırı ayrı ayrı.

2.      Her sütunu ayrı ayrı.

3.      Tüm resim satır satır

4.      Tüm resim sütun sütun.

5.      Tüm resim 64x64’lük bloklar halinde zigzag

 

 lenna           lenna


2.   RLE

Run Length Encoding, kayıpsız veri sıkıştırma(Lossless Data Compression). algoritmalarının bir çeşididir. Bu yöntemin temel amacı veri üzerinde, var olan bir veriyi tekrar eski haline dönüştürmeye olanak sağlayan, veri kayıplarının ihmal edilemediği metin gibi verilerinin boyutunu daha küçültmeye yarayan işlemler yapmaktır. Sadece metinlerde değil, siyah-beyaz veya renk sayısı az olan ve tekrarların fazla olduğu görüntülerde de var olan veriyi sıkıştırarak kaynakların daha verimli kullanılmasını sağlar.

 

Bu yöntem, diğer sıkıştırma yöntemleri kadar sıkıştırma oranlarında başarılı olmasa da kolay uygulanabilirliği açısından diğer karmaşık yöntemlerden ayrılır. Run, tekrar eden anlamlı veya anlamsız bir verinin sayısını gösterir. Örneğin “para para para ” dizisinde ardı ardına 3 tane “para ” dizisi geçmektedir. Bu dizi {3}”para “ olarak ifade edilebilir. Baştaki 3, kendisinden sonra dizinin 3 defa tekrar ettiğini belirtmektedir. RLE, en temel haliyle bu şekilde ifade edilebilir.

 

RLE algoritmasının uygulama aşamasında birçok yöntem bulunmaktadır. Her bir yöntem, burada belirtilmeyecektir. Sadece görüntülerin sıkıştırılması için kullanılacak yöntemler açıklanacaktır.

3.   BMP

Windows işletim sistemlerinin kullandığı,  Device-Independent Bitmap(DIB) olarak adlandırılan görüntü dosya formatıdır. Bu sayede herhangi bir ekranda herhangi bir formata bağımlı kalmaksızın görüntülenebilmesidir. Bu tip dosyalarının bir çok çeşidi bulunmaktadır.

 

Uygulamada kullanılan “1 Bit Per Pixel Indexed” tipidir. Yani bir piksel i ifade edebilmek için 1 bit(0 veya 1) e ihtiyaç duyulmaktadır. Bu da bir görüntüdeki toplam piksel çeşidinin 2 ile olarak sınırlandırılmasıdır. Genellikle siyah-beyaz görüntü dosyalarında bu tip ile saklanmaktadır. Bitmap in “Indexed” olması, görüntü verisinin içinde piksel değerleri yerine header da bulunan piksel paletinin indeksini göstermesidir. Kullanılan Bitmap’in header da bulunan paleti aşağıdaki gibidir:

 

 

Red

Green

Blue

Reserved

0

255

255

255

0

1

0

0

0

0

 

Örneğin resim verisi içinde 011... gibi bir sıra bulunuyorsa, (255, 255, 255)(0,0,0)(0,0,0)... piksellerinden oluştuğu anlamına gelmektedir.

4.   PGM

“Portable Gray Map” olarak adlandırılan, oldukça basit, gri tonlu(grayscale) resim dosyasıdır. Piksel değerleri 0-255 arasında değişmektedir. İçerdikleri görüntü bilgisini saklama şekillerine göre Binary ve Text olmak üzere iki farklı tipi bulunmaktadır

5.    Uygulama

Uygulama, yukarıda belirtilen RLE yöntemini kullanarak BMP ve PGM dosyalarının sıkıştırılmasını yapmaktadır.

5.1.        Kullanılan RLE Yöntemi

RLE’nin çek değişik türleri olduğundan, kullanılan yöntem aşağıda ayrıca belirtilecektir.

5.1.1.   BMP

Kullanılan Bitmap dosyası “1 Bit Per Pixel Indexed” tipindedir. Her görüntü “0” pikseli ile başladığı kabul edilmiştir. Ardından gelen tekrar eden pikseller toplamsal olarak yazılmıştır. O nedenle ilk byte “0” indeksli pikselin, ikinci byte ise “1” indeksli pikselin run değerini tutmaktadır.

 

Aşağıda bu yöntemin uygulandığı çeşitli örnekler bulunmaktadır:

 

Orijinal Bit Hali

Orijinal Byte Hali

Sıkıştırılmış Bit Hali

Sıkıştırılmış Byte Hali

0000000011111111 

[0][255]

8 8

[8][8]

0111111111111111

[127][255]

1 15

[1][15]

1111111111111111

[255][255]

0 16

[0][16]

1001100111111100

[153][252]

0 2 2 2 8 2

[0][2][2][2][8][2]

 

Run değeri 1 byte(255) değerini geçtiğinde ise bir sonraki byte geçilir. Örneğin ardı ardına 300 adet 1 gelirse, [255][0][45] olarak kodlanır.

 

Bu yöntemde, run değeri en fazla 255 olarak belirlenmiştir. Hiçbir run değeri bu kısıtın üzerine çıkamaz. O nedenle, bir dezavantaj olarak, ardı ardına gelen ve 255 ten büyük tekrarlar gösterilebilir. Çünkü her 255 ten büyük değerler için, bit değerini kaybetmemek için bir sahte bit([0] veya [1]) eklenir. Bu da sıkıştırma oranını, resmin içeriğine bağlı olarak, değiştirir. Eğer run değeri 2 byte(65535) olarak seçilirse, yine resmin içeriğine bağlı olarak, sıkıştırma oranında ters yönde etkileyebilecektir.

 

Burada, belki bir gelecek çalışması(future work) olarak, resmin içeriğini analiz edip ona göre en uygun run değerinin bulunması sıkıştırma oranının düşürülmesi için daha etkili olacaktır

 

Bu yöntemde başarı, ardı ardına gelen bitlerde çok sık değişimin olup olmamasına göre değişmektedir.

 

Sadece görüntünün “veri” kısmında bir sıkıştırılma yapılmıştır. Header da herhangi bir sıkıştırmaya gidilmemiştir.

rle_encoded_column_lenna

5.1.2.   PGM

Burada kullanılan RLE yöntemi, ardı ardına gelen piksellerden 2 veya daha fazla tekrar eden piksellerin sayısının run değeri olarak kullanılmasıyla elde edilmiştir.

 

Aşağıda bu yöntemin uygulandığı çeşitli örnekler bulunmaktadır:

 

Orijinal Pikseller

Sıkıştırılmış  Pikseller

160 160 159 159 159 159 159

160 160 0 159 159 3

255 90 90 112 112 112

255 90 90 0 112 112 1

 

Sadece görüntünün “veri” kısmında bir sıkıştırılma yapılmıştır. Header da herhangi bir sıkıştırmaya gidilmemiştir.

 

rle_encoded_64by64_based_lenna

6.    Analiz

Uygulama sonucunda elde edilen sıkıştırma oranları(sıkıştırılmış / orijinal) aşağıdaki gibidir

  

 

BMP

PGM

Her satır ayrı ayrı

0,241425

0,947268

Her sütun ayrı ayrı

0,395522

0,934769

Tüm resim satır

0,234054

0,947268

Tüm resim sütun

0,394334

0,934761

64X64 zigzag

0,355498

0.948937

Sıkıştırma oranları(sıkıştırılmış / orijinal) 

Boyut(byte)

Dosya Adı

979.970

lenna.pgm

964.610

rle_decoded_column_lenna.pgm

964.610

rle_decoded_row_lenna.pgm

964.610

rle_decoded_two_dim_column_lenna.pgm

964.610

rle_decoded_two_dim_row_lenna.pgm

964.610

rle_decoded_zigzag_64_lenna.pgm

901.680

rle_encoded_column_lenna.pgm

913.743

rle_encoded_row_lenna.pgm

901.688

rle_encoded_two_dim_column_lenna.pgm

913.745

rle_encoded_two_dim_row_lenna.pgm

915.355

rle_encoded_zigzag_64_lenna.pgm

 

 

32.830

lenna.bmp

32.830

rle_decoded_64by64_based_lenna.bmp

32.830

rle_decoded_column_based_lenna.bmp

32.830

rle_decoded_column_lenna.bmp

32.830

rle_decoded_row_based_lenna.bmp

32.830

rle_decoded_row_lenna.bmp

11.671

rle_encoded_64by64_based_lenna.bmp

12.985

rle_encoded_column_based_lenna.bmp

12.946

rle_encoded_column_lenna.bmp

7.926

rle_encoded_row_based_lenna.bmp

7.684

rle_encoded_row_lenna.bmp

Oluşan Dosyalar ve boyutları

  

Yukarıda belirtilen sıkıştırma oranları tamamen resim içeriğine bağlı olarak değişmektedir. Kullanılan örnek resimler için başarılı olarak sıkıştırma yapan bir yöntem bir başka resim için aynı başarıyı göstermeyebilir.

6.Programın Çalıştırılması

 

    program kodunu indirebilirsiniz. Yapmanız gereken bin/debug altındaki exe yi çalıştırmak. Eğer Visual Studio 2005 sahibi iseniz, ilgili projeyi .sln uzantılı dosyasından açıp inceleyebilirsiniz.  Ayrıca kaynak kod içinden PGM ve BMPdosyaları üzerinde okuma ve yazmanın nasıl yapıldığı, RLE algoritma motoru da bulunmaktadır. Kaynak kod, isim vermek veya vermemek suretiyle, herhaliyle kullanılabilir, değiştirilebilinir.
posted @ 2008-08-12 23:33  淮北橘子  阅读(1001)  评论(0编辑  收藏  举报