Navigation

Search

Categories

On this page

RGB to/from CMYK Color Conversion Resources
Noise Generation
How to Sort ArrayList with ICompare Interface
Image Processing :: Region Properites
Image Processing :: Thresholding :: Otsu Method
Binary Image Processing :: Morphology :: Erosion
Recursive Connected Component Labeling
How to Export Table Data to Flat File :: Oracle UnLoader, Text File Exporter

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: 285
This Year: 16
This Month: 0
This Week: 0
Comments: 0

Sign In
Pick a theme:

# Saturday, May 24, 2008
Saturday, May 24, 2008 10:50:18 AM (GTB Standard Time, UTC+02:00) ( Image Processing )

Online conversion

http://web.forret.com/tools/color.asp?R=100&G=0&B=255

 

codeproject

http://www.codeproject.com/KB/applications/xcmyk.aspx

http://www.codeproject.com/KB/GDI-plus/colorclass.aspx

http://www.codeproject.com/KB/cpp/adobe_cp_clone_part_1.aspx

 

tutorial

http://www.maxostudio.com/Tut_CS_CMYK.cfm

 

wikipedia

http://en.wikipedia.org/wiki/CMYK_color_model

 

RGB->CMY->CMYK conversion

http://www.easyrgb.com/math.php?MATH=M13#text13

 

Sample source

//RGB values = 0 ÷ 255

//CMY values = 0 ÷ 1

 

C = 1 - ( R / 255 )

M = 1 - ( G / 255 )

Y = 1 - ( B / 255 )

 

//Where CMYK and CMY values = 0 ÷ 1

 

var_K = 1

 

if ( C < var_K ) var_K = C

if ( M < var_K ) var_K = M

if ( Y < var_K ) var_K = Y

if ( var_K == 1 ) { //Black

C = 0

M = 0

Y = 0

}

else {

C = ( C - var_K ) / ( 1 - var_K )

M = ( M - var_K ) / ( 1 - var_K )

Y = ( Y - var_K ) / ( 1 - var_K )

}

K = var_K

