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