Navigation

Search

Categories

On this page

Noise Generation
How to Sort ArrayList with ICompare Interface
Data Compression :: Running RLE Algorithm on BMP and PGM Image Files Using C#
Reading-Writing PGM(Portable Graphics Media) Image Files With C#(C Sharp)
Compression With Run Length Encoding(RLE) Algorithm With C#(C Sharp)
Converting Multi Dimensional Arrays To Single Dimensional
Converting a String Into Character ASCII Codes
Number Of Occurances Of Character In a String In C#(C Sharp)
Validating Turkish Telephone Number With Regular Expressions In C#
Copying Multi Dimensional Arrays In C Sharp
Language Comparisons : VB, C# and Java
Function Parameter Types for C Sharp
My New C Sharp Experience Blog
Cast Operations On C Sharp
Adding Link Column DataGrid Via Template Column Or Hyperlink Control
Generation Executables Dynamically Via C# Using CodeDom
Customized DataGrid In .NET
Integer TexBox Class In C#
Introduction to .NET Windows Applications With 3Tier Architecture
About Interface
Differences Between Class and Struct In C#
How To Draw Line On Windows Forms With Two Mouse Clicks
How to Start Programs Inside Windows Form Applications With C#
Selecting Radio Button In A DataGrid
How to Find Paths Of Special Folders In C#
Image Processing Concepts In C# : Stride, Scan0 And GrayScaleFiltering
How to make A Datatable's Column Unvisible In C#
How to make an uneditable ComboBox In C#
Data And Event Exchanging Between Windows Forms In C#

Archive

Blogroll

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

RSS 2.0 | Atom 1.0 | CDF

Send mail to the author(s) E-mail

Total Posts: 291
This Year: 0
This Month: 0
This Week: 0
Comments: 0

Sign In
Pick a theme:

# Saturday, April 26, 2008
Saturday, April 26, 2008 4:43:46 PM (GTB Daylight Time, UTC+03:00) ( C# | Computer Vision | Image Processing )
  1. Gürültü Oluşturma(Noise Generation)

Gerçek hayatta resimler tam istenildiği şekilde elde edilemezler. Resim bilgisi yanında bir takım çevresel faktörlerden dolayı gürültü de içerirler. Bu gürültüler bazen modellenebilir bazen de modellenemez. Resim üzerinde yapılacak işlemler için gerçek hayattaki resimlerin modellenebilmesi, çalışmanın başarısını arttıracaktır. Bu nedenle var olan resim üzerinde gürültü oluşturma, resim işlemede yerini almıştır.

d(r,c)=I(r,c)+n(r,c)

Denklem 1 Gürültü Formülü

 

Gürültünün, resme etkisini bulabilmek için Sinyal Gürültü Oranı(Signal Noise Ratio, SNR) hesaplanır. Bu değerin yüksek olması, gürültülü resmin orijinaline yakınlığını belirtir. Bir diğer ifadeyle SNR değeri ne kadar yüksek ise resim, o kadar az bozulmuş olarak algılanır.

Denklem 2 SNR Formülü

.

  1. Gauss Gürültüsü(Gauss Noise)

Bir Gauss dağılımı(normal dağılım, gauss distribution) yardımıyla gürültü oluşturulur. Dağılımdaki her bir değer(olasılık) kadar rastgele pikseller değiştirilir. Örneğin standart sapması 14 olan bir dağılımda g(5) = 0,027'dir. Resmin de 10.000 pikselden oluştuğu varsayılırsa, 0,027* 10.000 = 270 piksel değerine +5'in eklenmesi gerekir. Uç değerler için 0 ve 255'e göre yuvarlama yapılır.

Aşağıda farklı standart sapma değerlerine göre dağılımlar verilmiştir:

Grafik 1 Gauss Dağılım(Standart Sapma = 14)

 

Grafik 2 Gauss Dağılım(Standart Sapma = 27)

 

Gauss gürültüsü bir resme uygulanırken, asıl görüntü bilgisi, gürültüden etkilenmemektedir. Asıl görüntü üzerinden rastgele alınan her bir piksele gürültü uygulanıp, gürültülü eklemiştir. Bu işlemler rastgele yapıldığı için asıl görüntü üzerindeki bir piksel birçok defa gürültüden etkilenebilmektedir. Gürültülü resmin her bir piksel değeri, o piksele uygulanan en son gürültülü ile oluşmaktadır.

  1. Algoritma ve Kodlama

Kodlamanın göze çarpan kısımları aşağıda belirtilmiştir:

for (int GrayLevel = -255; GrayLevel <= 255; GrayLevel++)

{

Probability = GaussFunction.GetGaussValue(GrayLevel);

EffectedPixelCount = (int)(Probability * PixelCount);

for (int i = 0; i < EffectedPixelCount; i++)

{

RandomIndex = Randomizer.Next(0,PixelCount-1);

NoisyData[RandomIndex] = GetPixel(ImageData[RandomIndex] + GrayLevel);

}

}

  1. Analiz ve Yorumlar

Peppersgary PGM formatlı resim üzerinde gürültü oluşturulmuştur. Çıkan sonuçlar aşağıda belirtilmiştir:

Şekil 3 peppergray.pgm(noisy,gauss,σ =14)

 

Şekil 4 peppergray.pgm(noisy,gauss,σ =27)

 

σ =27

σ =14

Piksel Sayısı

263169

Signal Noise Ratio (SNR)

39.196

136.058

Tablo 1 Gauss Gürültü Analizi

 

Yukarıdaki tablo ışığında peppersgray resmi için yapılabilecek yorumlar aşağıda belirtilmiştir:

  • Standart sapma değerlerine göre oluşan SNR değerleri farklılık göstermektedir.

  • Düşük SNR değerleri için resim, daha fazla bozulmuş olarak algılanır.

 

 

  1. Tekdüze Gürültü(Uniform Noise)

Bu gürültü şeklinde, gürültü sabit bir şekilde görüntü üzerinde dağılmıştır. -47 ile +47 arasındaki bir sınır için

1 / (47-(-47)) = 1/94

Olasılığında gürültü uygulanmıştır. Bir başka ifadeyle -47'den +47'e kadar her bir değer 1/94 olasılığında gürültüye etkimiştir.

 

Aşağıda farklı sınır değerlerine ait tekdüze grafikler verilmiştir.

 

Grafik 3 Tekdüze Gürültü(-47,+47)

 

Grafik 4 Tekdüze Gürültü(-7,+7)

  1. Algoritma ve Kodlama

Kodlamanın göze çarpan kısımları aşağıda belirtilmiştir:

Probability = 1.0 / (_end - _start);

EffectedPixelCount = (int)(Probability * PixelCount);

 

for (int GrayLevel = _start; GrayLevel <= _end; GrayLevel++)

{

for (int i = 0; i < EffectedPixelCount; i++)

{

RandomIndex = Randomizer.Next(0, PixelCount - 1);

NoisyData[RandomIndex] = GetPixel(ImageData[RandomIndex] + GrayLevel);

}

}

  1. Analiz ve Yorumlar

Peppersgary PGM formatlı resim üzerinde gürültü oluşturulmuştur. Çıkan sonuçlar aşağıda belirtilmiştir:

Şekil 5 peppersgray.pgm(noisy,uniform,-47:47)

 

 

 

Şekil 6 peppersgray.pgm(noisy,uniform,-7:7)

 

 

[-7,7]

[-47,47]

Piksel Sayısı

263169

Signal Noise Ratio (SNR)

1335,138

37,994

Tablo 2 Uniform Gürültü Analizi

 

Yukarıdaki tablo ışığında peppersgray resmi için yapılabilecek yorumlar aşağıda belirtilmiştir:

  • Sınır değerlerine göre oluşan SNR değerleri farklılık göstermektedir. Birbirine yakın değerler için resim daha az gürültülü olarak oluşmaktadır.

  • Düşük SNR değerleri için resim, daha fazla bozulmuş olarak algılanır.

 

  1. Tuz-Biber Gürültüsü(Salt-Pepper Noise)

Bu gürültü şeklinde, gürültü tuz ve biber olacak şekilde uygulanmıştır. Tuz gürültüsü pikseli beyaz, biber gürültüsü ise pikseli siyah yapmaktadır.

 

  1. Algoritma ve Kodlama

Kodlamanın göze çarpan kısımları aşağıda belirtilmiştir:

EffectedPixelCount = (int)(_saltRatio * PixelCount);

 

for (int i = 0; i < EffectedPixelCount; i++)

{

RandomIndex = Randomizer.Next(0, PixelCount - 1);

NoisyData[RandomIndex] = 255;

}

 

EffectedPixelCount = (int)(_pepperRatio * PixelCount);

 

for (int i = 0; i < EffectedPixelCount; i++)

{

RandomIndex = Randomizer.Next(0, PixelCount - 1);

NoisyData[RandomIndex] = 0;

}

  1. Analiz ve Yorumlar

Peppersgary PGM formatlı resim üzerinde gürültü oluşturulmuştur. Çıkan sonuçlar aşağıda belirtilmiştir:

 

Şekil 7 peppersgray.pgm(noisy,salt:%5,pepper:%5)

 

Şekil 8 peppersgray.pgm(noisy,salt:%1,pepper:%1)

 

 

Salt:%5; Pepper:%5

Salt:%1; Pepper:%1

Piksel Sayısı

263169

Signal Noise Ratio (SNR)

9,915

43,707

Tablo 3 Salt-Pepper Gürültü Analizi

 

Yukarıdaki tablo ışığında peppersgray resmi için yapılabilecek yorumlar aşağıda belirtilmiştir:

  • Salt ve Pepper oranlarına göre oluşan SNR değerleri farklılık göstermektedir. Düşük oranlar için resim daha az gürültülü olarak oluşmaktadır.

  • Düşük SNR değerleri için resim, daha fazla bozulmuş olarak algılanır.

 

 

  1. Sinyal Gürültü Oranı(Signal Noise Ratio, SNR)

Oluşturulan her bir gürültülü resim için SNR değeri de hesaplanmıştır. Analiz kısmındaki tablodan bu değerler incelenebilir.

SNR değerinin hesaplanmasında kullnılan algoritma aşağıda belirtilmiştir:

double t1 = 0;

double t2 = 0;

 

for (int i = 0; i < OriginalImageData.Length; i++)

{

t1 += NoisyImageData[i] * NoisyImageData[i];

t2 +=(OriginalImageData[i]-NoisyImageData[i])*(OriginalImageData[i]-NoisyImageData[i]);

}

SNR = t1 / t2;

  1. Uygulama

 

Uygulama ComputerVision.exe adlı dosyadan oluşmaktadır. İşlenecek resimler, bu dosyanın bulunduğu dizine bırakılmalıdır. İşlem sonucunda oluşan rapor dosyaları ve görüntüler, bu dizin altında oluşacaktır. Aşağıda uygulamanın ne şekilde kullanılacağı belirtilmiştir:

 

C:\ComputerVision\>ComputerVision.exe

Computer Vision v1.0.0

Mennan Tekbir

 

Usage:

ComputerVision <operation> <image> [<options>*]

 

Examples:

ComputerVision 3 peppersgray.pgm

ComputerVision 5 peppersgray.pgm gauss 2

ComputerVision 5 peppersgray.pgm uniform -49 49

ComputerVision 5 peppersgray.pgm salt-pepper 0.05 0.05

ComputerVision 6 peppersgray.pgm median noisy_peppersgray.pgm 3

ComputerVision 6 peppersgray.pgm gauss noisy_peppersgray.pgm 1.4

ComputerVision 7 peppersgray.pgm 2

ComputerVision 8 peppersgray.pgm 1.6 1 7

ComputerVision 9 peppersgray.pgm 0.67 25 100

 

Operations :

1 : Connected Components

2 : Erosion(Morphology)

3 : Otsu Thresholding

4 : Region Properties

5 : Noise

6 : Filter

7 : LaplacianOfGaussian(LoG)

8 : DifferenceOfGaussian(DoG)

9 : Canny Edge detector

 

Options :

<noise type> = [gauss, uniform, salt-pepper]

<Standart Deviation> = (for gauss noise )

<a> = (for uniform noise )

<b> = (for uniform noise )

<salt ration> = (for salt-pepper noise )

<pepper ration> = (for salt-pepper noise )

<filter type> = [median, gauss]

<original file name>

<filter mask size> = (for filter operation)

<threshold> = (for edge operation)

 

 

Please enter command(quit to exit)

>

 

 

Uygulamayı indirmek için tıklayınız...

Comments [0] | | # 
# Saturday, April 19, 2008
Saturday, April 19, 2008 9:33:32 AM (GTB Daylight Time, UTC+03:00) ( C# )

A simple demostration shows how to sort an ArrayList in C#.

Output of the program will be:

Printing List before sorting:

1 = 2,5

2 = 1,9

3 = 4

4 = 10,5

5 = 1,1

6 = 3,5

 

Printing List in ascending order

5 = 1,1

2 = 1,9

1 = 2,5

6 = 3,5

3 = 4

4 = 10,5

 

C Sharp Code

using System;

using System.Collections.Generic;

using System.Collections;

 

namespace ArrayListSort

{

class Program

{

static void Main(string[] args)

{

ArrayList List = new ArrayList();

 

List.Add( new Item(1,2.5) );

List.Add(new Item(2, 1.9));

List.Add(new Item(3, 4.0));

List.Add(new Item(4, 10.5));

List.Add(new Item(5, 1.1));

List.Add(new Item(6, 3.5));

 

Console.WriteLine("Printing List before sorting:");

for (int i = 0; i < List.Count; i++)

{

Item D = (Item)List[i];

Console.WriteLine(D.Id + " = " + D.Difference);

}

 

List.Sort();

 

Console.WriteLine("\nPrinting List in ascending order");

for (int i = 0; i < List.Count; i++)

{

Item D = (Item)List[i];

Console.WriteLine( D.Id + " = " + D.Difference );

}

Console.ReadLine();

 

}

}

 

class Item : IComparable

{

 

#region Members

private int mId;

 

public int Id

{

get { return mId; }

set { mId = value; }

}

 

private double mDifference;

 

public double Difference

{

get { return mDifference; }

set { mDifference = value; }

}

#endregion Members

 

#region Constructor

public Item(int _id, double _diff)

{

this.mDifference = _diff;

this.mId = _id;

}

#endregion Constructor

 

#region Compare Interface

public Int32 CompareTo(Object _item)

{

Item ItemInstance = (Item)_item;

 

if (this.Difference > ItemInstance.Difference)

{

return 1;

}

else

{

return -1;

}

 

}

#endregion Compare Interface

 

 

}

}

Comments [0] | | # 
# Tuesday, December 18, 2007
Tuesday, December 18, 2007 11:52:20 PM (GTB Standard Time, UTC+02:00) ( Articles | C# | Data Compression )

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