Comments [0] | | # 
# Saturday, April 26, 2008
Saturday, April 26, 2008 3:43:46 PM (GTB Standard Time, UTC+02: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 8:33:32 AM (GTB Standard Time, UTC+02: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, March 25, 2008
Tuesday, March 25, 2008 11:36:03 PM (GTB Standard Time, UTC+02:00) ( Computer Vision | Image Processing )

Bir resim içindeki parçalar hakkında bilgi sahibi olabilmek, benzerlikler ve farklılıkları bulabilmek amacıyla bu çalışma yapılacaktır. Genel olarak kullanılan özellikler aşağıda belirtilmiştir:

  • Alan : Toplam piksel sayısıdır.
  • Merkez(Centroid) [r',c'] : Satır ve sütundaki toplamların, alana bölünmesidir.
  • Mean Radial Distance: Her bir piksel ile merkez nokta arasındaki farkın ortalamasıdır.
  • Variance Radial Distance : : Her bir piksel ile merkez nokta arasındaki farktan, Mean Radial Distance değerinin farkının karelerinin ortalamalarının kareköküdür.
  • Second-Order Row Moment : Merkez noktasının apsisiyle her bir pikselin apsisinin farkları toplamının, alana oranıdır.
  • Second-Order Column Moment: Merkez noktasının ordinatıyla her bir pikselin ordinatı farkları toplamının, alana oranıdır.
  • Second-Order Mixed Moment: Merkez noktası ile her bir pikselin apsis ve ordinatları farkları çarpımlarının toplamının, alana oranıdır.
  • Circularity2: Mean Radial Distance değerinin Variance Radial Distance değerine oranıdır.
  • Circularity1: Perimeter karesinin alana oranıdır.
  • Perimeter: Şeklin çevresidir. Bu değer, şekil sınırlarının toplamı olarak da hesaplanabilir.

     

    Algoritma ve Kodlama

 

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

public static RegionProperties[] FindRegionsProperties(BinaryPGM _image, int _neighbour)

{

ConnectedComponent CC = new ConnectedComponent(_image, _neighbour);

RegionProperties[] Props = new RegionProperties[CC.LabelCount+1];

byte[][] ImageData = CC.LabeledImage.GetImageDataInMatrixForm();

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

{

Props[i] = new RegionProperties();

Props[i].RegionNumber = i;

}

 

//Props.Length + 1 ::: 0 pixel for background.it will not used

int[] Area = new int[Props.Length + 1];

ArrayOperations.InitializeArray(ref Area, 0);

double[] CentroidRow = new double[Props.Length];

ArrayOperations.InitializeArray(ref CentroidRow, 0);

double[] CentroidColumn = new double[Props.Length];

ArrayOperations.InitializeArray(ref CentroidColumn, 0);

double[] MRD = new double[Props.Length];

ArrayOperations.InitializeArray(ref MRD, 0);

double[] VRD = new double[Props.Length];

ArrayOperations.InitializeArray(ref VRD, 0);

double[] SORM = new double[Props.Length];

ArrayOperations.InitializeArray(ref SORM, 0);

double[] SOCM = new double[Props.Length];

ArrayOperations.InitializeArray(ref SOCM, 0);

double[] SOMM = new double[Props.Length];

ArrayOperations.InitializeArray(ref SOMM, 0);

 

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

{

for (int k = 0; k < ImageData[i].Length; k++)

{

Area[ImageData[i][k]]++;

CentroidColumn[ImageData[i][k]] += k;

CentroidRow[ImageData[i][k]] += i;

}

}

 

 

for (int i = 1; i < Props.Length; i++)

{

Props[i].Area = Area[i];

Props[i].CentroidX = CentroidColumn[i] / Props[i].Area ;

Props[i].CentroidY = CentroidRow[i] / Props[i].Area;

}

 

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

{

for (int k = 0; k < ImageData[i].Length; k++)

{

MRD[ImageData[i][k]] += Math.Abs(Props[ImageData[i][k]].CentroidY - i) + Math.Abs(Props[ImageData[i][k]].CentroidX - k);

}

}

 

for (int i = 1; i < Props.Length; i++)

{

Props[i].MeanRadialDistance = MRD[i] / (_image.Length * _image.Width);

}

 

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

{

for (int k = 0; k < ImageData[i].Length; k++)

{

VRD[ImageData[i][k]] += Math.Pow((Math.Abs(Props[ImageData[i][k]].CentroidY - i) + Math.Abs(Props[ImageData[i][k]].CentroidX - k) - Props[ImageData[i][k]].MeanRadialDistance), 2.0);

SORM[ImageData[i][k]] += Math.Pow(Props[ImageData[i][k]].CentroidY - i, 2.0);

SOCM[ImageData[i][k]] += Math.Pow(Props[ImageData[i][k]].CentroidX - k, 2.0);

SOMM[ImageData[i][k]] += (i - Props[ImageData[i][k]].CentroidY ) * (k - Props[ImageData[i][k]].CentroidX);

}

}

 

for (int i = 1; i < Props.Length; i++)

{

Props[i].VarianceRadialDistance = VRD[i] / (_image.Length * _image.Width);

}

 

for (int i = 1; i < Props.Length; i++)

{

Props[i].Circularity2 = Props[i].MeanRadialDistance / Math.Pow(Props[i].VarianceRadialDistance, 0.5);

}

 

for (int i = 1; i < Props.Length; i++)

{

Props[i].SecondOrderColumnMoment = SOCM[i] / Props[i].Area;

Props[i].SecondOrderRowMoment = SORM[i] / Props[i].Area;

Props[i].SecondOrderMixedMoment = SOMM[i] / Props[i].Area;

}

 

BinaryPGM BoundaryImage = Morphology.GetBoundaryImage(_image);

BoundaryImage.Save("boundary.pgm");

ConnectedComponent CCBoundary = new ConnectedComponent(BoundaryImage, _neighbour);

CCBoundary.LabeledImage.Save("boundary_props.pgm");

byte[] ImageDataBoundary = CCBoundary.LabeledImage.Data;

for (int i = 1; i < Props.Length; i++)

{

Props[i].Perimeter = ArrayOperations.GetArrayElementCount(ImageDataBoundary, (byte)i);

Props[i].Circularity = (Props[i].Perimeter * Props[i].Perimeter) / Props[i].Area;

}

 

return Props;

 

Analiz ve Yorumlar

 

Bu çalışmanın sonuçları aşağıda belirtilmiştir. Şekil 1'de orijinal resim bulunmaktadır. Şekil 2 de ise parçalara ayrılmış resmin numaralandırılmış hali bulunmaktadır. Orijinal resim, 3X3 lük bir yapılandırma elamanı ile Erosion işlemi uygulanıp, orijinal resimden çıkarıldığında sınırlar bulunmuştur. Sınırların alanı, çevre olarak hesaplanmıştır.

 

Şekil 1 Region Properties – Orijinal Resim

 

Şekil 2 Region Properties – Labeled, Numbered

 

Şekil 3 Region Properties – Boundary

 

 

 

1

2

3

4

5

6

7

8

9

10

11

Area

560

2064

2223

1920

458

944

1548

2556

1012

1482

3136

Centroid

52,5; 27,5

146; 58,5

244,58; 78,64

96,5; 90,5

50,5; 95

167,67; 138,78

255,5; 147,5

66; 162,5

250,5; 197,5

180,5; 207,29

71,5; 213,5

Mean Radial Distance

0,11

0,66

0,79

0,7

0,07

0,21

0,42

0,87

0,22

0,4

1,44

Variance Radial Distance

1,71

16,38

23,38

21,24

0,77

3,91

8,96

22,45

3,93

8,5

52,42

Second-Order Row Moment

16,25

213,57

158,69

533,25

44,31

80,76

78,91

222,91

97,75

115,54

85,25

Second-Order Column Moment

133,25

133,23

327,45

47,92

29,96

104,31

192,35

185,63

68,39

127,9

800,25

Second-Order Mixed Moment

0

0

77,23

0

0

12,41

0

0

0

0

0

Circularity2

0,08

0,16

0,16

0,15

0,08

0,11

0,14

0,18

0.11

0.14

0.2

Circularity1

0,08

16,05

36,8

21,68

19,29

32,44

20,93

19,98

16,19

15,59

20,9

Perimeter

104

182

286

204

94

175

180

226

128

152

256

Şekil

Yatay dik dörtgen

Kare

Üçgen

Dikey dik dörtgen

Küre

Üçgen

Elips

Küre

Kare

Kare

Yatay dik dörtgen

Tablo 1 Region Properties Gösterimi

 

Yukarıdaki tablodan çıkarılacak sonuçlar şunlardır:

  • Second-Order Mixed Moment değeri sadece üçgen şeklindeki parçalar için 0 dan farklı çıkmıştır. Üçgen parçaların ayırt edilebilmesi için bu özellik kullanılabilir.

  • Circularity1 değeri, kare parçalar için yaklaşık 16 çıkmıştır. Kare parçaların ayırt edilebilmesi için bu özellik kullanılabilir.

     

 

Uygulama

       

Uygulama, C Sharp(C#) dilinde kodlanmıştır. ComputerVision.exe adlı dosya, çalıştırılabilir halini içermektedir. İş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:\cv>ComputerVision.exe

Computer Vision v1.0.0

Mennan Tekbir

       

Usage:

  ComputerVision <operation> <image>

       

Example:

  ComputerVision 3 peppersgray.pgm

       

Operations :

  1 : Connected Components

  2 : Erosion(Morphology)

  3 : Otsu Thresholding

  4 : Region Properties

Press any key to exit...

       

       

C:\cv>

       

Uygulamayı indirmek için...

ComputerVision.zip (442.9 KB)

Comments [0] | | # 
# Monday, March 24, 2008
Monday, March 24, 2008 10:21:04 AM (GTB Standard Time, UTC+02:00) ( Computer Vision | Image Processing )

 

Resim işlemede en temel kesimleme(segmentation) uygulamalarından biri Thresholding' dir. Resmi binary hale getirmek için kullanılan bu yöntemde en önemli olan, eşik(threshold) değerinin belirlenmesidir. Bu değerin düşük veya yüksek olmasına resmin detayları değişir. Aşağıda bu durumu gösterilmiştir:

 

Şekil 1 Orjinal Resim

Şekil 2 Farklı Eşik Değerlerine göre Resimler

 

Eşik değerinin belirlenmesinde birden fazla yöntem bulunmaktadır. Burada sadece Otsu yöntemi incelenecektir.

Otsu Thresholding

 

Bu yöntem, yinelemeli(iterative) olarak bir eşik değerinin bulunmasını amaçlar. Bu değerin, sınıf-içi varyantın en küçük hale gelmesiyle veya sınıflar-arası varyantın en küçük hale gelmesiyle elde edilir. Bu işlem için öncelikli olarak resmin histogramı çıkarılmalıdır. Aşağıda Otsu yönteminde kullanılan formüller verilmiştir:

 

Şekil 3 Otsu Threshold – Formüller

 

 

Algoritma ve Kodlama

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

 

public OtsuThresholdProperties GetOtsuThreshold( double[] _probabilities )

{

int TMax=-1, i;

double VMax = Double.MinValue;

double N1, N2, N, qt, qt_b, n1t, n1t_b, n2t, n, v;

 

qt_b = _probabilities[0];

n1t_b = 0; N1 = 0; N2 = 0;

 

for ( i = 0; i < _probabilities.Length; i++)

{

n += i*_probabilities[i];

}

N = n;

 

for ( i = 1; i < _probabilities.Length; i++)

{

if (_probabilities[i] != 0)

{

qt = qt_b + _probabilities[i];

if (qt != 1 && qt != 0)

{

n1t = (qt_b * n1t_b + i * _probabilities[i]) / qt;

n2t = (n - qt * n1t) / (1 - qt);

 

v = qt * (1 - qt) * (n1t - n2t) * (n1t - n2t);

 

if (v > VMax)

{

VMax = v;

TMax = i;

N1 = n1t;

N2 = n2t;

}

qt_b = qt;

n1t_b = n1t;

}

}

}

 

return new OtsuThresholdProperties(TMax,N,N1,N2);

 

}

 

Analiz ve Yorumlar

 

Otsu yöntemi ile eşik bulma çalışmasının sonuçları aşağıda belirtilmiştir:

Şekil 4 Peppersgray – Orijinal

 

 

Şekil 5 Pepersgray - Eşik : 116

 

 

Grafik 1 Peppersgray – Histogram

 

 

Şekil 6 Blocks – Orijinal

 

 

Şekil 7 Blocks - Eşik: 111

 

 

Grafik 2 Blocks - Histogram

 

 

Peppersgray

Blocks

Mu1

69,94

24,97

Mu2