<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ahmet Kakıcı &#187; image processing</title>
	<atom:link href="http://www.ahmetkakici.com/tag/image-processing/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ahmetkakici.com</link>
	<description>Blog</description>
	<lastBuildDate>Sun, 03 Apr 2011 10:48:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>C# ile Görüntü İşleme &#8211; 3</title>
		<link>http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-3/</link>
		<comments>http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-3/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 09:27:35 +0000</pubDate>
		<dc:creator>Ahmet Kakıcı</dc:creator>
				<category><![CDATA[Programlama]]></category>
		<category><![CDATA[görüntü işleme]]></category>
		<category><![CDATA[image processing]]></category>
		<category><![CDATA[kod]]></category>

		<guid isPermaLink="false">http://www.ahmetkakici.com/?p=200</guid>
		<description><![CDATA[İlk iki yazının ardından ( 1 &#8211; 2 ) sonunda üçüncü yazıyı da yazabildim. Bu yazıya sadece morfolojik filtreler kaldı. Diğer yazılara gelen yorumlardan sonra açıklamadan çok koda ihtiyaç olduğu anladım, onun için aşağıda genleşme (dilation) ve aşınma (erosion) işlemini yapan fonksiyonları bulacaksınız. Benim kullandığım genleşme ve aşınma maskeleri en basit olanları. Siz kendi maskelerinizi [...]]]></description>
			<content:encoded><![CDATA[<p>İlk iki yazının ardından ( <a title="C# ile Görüntü İşleme - 1" href="http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-1/" target="_self">1</a> &#8211; <a title="C# ile Görüntü İşleme - 2" href="http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-2/" target="_self">2</a> ) sonunda üçüncü yazıyı da yazabildim. Bu yazıya sadece morfolojik filtreler kaldı. Diğer yazılara gelen yorumlardan sonra açıklamadan çok koda ihtiyaç olduğu anladım, onun için aşağıda genleşme (dilation) ve aşınma (erosion) işlemini yapan fonksiyonları bulacaksınız. Benim kullandığım genleşme ve aşınma maskeleri en basit olanları. Siz kendi maskelerinizi if koşulu içine yazarak dilediğiniz gibi kullanabilirsiniz.</p>
<p>Eğer genleşme ve aşınma hakkında daha fazla bilgi istiyorsanız <a title="Dilation" href="http://homepages.inf.ed.ac.uk/rbf/HIPR2/dilate.htm" target="_blank">Dilation</a> &#8211; <a title="Erosion" href="http://homepages.inf.ed.ac.uk/rbf/HIPR2/erode.htm" target="_blank">Erosion</a> bağlantılarını takip edebilirsiniz.<br />
<span id="more-200"></span></p>
<pre class="brush: csharp; title: ; notranslate">
void Dilation()
{
    if (!dilationDone)
    {

        dilationPixelArray = new int[imageWidth, imageHeight];
        for (int i = 1; i &lt; imageWidth - 1; i++)
        {
            for (int j = 1; j &lt; imageHeight - 1; j++)
            {
                if (binaryPixelArray[i, j] == 255)
                {
                    dilationPixelArray[i - 1, j] = 255;
                    dilationPixelArray[i, j - 1] = 255;
                    dilationPixelArray[i, j + 1] = 255;
                    dilationPixelArray[i + 1, j] = 255;
                }
            }
        }
    }
    else
    {
        int[,] tempArray = new int[imageWidth, imageHeight];
        Array.Copy(dilationPixelArray, tempArray, imageWidth * imageHeight);
        for (int i = 1; i &lt; imageWidth - 1; i++)
        {
            for (int j = 1; j &lt; imageHeight - 1; j++)
            {
                if (tempArray[i, j] == 255)
                {
                    dilationPixelArray[i - 1, j] = 255;
                    dilationPixelArray[i, j - 1] = 255;
                    dilationPixelArray[i, j + 1] = 255;
                    dilationPixelArray[i + 1, j] = 255;
                }
            }
        }
    }

}
void Erosion()
{
    if (!erosionDone)
    {
        erosionPixelArray = new int[imageWidth, imageHeight];
        for (int i = 1; i &lt; imageWidth - 1; i++)
        {
            for (int j = 1; j &lt; imageHeight - 1; j++)
            {
                if (binaryPixelArray[i, j] == 255)
                {
                    if (binaryPixelArray[i, j - 1] == 0 ||
                        binaryPixelArray[i - 1, j] == 0 ||
                        binaryPixelArray[i + 1, j] == 0 ||
                        binaryPixelArray[i, j + 1] == 0
                        )
                    {
                        erosionPixelArray[i - 1, j] = 0;
                        erosionPixelArray[i, j - 1] = 0;
                        erosionPixelArray[i, j + 1] = 0;
                        erosionPixelArray[i + 1, j] = 0;
                        erosionPixelArray[i, j] = 0;
                    }
                    else
                    {
                        erosionPixelArray[i, j] = binaryPixelArray[i, j];
                    }
                }
                else
                {
                    erosionPixelArray[i, j] = binaryPixelArray[i, j];
                }
            }
        }
    }
    else
    {
        int[,] tempArray = new int[imageWidth, imageHeight];
        Array.Copy(erosionPixelArray, tempArray, imageWidth * imageHeight);
        for (int i = 1; i &lt; imageWidth - 1; i++)
        {
            for (int j = 1; j &lt; imageHeight - 1; j++)
            {
                if (tempArray[i, j] == 255)
                {
                    if (tempArray[i, j - 1] == 0 ||
                        tempArray[i - 1, j] == 0 ||
                        tempArray[i + 1, j] == 0 ||
                        tempArray[i, j + 1] == 0
                        )
                    {
                        erosionPixelArray[i - 1, j] = 0;
                        erosionPixelArray[i, j - 1] = 0;
                        erosionPixelArray[i, j + 1] = 0;
                        erosionPixelArray[i + 1, j] = 0;
                        erosionPixelArray[i, j] = 0;
                    }
                    else
                    {
                        erosionPixelArray[i, j] = tempArray[i, j];
                    }
                }
                else
                {
                    erosionPixelArray[i, j] = tempArray[i, j];
                }
            }
        }
    }
}
</pre>
<p>Bundan önceki yazılardaki yapıyı kullandığınızı varsayarak yukarıdaki iki fonksiyonu aşağıdaki şekilde çağırmanız gerekli. Bu fonksiyonların yaptığı iş ise eğer resim ikili seviyeye indirgenmemişse (siyah-beyaz) önce bu işlemi yapmak. Tabii ikiliye çevirmek için herhangi bir eşik değeri belirlenmemişse otsu fonksiyonunu çağırarak önce bir eşik değeri hesaplatıyoruz. Binary fonksyionu ise 0-255 arasındaki parametreyi eşik değeri olarak kullanarak resmi ikili seviyeye indirgiyor, parametrenin 256 olması ise otsu ile hesaplanan eşik değerini alması içindir.</p>
<pre class="brush: csharp; title: ; notranslate">
public void ShowDilation()
{
    if (!dilationDone)
    {
        if (!binaryDone)
        {
            if (otsuValue == 0)
                Otsu();
            Binary(256);
        }
        Dilation();
        dilationDone = true;
    }
    else
    {
        Dilation();
    }
    SetImage(ref dilationPixelArray);
}

public void ShowErosion()
{
    if (!erosionDone)
    {
        if (!binaryDone)
        {
            if (otsuValue == 0)
                Otsu();
            Binary(256);
        }
        Erosion();
        erosionDone = true;
    }
    else
    {
        Erosion();
    }
    SetImage(ref erosionPixelArray);
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-3/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>C# ile Görüntü İşleme &#8211; 2</title>
		<link>http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-2/</link>
		<comments>http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-2/#comments</comments>
		<pubDate>Fri, 02 Jan 2009 14:31:41 +0000</pubDate>
		<dc:creator>Ahmet Kakıcı</dc:creator>
				<category><![CDATA[Programlama]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[görüntü işleme]]></category>
		<category><![CDATA[image processing]]></category>
		<category><![CDATA[kod]]></category>

		<guid isPermaLink="false">http://www.ahmetkakici.com/?p=105</guid>
		<description><![CDATA[Daha önce görüntü okuma, gösterme ve kaydetme gibi başlıca fonksiyonları vermiştim. Aşağıda ise asıl görüntüyü işeyecek fonksiyonlar bulunmaktadır. Tabii buradaki fonksiyonları kullanbilmek için daha önceden verdiğim şekilde görüntünün dizilere aktarılmış olması gerekiyor. Önceki yazıda gri seviyeye çevirilmiş görüntümüz vardı eğer bu görüntüyü siyah beyaza çevirmek istiyorsanız bunun için bir eşik değeri seçerek 0-255 arasındaki gri [...]]]></description>
			<content:encoded><![CDATA[<p>Daha önce görüntü okuma, gösterme ve kaydetme gibi başlıca fonksiyonları <a href="http://www.ahmetkakici.com/yazilim/goruntu-isleme-c/" target="_blank">vermiştim</a>. Aşağıda ise asıl görüntüyü işeyecek fonksiyonlar bulunmaktadır. Tabii buradaki fonksiyonları kullanbilmek için daha önceden verdiğim şekilde görüntünün dizilere aktarılmış olması gerekiyor.</p>
<p>Önceki yazıda gri seviyeye çevirilmiş görüntümüz vardı eğer bu görüntüyü siyah beyaza çevirmek istiyorsanız bunun için bir eşik değeri seçerek 0-255 arasındaki gri seviye görüntüyü bu seviyeye göre siyah veya beyaz olarak ayırmak gerekiyor. Eşik değerini sabit bir değer olarak belirleyebileceğiniz gibi her görüntüye göre dinamik olarak bir eşik değeri belirleyebilen bir yöntem de mevcuttur: otsu. Otsu algoritması sayesinde üzerinde çalıştığınız görüntüye özel bir eşik değerini otomatik olarak belirleyebilirsiniz. Bunun için görüntünün histogram dizisine ihtiyacınız olacak. İlk yazıda verdiğim kodda histogram çıkartma özelliği yoktu. Bunun için aşağıdaki kodu kullanabilirsiniz:</p>
<p><span id="more-105"></span></p>
<pre class="brush: csharp; title: ; notranslate">

int[,] pixelArray = new int[pictureBox1.Image.Height, pictureBox1.Image.Width];
int[,] greyPixelArray = new int[pictureBox1.Image.Height, pictureBox1.Image.Width];
int[] histogram = new int[256];

void BuildPixelArray(ref Image myImage)
{
pixelArray = new int[imageWidth, imageHeight];
greyPixelArray = new int[imageWidth, imageHeight];
Rectangle rect = new Rectangle(0, 0, myImage.Width, myImage.Height);
Bitmap temp = new Bitmap(myImage);
BitmapData bmpData = temp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int remain = bmpData.Stride - bmpData.Width * 3;
unsafe
{
byte* ptr = (byte*)bmpData.Scan0;
for (int j = 0; j &lt; bmpData.Height; j++)
{
for (int i = 0; i &lt; bmpData.Width; i++)
{
pixelArray[i, j] = ptr[0] + ptr[1] * 256 + ptr[2] * 256 * 256;
greyPixelArray[i, j] = (int)((double)ptr[0] * 0.11 + (double)ptr[1] * 0.59 + (double)ptr[2] * 0.3);
histogram[greyPixelArray[i, j]]++;
ptr += 3;
}
ptr += remain;
}
}
temp.UnlockBits(bmpData);
}
</pre>
<p>Burada histogram dizisini de oluşturduktan sonra artık otsu algoritması sayesinde dinamik olarak eşik değerini belirleyebiliriz:</p>
<pre class="brush: csharp; title: ; notranslate">

int otsuValue;

void Otsu()
{
double fmax = -1.0;
double m1, m2, S, toplam1 = 0.0, toplam2 = 0.0;
int nTop = 0, n1 = 0, n2;

for (int i = 0; i &lt; 256; i++)
{
toplam1 += (double)i * (double)histogram[i];
nTop += histogram[i];
}

for (int i = 0; i &lt; 256; i++)
{
n1 += histogram[i];
if (n1 == 0)
continue;
n2 = nTop - n1;
if (n2 == 0)
break;
toplam2 += (double)i * (double)histogram[i];
m1 = toplam2 / n1;
m2 = (toplam1 - toplam2) / n2;
S = (double)n1 * (double)n2 * (m1 - m2) * (m1 - m2);
if (S &gt; fmax)
{
fmax = S;
otsuValue = i;
}
}
}
</pre>
<p>Otsu veya sabit bir değere göre görüntüyü siyah beyaza çevirecek kod ise aşağıdadır. Bu fonksiyonun aldığı argThreshold parametresi eşik değerini belirtern 0-255 arasında bir değerdir.</p>
<pre class="brush: csharp; title: ; notranslate">

void Binary(int argThreshold)
{
binaryPixelArray = new int[imageWidth, imageHeight];
for (int i = 0; i &lt; imageWidth; i++)
{
for (int j = 0; j &lt; imageHeight; j++)
{
if (greyPixelArray[i, j] &lt; threshold)
binaryPixelArray[i, j] = 0;
else
binaryPixelArray[i, j] = 255;
}
}
}
</pre>
<p>Görüntüyü siyah beyaza çevirdikten sonra eğer kenar bulma algoritmalarını kullanmak isterseniz bir kaç seçeneğiniz mevcut. Bunlardan en popüleri sobel kenar bulma filtresidir. Aşağıdaki fonksiyonda type parametresi hangi tür kenarların bulunacağını belirtmek içindir. Dikey, yatay, köşegen şeklindeki kenarları veya tamamını ayrı ayrı bulabilirsiniz.</p>
<pre class="brush: csharp; title: ; notranslate">

void Sobel(int type)
{
int normalizeMax = 0;
int normalizeMin = maxIntVal;

sobelPixelArray = new int[imageWidth, imageHeight];
int[,] sobelArray1 =
new int[3, 3] {
{ 1, 0, -1 },
{ 2, 0, -2 },
{ 1, 0, -1 }
};

int[,] sobelArray2 =
new int[3, 3] {
{ 1, 2, 1 },
{ 0, 0, 0 },
{-1,-2,-1 }
};
int[,] sobelArray3 =
new int[3, 3] {
{ 2, 1, 0 },
{ 1, 0,-1 },
{ 0,-1,-2 }
};

int G1, G2, G3;
for (int i = 1; i &lt; imageWidth - 1; i++)
{
for (int j = 1; j &lt; imageHeight - 1; j++)
{
G1 = 0;
G2 = 0;
G3 = 0;
for (int k = -1; k &lt; 2; k++)
{
for (int l = -1; l &lt; 2; l++)
{
G1 += greyPixelArray[i + k, j + l] * sobelArray1[k + 1, l + 1];
G2 += greyPixelArray[i + k, j + l] * sobelArray2[k + 1, l + 1];
G3 += greyPixelArray[i + k, j + l] * sobelArray3[k + 1, l + 1];
}
}
if(type == 0)
{
sobelPixelArray[i, j] = Math.Abs(G1) + Math.Abs(G2) + Math.Abs(G3);
}
else if (type == 1)
{
sobelPixelArray[i, j] = Math.Abs(G2);
}
else if (type == 2)
{
sobelPixelArray[i, j] = Math.Abs(G1);
}
else if (type == 3)
{
sobelPixelArray[i, j] = Math.Abs(G3);
}

if (normalizeMax &lt; sobelPixelArray[i, j])
normalizeMax = sobelPixelArray[i, j];
if (normalizeMin &gt; sobelPixelArray[i, j])
normalizeMin = sobelPixelArray[i, j];
}
}

NormalizeArray(ref sobelPixelArray, normalizeMax, normalizeMin);
}
</pre>
<p>Yukarıda bulunan kodun en altında çağırılan normalize fonksiyonu ise sonuç dizisini 0-255 değerleri arasına düşürmek içindir:</p>
<pre class="brush: csharp; title: ; notranslate">

void NormalizeArray(ref int[,] sourceArray,int normalizeMax,int normalizeMin)
{

int factor = normalizeMax - normalizeMin;
for (int i = 0; i &lt; sourceArray.GetLength(0); i++)
{
for (int j = 0; j &lt; sourceArray.GetLength(1); j++)
{
sourceArray[i, j] = (sourceArray[i, j] - normalizeMin) * 255 / factor;
}
}
}
</pre>
<p>Bir diğer kenar bulma yöntemi ise Prewitt&#8217;tir:</p>
<pre class="brush: csharp; title: ; notranslate">

int[,] prewittPixelArray;

void Prewitt()
{
int normalizeMax = 0;
int normalizeMin = maxIntVal;
prewittPixelArray = new int[imageWidth, imageHeight];
int[,] PrewittArray1 =
new int[3, 3] {
{-1,-1,-1 },
{ 0, 0, 0 },
{ 1, 1, 1 }
};

int[,] PrewittArray2 =
new int[3, 3] {
{ -1, 0, 1 },
{ -1, 0, 1 },
{ -1, 0, 1 }
};
int[,] PrewittArray3 =
new int[3, 3] {
{-1,-1, 0 },
{-1, 0, 1 },
{ 0, 1, 1 }
};

int[,] PrewittArray4 =
new int[3, 3] {
{ 1, 1, 0 },
{ 1, 0,-1 },
{ 0,-1,-1 }
};

int G1, G2, G3, G4;
for (int i = 1; i &lt; imageWidth - 1; i++)
{
for (int j = 1; j &lt; imageHeight - 1; j++)
{
G1 = 0;
G2 = 0;
G3 = 0;
G4 = 0;
for (int k = -1; k &lt; 2; k++)
{
for (int l = -1; l &lt; 2; l++)
{
G1 += greyPixelArray[i + k, j + l] * PrewittArray1[k + 1, l + 1];
G2 += greyPixelArray[i + k, j + l] * PrewittArray2[k + 1, l + 1];
G3 += greyPixelArray[i + k, j + l] * PrewittArray3[k + 1, l + 1];
G4 += greyPixelArray[i + k, j + l] * PrewittArray4[k + 1, l + 1];
}
}

prewittPixelArray[i, j] = Math.Abs(G1) + Math.Abs(G2) + Math.Abs(G3) + Math.Abs(G4);
if (normalizeMax &lt; prewittPixelArray[i, j])
normalizeMax = prewittPixelArray[i, j];
if (normalizeMin &gt; prewittPixelArray[i, j])
normalizeMin = prewittPixelArray[i, j];
}
}

int factor = normalizeMax - normalizeMin;
for (int j = 1; j &lt; imageHeight - 1; j++)
{
for (int i = 1; i &lt; imageWidth - 1; i++)
{
prewittPixelArray[i, j] = (prewittPixelArray[i, j] - normalizeMin) * 255 / factor;
}
}
}
</pre>
<p>Prewitt ve sobel&#8217;e alternatif olarak Robert kenar bulma filtresi de mevcuttur :</p>
<pre class="brush: csharp; title: ; notranslate">

int[,] robertPixelArray;

void Robert()
{

robertPixelArray = new int[imageWidth, imageHeight];
for (int i = 1; i &lt; imageHeight - 1; i++)
{
for (int j = 1; j &lt; imageWidth - 1; j++)
{
robertPixelArray[j, i] = Math.Abs(greyPixelArray[j, i] - greyPixelArray[j - 1, i - 1]) + Math.Abs(greyPixelArray[j, i - 1] - greyPixelArray[j - 1, i]);
}
}
}
</pre>
<p>Eğer kenar bulma algoritmalarını kullanmadan önce görüntüdeki gürültüleri temizlemek istiyorsanız mean, median ve gaussian filtereleri ile bu işlemi yapabilirsiniz.</p>
<p>Mean filtresi :</p>
<pre class="brush: csharp; title: ; notranslate">

int[,] meanPixelArray;

void Mean()
{
meanPixelArray = new int[imageWidth, imageHeight];
for (int i = 1; i &lt; imageHeight - 1; i++)
{
for (int j = 1; j &lt; imageWidth - 1; j++)
{
meanPixelArray[j, i] =
(
greyPixelArray[j, i - 1]
+ greyPixelArray[j, i + 1]
+ greyPixelArray[j, i]
+ greyPixelArray[j - 1, i - 1]
+ greyPixelArray[j - 1, i + 1]
+ greyPixelArray[j - 1, i]
+ greyPixelArray[j + 1, i - 1]
+ greyPixelArray[j + 1, i + 1]
+ greyPixelArray[j + 1, i]
) / 9;
}
}
}
</pre>
<p>Median filtresi:</p>
<pre class="brush: csharp; title: ; notranslate">

int[,] medianPixelArray;

void Median()
{

medianPixelArray = new int[imageWidth, imageHeight];
int[] tempArray = new int[9];
for (int i = 1; i &lt; imageHeight - 1; i++)
{
for (int j = 1; j &lt; imageWidth - 1; j++)
{
int counter = 0;
for (int k = -1; k &lt; 2; k++)
{
for (int l = -1; l &lt; 2; l++)
{
tempArray[counter++] = greyPixelArray[j + l, i + k];
}
}
System.Array.Sort(tempArray);
medianPixelArray[j, i] = tempArray[4];
}
}
}
</pre>
<p>Gaussian filtresi</p>
<pre class="brush: csharp; title: ; notranslate">

int[,] gaussianPixelArray;

void Gaussian()
{
gaussianPixelArray = new int[imageWidth, imageHeight];

int[,] gaussianArray =
new int[5, 5] {
{1,4,7,4,1},
{4,16,26,16,4},
{7,26,41,26,7},
{4,16,26,16,4},
{1,4,7,4,1}
};
int tempSum;
for (int i = 2; i &lt; imageHeight - 2; i++)
{
for (int j = 2; j &lt; imageWidth - 2; j++)
{
tempSum = 0;
for (int k = -2; k &lt; 3; k++)
{
for (int l = -2; l &lt; 3; l++)
{
tempSum += greyPixelArray[j + l, i + k] * gaussianArray[k + 2, l + 2];
}
}
gaussianPixelArray[j, i] = tempSum / 273;
}
}
}
</pre>
<p>Daha sonraki yazıda yapısal (morfolojik) işlemleri yapan filtreleri de açıklamalarıyla birlikte vermeyi düşünüyorum. O zamana kadar hepinize kolay gelsin.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-2/feed/</wfw:commentRss>
		<slash:comments>34</slash:comments>
		</item>
		<item>
		<title>Biyometrik Tanıma Sistemleri</title>
		<link>http://www.ahmetkakici.com/genel/biyometrik-tanima-sistemleri/</link>
		<comments>http://www.ahmetkakici.com/genel/biyometrik-tanima-sistemleri/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 12:41:34 +0000</pubDate>
		<dc:creator>Ahmet Kakıcı</dc:creator>
				<category><![CDATA[Genel]]></category>
		<category><![CDATA[biyometri]]></category>
		<category><![CDATA[görüntü işleme]]></category>
		<category><![CDATA[image processing]]></category>

		<guid isPermaLink="false">http://www.ahmetkakici.com/?p=100</guid>
		<description><![CDATA[Biyometri konusunun gitgide yaygınlaştığı günlerde bu konuda araştırma yapacaklara özel, hazır araştırılmışı var diyorum ve yazıma geçiyorum. Biyometri Nedir? Biyometri insanları birbirinden ayırt edebilecek fiziksel özelliklerini ve sergiledikleri davranışları inceleyen bilim dalıdır.  İnsanları birbirinden ayırt edebilme şansını bize sunduğundan dolayı biyometri bir kimlik doğrulama sistemi olarakta kullanılmaktadır. Biyometrik tanıma sistemleri bir bireyin gerçekten ‘kim’ olduğunu [...]]]></description>
			<content:encoded><![CDATA[<p>Biyometri konusunun gitgide yaygınlaştığı günlerde bu konuda araştırma yapacaklara özel, hazır araştırılmışı var diyorum ve yazıma geçiyorum.</p>
<p><strong>Biyometri Nedir?</strong></p>
<p>Biyometri insanları birbirinden ayırt edebilecek fiziksel özelliklerini ve sergiledikleri davranışları inceleyen bilim dalıdır.  İnsanları birbirinden ayırt edebilme şansını bize sunduğundan dolayı biyometri bir kimlik doğrulama sistemi olarakta kullanılmaktadır. Biyometrik tanıma sistemleri bir bireyin gerçekten ‘kim’ olduğunu kanıtlamasına olanak sağlar.</p>
<p><span id="more-100"></span><br />
İnsanların bunu yapması için ek olarak bir kart, cihaz, kimlik taşımamaları ve şifre gibi ezbere dayalı bilgileri kafalarında tutmamaları ise bu biyometrik tanımanın önemli avantajlarındandır. Unutulması veya başkası tarafından kullanılması söz konusu olmayan bir kimlik onaylama yoludur. Bu sayede kimlik, pasaport, ehliyet gibi kartların yerini tamamen alacak bir sistem geliştirilebilir. Hem daha güvenli hemde aşılması zor sistemler gün geçtikçe orataya çıkacaktır. Örneğin üniversitemizin giriş kapısında bulunan kapılarda manyetik kartlar yerine araç sürücüsünü tanıyarak girişne izin veren bir sistemin kullanılması çok daha güvenli ve mantıklı olacaktır. Bu sayede yetki verilen kişi başka araçla da giriş yapabildiği gibi, yetkisiz bir kişi herhangi bir kartla giriş yapamayacaktır.</p>
<p>Biyometrik tanımada kullanılacak birden fazla yöntem vardır. Gereksinimlere göre bu yöntemlerden biri veya birkaçı kullanılabilir. Birden fazla yöntemi bir arada kullanmak sonuçları kesinleştirmek için gerekli olabilir. Bu yöntemler her zaman doğru sonuçları vermeyebilir, bundan dolayı kullanım alanına göre yüksek başarı sağlayanlar seçilmelidir. Başarı oranının yanı sıra tanıma işleminin gerçekleşmesi için gereken sürede yöntemlerin seçilmesinde dikkate alınmalıdır. Gerçek zamanlı (real-time) tespit yapmak gerektiğinde yöntem seçimine çok daha fazla dikkat edilmelidir.</p>
<p>Genel olarak bu sistemlerin çalışma prensibi; her yöntemin kendine ait girdi cihazıyla alınan verilerin analiz edilip daha önceden girilmiş değerlerle karşılarşıtırılıp eşleştirilmesine dayanmaktadır. Bilgisayarların birim zamanda yaptığı işlem sayısının sürekli artması  göz önüne alındığında eldeki veriler ile anlık olarak alınan örneğin karşılaştırılma hızı da gittikçe artmaktadır. Saniyeler içinde yüzbinlerce veriyi karşılaştırıp doğru sonuçları veren sistemler günümüzde çeşitli alanlarda kullanılmaktadır.</p>
<p><strong>Biyometrinin Tarihi</strong><br />
İnsanoğlu biyometrik tanımayı doğduğu andan itibaren yapmaya başlar. Yeni doğan bebekeler gerek annesini gerek çevresindeki diğer kişi ve cisimleri sıfırdan başlayarak öğrenir. Bu öğrenme işlemini veritabanına ilk bilgilerin girilmesi olarak düşünebiliriz. Yeni doğan bebekler örneğine dönersek bu bebekler daha sonradan gördüğü, duyduğu yani duyu organlarıyla algıladığı her şeyi önceki veriler ile karşılaştırıp belirli sonuçlar elde ederek tanıma işlemini yapar. Örneğin annesini sesinden ve kokusundan rahatlıkla tanıyabilir. Beynimiz bu tanıma işlemlerini otomatik olarak yapmaya başlar ve genellikle mükemmele yakın başarı sağlar.</p>
<p>Beynimiz tarafından otomatik olarak yaptığımız bu tanımanın yanı sıra sistematik olarak yapılan tanımanın ilk örnekleri insanoğlunun tarihi kadar eski değildir. Binlerce yıl önce yaşamış insanların birbirlerini göz rengi, ten rengi, boy gibi kolaylıkla ölçülen özelliklerle kesin olarak ayırt ettikleri konuyla ilgili kaynaklarda belirtilmektedir.</p>
<p>Birçok yeni teknolojinin geliştirilmesinde olduğu gibi biyometrinin de gelişiminde güvenlik unsuru öncülük etmiştir. Biyometrik tanıma birçoğumuzun filmlerden aşina olduğu parmak izinden suçluyu tespit etme gibi yöntemlerle hala kullanılmaktadır. Hızla gelişen teknoloji sayesinde parmak izinin yanı sıra günümüzde bir çok yöntem ile bu tip suçlu tespiti yapılmaktadır. Bunların en bilindik olanlarından biriyse DNA testidir. İnsanların DNA’larının birbirinden farklı olduğu dış görünüşümüne de yansıdığı gibi belirgin bir şekilde ortadadır. Tek yumurta ikizleri haricinde (tek yumurta ikizlerinin parmak izleri birbirinden farklıdır) bir insanın başka bir insanla aynı DNA’ya sahip olmadığından dolayı günümüzde bu testlerde geçerliliğini korumaktadır.</p>
<p><strong>Başlıca Biyometrik Yöntemler ve Çalışma Prensipleri</strong></p>
<p>Biyometrik yöntemlerin genel çalışma prensibi iki adımdan oluşmaktadır. Birinci adımda tanınacak kişinin ilgili yönteme ait bilgiler gerekli araçlar vasıtasıyla bilgisayar ortamına aktarılıyor. Bu bilgiler yine yönteme özel algoritmalar sayesinde analiz ediliyor ve kişiyi tanımlayacak parametreler bu bilgiler içinden seçilerek veritabanına kayıt ediliyor. İkinci adım ise kişinin kimlik doğrulama isteğidir. Bu adımda sisteme aynı araçlar vasıtasyıla girilen bilgiler genellikle kayıt sisteminde uygulanan aynı algoritmayla analiz edilip veritabanındaki bilgilerle karşılaştırılıp eşleştirmelere bakılıyor. Eğer eşleşme varsa kişinin kimliği onaylanmıştır aksi halde sistemde bir sorun yoksa kişi iddia ettiği kimliğe sahip değildir.</p>
<p>Yukarıda geçen birinci adımında gerekli olan algoritmalar yöntemler arasında büyük farklılıklar göstermektedir. Örneğin ses ve parmak izi tanıma arasında bilgiyi dijital ortama aktaran araçlardan bu bilginin analizinde kullanılan algoritmaya kadar çoğu araç ve yazılım farklıdır. Ancak sisteme alınan bilgilerin işlenişi çoğunda ortaktır. Hangi yöntemde olursa olsun analogdan dijitale çevirilen veri içinden belirli özellikler seçilir. Bu özellik seçimi sonucunda ortaya çıkan veriler bizim karşılaştırma ve kayıt fonksiyonlarına vereceğimiz parametrelerdir. Bu parametrelerin sayısı arttıkça tanıma işleminin doğruluğu artar. Ancak doğru orantılı bir artış söz konusu değildir. Belirli bir limitten sonra parametre sayısının arttırılması sadece sisteme ek yük getirecektir ve tanıımanın doğruluğu üzerinde bir etki etmeyecektir.    Örneğin bir kişiyi tanımak için sadece boyunu parametre olarak alırsak aynı boyda iki insanı ayırt edemeyiz. Bunun yanı sıra eğer kişilerin kilolarını da parametre alırsak başarı oranımız artar.  Kişinin vücudundaki bütün ölçüleri almanın bir anlamının olmayacağı ortadadır.</p>
<p>Biyometrik tanıma işlemindeki bu iki adıma dört ayrı katman olarak bakabiliriz:</p>
<ul>
<li>Yönteme ait cihazlar ile analog ortamdan dijital ortama veri aktarımı</li>
</ul>
<ul>
<li>Dijital ortamda aktarılan verilerden gerekli parametrelerin çıkarılması</li>
</ul>
<ul>
<li>Bu parametrelerin önceki verilerle karşılaştırılması</li>
</ul>
<ul>
<li>Karşılaştırma işleminin yapılması için gerekli olan verileri tutacak veritabanı</li>
</ul>
<p>Analog ortamdan dijital ortama veri aktarımı sırasında kayıt esnasındaki ortamın <strong>tamamen</strong> aynısını oluşturmak çok zordur. Bundan dolayı çıkarılacak parametrelerin çevre koşullarının değişimine karşı sabit kalması veya sonucu etkilemeyecek kadar az değişmesine dikkat edilmelidir.</p>
<p>Örneğin bir ses tanıma sisteminde kayıt esnasında kişi mikrofona konuştuğu zaman çevredeki seslerde kayıt altına alınacaktır. Kimlik doğrulama için aynı kişi tekrar mikrofona konuştuğunda ise çevredeki seslerin (gürültülerin) aynı olamaz. Bundan dolayı tanıma işleminde kullanılacak parametreler özenle seçilmelidir.</p>
<p>Bu tip yanlış algılama olasılıklarının olduğu biyometrik tanıma yöntemlerinin kıyaslanması için aşağıdaki terimler ileri sürülmüştür:</p>
<ul>
<li><strong>False Accept Rate (FAR) </strong>: Sistemin veritabanında bulunmayan bir kişiye ait bilgileri yanlış analiz etmesinden ve veritabanında bulunan biriyle eşleştirmesinden kaynaklanan yanlış tespitlerin oranıdır.</li>
</ul>
<ul>
<li><strong>False Reject Rate (FRR)</strong> : Sistemin veritabanında varolan kişileri sonraki bir tarama sonucunda bulamamasının oranıdır.</li>
</ul>
<p>Bu iki orana bakılarak tanıma yöntemleri birbirleriyle kıyaslanabilir.</p>
<p><strong>i.    Parmak İzi Tanıma</strong></p>
<p><strong>Tarihçe:</strong><br />
Parmak izinin oldukça eski bir tarihi vardır. Nehemiah Grew (1684), Marcello Malpighi (1686)  ve  J. E. Purkinje (1823)  adlı bilimadamları parmak izlerinin birtakım özellikler barındırdığına dikkat çekmiş olmalarına rağmen bu özelliklerin kişi tespitinde kullanacak kadar benzersiz olduğunu ortaya sürecek herhangi bir çalışma yapmamışlardır.</p>
<p>Günümzüde kullanılan yöntemlerin temeli olarak kullanılan parmak izi tanıma sistemlerinin temeli ise Henry Faulds ve Wiliam James Herschel adında iki İngilizin bilimadamının çalışmalarıyla başlamıştır. Bu iki bilimadamı kişilerin parmak izlerini alma yöntemleri üzerine çalışmışlar ve temel olarak mürekkep kullanımının üzerine gitmişlerdir.</p>
<p>Sir Francis Galton (1822-1911)  istatistik üzerine yaptığı çalışmalar soncunda iki bağımsız değişken arasındaki doğrusal ilişkinin yönünün ve kuvvetini belirten korelasyon (correlation) yöntemini ileri sürmüştür. Bu sayede iki örüntü (pattern) arasında karşılaştırma yapacak bir yöntem elde etmiştir. Çalışmalarının devamında insanların parmak izleri arasındaki farkı sınıflandırıp ayırt edecek yöntemler ortaya çıkarmıştır. Galton parmak izinin kalıtımsal olmadığını ve her insanın parmak izinin birbirinden farklı olacağını çalışmalarıyla ortaya çıkarmıştır.</p>
<p>Galton’un çalışmalarını takiben Dr Henry Faulds (1983-1930) parmak izinin sınıflandırılmasına tam olarak açıklık getirmiştir. Farklı sınıflandırmala olsa bile Galnton ve Henry’nin yaptığı çalışmaların ürünü olan sınıflandırma sistemi yaygın olarak kullanılmaktadır.</p>
<p>Günümüzdeki sistemlerde bu sınıflandırma genelde iki parmaktan alınan örnekler üzerinde gerçekleştirilmektedir. Tek parmaktan alınan bilgi ile de aynı işlem yapılabilir olmasına rağmen güvenlik ve stabil çalışma açısından en az iki parmak izi alınmaktadır. 25 Haziran 2007’de ABD’de sınır kapılarında bundan sonra iki değil on parmak izinin birden alınacağı bir sisteme geçileceğini açıklamıştır.</p>
<p>Ülkemizde parmak izinin incelenilmesi ve biyometrik tanıma olarak kullanılması 1910 yılında Macar asıllı Yusuf Cemil tarafından başlatılmıştır. Daha sonra ise polis teşkilatı tarafından kullanılmıştır.</p>
<p><strong> Özellikleri:</strong><br />
Galton ve Henry’nin çalışmaları sonucunda ortaya çıkan sınıflar çizgilerin şekline göre ayrılmaktadır ve bu sınıflar aşağıdaki gibidir:</p>
<ul>
<li>Yay (arch)</li>
<li>Döngü (loop)</li>
<li>Helezon (whorl)<a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/turler.jpg"><img class="aligncenter size-full wp-image-101" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/turler.jpg" alt="" /></a></li>
</ul>
<p style="text-align: center;">Yay (Arch)                      Döngü (Loop)               Helezon (Whorl)</p>
<p>Daha detaylı işlemler için bu sınıflarda alt sınılara bölünmektedir.</p>
<p>Bu sınıflandırmaların yanı sıra parmak izlerine çizgi bazında bakıldığında belirli özelliklere sahip noktalar ortaya çıkmaktadır.</p>
<ul>
<li>Eni boyuna neredeyse eşit olan çizgiler nokta (ridge dots) olarak alandırılır</li>
<p><a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/1.jpg"><img class="size-full wp-image-101 alignnone" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/1.jpg" alt="" width="138" height="58" /></a></p>
<li>Noktalardan daha uzun olan ve değişken boyutlu çizgilerde vardır ve ada (island) olarak adlandırılır</li>
<p><a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/2.jpg"><img class="size-full wp-image-101" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/2.jpg" alt="" /></a></p>
<li>Bir çizginin bölünüp birden çok çizgiye ayrılıdığı noktalar çatal (bifurcation) olarak adlandırılır</li>
<p><a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/3.jpg"><img class="size-full wp-image-101" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/3.jpg" alt="" /></a><br />
Karşılıklı çatal (opposed bifurcation)<br />
<a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/4.jpg"><img class="size-full wp-image-101" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/4.jpg" alt="" /></a><br />
İkili Çatal (double bifurcation)<br />
<a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/5.jpg"><img class="size-full wp-image-101" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/5.jpg" alt="" /></a><br />
Üçlü Çatal (trifurcation)</p>
<p><a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/6.jpg"><img class="size-full wp-image-101" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/6.jpg" alt="" /></a></ul>
<ul>
<li>Çizgilerin bitiş noktalarıda özel olarak ele alınır<br />
<a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/7.jpg"><img class="size-full wp-image-101" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/7.jpg" alt="" /></a></li>
<li>Birden fazla çizginin kesiştiği noktalarda özel olarak ele alınır<br />
<a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/8.jpg"><img class="size-full wp-image-101" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/8.jpg" alt="" /></a></li>
<li>Bir çizginin çatallaşıp kısa bir mesafe sonra tekrar birleşmesi sonucunda oluşan kapalı yapıya göl (lake) adı verilir.<br />
<a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/9.jpg"><img class="size-full wp-image-101" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/9.jpg" alt="" /></a></li>
<li>Paralel giden iki çizgiyi birleştiren kısa çizgilere de köprü (bridge) adı verilir.<br />
<a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/10.jpg"><img class="size-full wp-image-101" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/10.jpg" alt="" /></a></li>
</ul>
<p>Parmak izi tanıma işlemi korelasyon yöntemiyle yapıldığı gibi yukarıda belirtilen özel noktaların yer ve sırasına göre de yapılabilir. İkinci işlem için graf yapısı oluşturulmalıdır. Korelasyon işleminin doğru sonuç verebilmesi yön bilgisine de bağlı olduğundan örnek alınırken buna dikkat edilmelidir.</p>
<p>Parmak izinden gerekli özellikleri çıkarmak için belli başlı görüntü işleme tekniklerini uygulanmaktadır.</p>
<ul>
<li>Görüntünün gürültülerden arındırılması</li>
<li>Kenar algılama</li>
<li>Özelliklerin çıkarılması</li>
</ul>
<p>Parmak izinin gürültülerden arındırılması işleminde belirli filtreler kullanılır. Median, mean ve gaussian gibi filtreler bunlardan bazılarıdır.</p>
<p>Kenar algılama filtreleri olarak sobel, gradient, prewitt gibi filtrelerl kullanılır.</p>
<p>Özellik çıkarma işlemi için kenar algılama sonucunda elde edilen görüntüde inceltme algoritmaları uygulanıp çizgiler özellik çıkarma için uygun hale getirilir. Daha sonra çizgilerin bitiş ve çatal noktaları elde edilir.</p>
<p><strong>Avantajları:</strong></p>
<ul>
<li>Parmak izinin kolaylıkla alınabilmesi.</li>
<li>İkizlerde bile farklılık gösterir.</li>
<li> Parmak izinin değiştirilip bir başka parmak izine benzetilmesi zordur</li>
<li> Belirli özelliklerinin çıkarılıp sadece bu özelliklerin saklanması sayesinde hızlı arama yapılabilir.</li>
</ul>
<p><strong>Dezavantajları:</strong></p>
<ul>
<li> Örnek alınan parmağın yıpranması sonucu aynı izin tekrar elde edilemeyebilir.</li>
<li> Kişinin kilo alması gibi fiziksel değişimlerden parmağında etkilenmesi ve parmak izinin eskisiyle örtüşmeyecek hale gelmesi mümkündür.</li>
<li> Parmak izinin kalıbının kendisi yerine kullanılma ihtimali vardır.</li>
</ul>
<p><strong>ii.    Yüz Tanıma</strong><br />
<strong></strong></p>
<p><strong> Tarihçe:</strong><br />
İnsan yüzü parmakta olduğu gibi özelliklerinin kolay çıkarılabileceği bir yapıya sahip olmadığınadan yüz tanımanın gelişimi ve kullanımı parmak izinde olduğu kadar eskiye dayanmamaktadır. Yüzümüzün içerdiği özelliklerin fazlalığı bu özellikleri kullanacak yöntemlerin sayısını da arttırmıştır. Değişik özellikleri kullanan değişik yöntemler ortaya çıkmıştır. Bunlardan ilki sayılabilecek yöntem ‘eigenfaces’ Matthew Turk ve Alex Pentland 1987 yılında ortaya atılmıştır. Yüz tanımada kullanılan başlıca yöntemler aşağıdaki gibidir:</p>
<ul>
<li> PCA</li>
<li> <strong></strong>ICA</li>
<li> LDA</li>
<li> EP</li>
<li> EBGM</li>
<li> Kernel Methods</li>
<li> Trace Transform</li>
<li> AAM</li>
<li> 3-D Morphable Model</li>
<li> 3-D Face Recognition</li>
<li> Bayesian Framework</li>
<li> SVM</li>
<li> HMM</li>
<li> Boosting &amp; Ensemble</li>
</ul>
<p style="text-align: center;"><a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/11.jpg"><img class="size-full wp-image-101 alignnone" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/11.jpg" alt="" /></a></p>
<p style="text-align: center;">‘Eigenface’ örnekleri</p>
<p style="text-align: left;">Yüz tanıma yöntemi kullanılarak 2000  yılında Meksika’da  yapılan seçimlerde birden fazla oy kullanılmasını engelleyecek bir sistem oluşturulmuştur. Ayrıca 2001 yılında ABD’de yapılan NFL (National Football League) finalinde 19 suçlu yakalanmıştır. ABD’de verilen ehliyet, kimlik gibi belgelerde bir kişinin farklı adlarla kayıt yaptırmaması amacıyla yüz tanıma sistemi kullanılmaktadır.</p>
<p style="text-align: left;"><strong> Özellikleri:</strong><br />
Yüz tanıma yönteminde kişilerden örnek almak diğer yöntemlere göre çok daha zordur.  Sıradan bir kamera ile çevreden birçok yüz görüntüsü alınabilir. Ancak burada başka bir sorun ortaya çıkmaktadır. Kamera tarafından alınan görüntüde tamamen yüze ait bölge bulunmalıdır. Bunun için ‘Face Detection’ yani yüz bulma algoritmaları kullanılmaktadır. Yüz bölgesi bulunduktan sonra işlemeler burada devam etmektedir.</p>
<p>Bu adımdan sonra değişik yollar izlenerek yüz tanıma işlemi yapılabilir. Bazı yöntemler yüzde bulunan oranları karşılaştırıken bazılar YSA ile öğreterek tanıma yapmaktadır. Bu yöntemlerin çalışma şekilleri aşağıda kısaca açıklanmıştır.</p>
<p style="text-align: left;"><strong>PCA </strong>yönteminde tanıma işleminin yapılabilmesi için alınan örneklerin veritabanında bulunanlar ile aynı boyutta olması gereklidir. PCA tekniği temel olarak çok boyutlu veri kümelerini analiz edilebilmesi için daha az boyutlu kümelere dönüştürür. Bu yöntemde yapılan işlem Karhunen-Loève transformu olarak da bilinmektedir. PCA yönteminde veritabanında saklanan görüntüler küçültülmüş ve sıkıştırılmış olarak saklanmaktadır. Bu sayede vertabanın yükü azaltılmış ayrıca arama hızı arttırılmıştır.<br />
<strong></strong></p>
<p><strong> ICA </strong>(Independent component analysis) yöntemi çok değişkenli işaretleri alt parçalara bölerek işlem yapmaya dayalı bir hesaplama metodudur.<br />
<strong></strong></p>
<p><strong> LDA </strong>(Linear Discriminant Analysis)  elde varolan sınıfların özelliklerini ölçerek yeni gelen örneklerin sınıflandırılmasını sağlayan bir yöntemdir. Sınıflar arasında farklılıklar arttırılmaya çalışılırken sınıf içindeki örneklerin arasındaki farklar azaltılmaya çalışılır. LDA sadece sınıflandırma yapmaya yarayan bir yöntemdir. Veri tipi hakkında herhangi bir bilgi vermez.</p>
<p><strong>EP </strong>(Evolutionary Pursuit) genetik algorimtaları kullanarak sınıflandırma yapan bir yöntemdir. Karşılaştırılacak örnek sayısı (durum uzayı) çok büyük olduğu zaman genetik algoritmalara başvurmak hızlı bir çözüm elde etmemize yardımcı olmaktadır.</p>
<p><strong>EBGM</strong> (Elestic Bunch Graph Matching) yönteminde insan yüzünü graf olarak ifade eder. Graftaki düğümler burun, göz gibi belirgin noktalardan oluşur. Kenarlar, noktalar arasındaki 2boyutlu uzaklıklar ile ağırlıklandırılır.  Her düğümde farklı faz ve genlikte oluşturulmuş 40 adet Gabor wavelet katsayısı bulunur. Bu katsayılara ‘jet’ denilmektedir. Tanıma işlemi jet’ler ve ağırlıklandırılmış kenarlar ile yapılır.<br />
<strong></strong></p>
<p><strong> Trace Transform Radon </strong>dönüşümünün genelleştirilmiş halidir. Radon dönüşümü iki boyutlu uzayda düz çizgilere uygulanan intergral dönüşümüdür. Ters radon dönüşümü ile görüntülerin tekrar oluşturulması sağlanabilir. Trace transform sayesinde cisimleri tanırken rotasyon, boyutlandırma gibi transformasyonların ektileri ortadan kaldırılır. Bu sayede farklı açılardan görüntüsü alınan cisimlerde tanınabilir.</p>
<p><strong>AAM </strong>(Active Appearance Model) nesnelerin şekillerini istatistiksel bir modelidir ve iki resmin eşleştirilmesi için kullanılan bir hesaplama yöntemidir. Algoritma gri seviye resimler üstünde tahmin edilen nokta ile hedef nokta arasındaki farkların hesaplanmasıyla (least squares) çalışır.<br />
<a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/12.jpg"><img class="aligncenter size-full wp-image-101" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/12.jpg" alt="" /></a></p>
<p><strong>3-D Morphable Model</strong> yukarıda kullanılan tekniklere göre daha değişik bir yaklaşım ile yüz resimlerini 3 boyutlu olarak inceler. Örnek olarak alınan resmin çekildiği ortam ile veri tabanındakini karşılaştırırken çevre koşullarının değişimini 3 boyutlu görüntüye uyarlayarak elde ettiği sonuç ile karşılaştırma yapabilir. Bu yöntemi açıkayacan örnek programın videosunu <a href="http://www.youtube.com/watch?v=nice6NYb_WA" target="_blank">izleyebilirsiniz. </a>Verilen resimden 3boyutlu görüntüyü çıkarması ve transformasyonlardan bağımsız olması bu yöntemi güçlü kılmakla beraber uygulanmasını da bir o kadar zorlaştırmaktadır.</p>
<p><strong>3-D Face Recognition </strong>bu yöntemin getirdiği en büyük yenilik yüz görüntüsünde kişinin doğal ifadeleriden bağımsız olarak tanıma yapabilmesidir. Öncelikle yüz bölgesi ve dokusu belirlenir.  Daha sonra bu bölge içinden gereksiz ve tanımayı zorlaştıracak bölümler (saç, vs) atılır. Bu işlemin ardından yüzün 3boyutlu gösterimi elde edilir. Bu elde edilen görüntü tanıma işlemi için kullanılmaktadır.<br />
<strong> Bayesian Framework </strong>Bayes teoremine dayanan ve olasılıksal benzerlikleri ölçen bir yöntemdir. Bu yönteme göre iki çeşit yüz görüntüsü varyasyonu vardır: intrapersonal (kişinin içinde gelişen) ve extrapersonal (kişinin dışında gelişen). Yüzler arasındaki benzerlik Bayesian kuralına göre ölçülmektedir.<br />
<strong></strong></p>
<p><strong> SVM </strong>(Support Vector Machine) yöntemi verilen noktaları destek vektörleri ile ifade eder ve aynı sınıfa ait noktaları bir bölümde tutacak bir hiperbol çizmeye çalışır. PCA yöntemiyle özellik çıkarımı yapıldıktan sonra SVM yöntemiyle görüntü ikilieri arasındaki farklar araştırılır. Yani veri tabanındaki görüntülere ait vektörler ile alınan örnek vektörleri karşılaştırılır.  SVM yöntemiyle resimde işaretlenen belirli noktaların takibi de yapılabilir. Kamera karşısında bulunan bir insanın yüzünü göz-ağız gibi bölgelere ayırarak bunların takibini yapan SVM yöntemiyle insanın ruh halini gösteren bir videoyu <a href="http://www.youtube.com/watch?v=V25qu1xpJOc" target="_blank">izleyebilirsiniz</a>.</p>
<p style="text-align: center;"><a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/13.jpg"><img class="size-full wp-image-101 aligncenter" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/13.jpg" alt="" width="293" height="191" /></a></p>
<p style="text-align: center;">
<p><strong>HMM </strong>(Hidden Markov Models) bir istatsitiksel model olup bir işareti karakterize etmek için kullanılır. HMM işlemi bilinmeyen parametreleri gözlenebilir parametreler ile elde etmeye yardımcı olur. Ortaya çıkarılan model parametreler &#8216;doku eşleştirme&#8217; &#8211; &#8216;pattern matching&#8217; için kullanılır. HMM yöntemi Bayesian ağı yönteminin basit bir hali olarakta nitelendirilebilir.</p>
<p style="text-align: center;"><a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/14.jpg"><img class="size-full wp-image-101 aligncenter" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/14.jpg" alt="" width="215" height="182" /></a></p>
<p><strong>Avantajları:</strong></p>
<ul>
<li> İnsan yüzlerinin tek yumurta ikizleri haricinde birbirnden tamamen farklıdır.</li>
<li> Parmak izindeki kadar kolay taklit edilemeyecek özellikleri barındırırır. Bundan dolayı taklit edilmesi oldukça zor bir tanıma yöntemidir.</li>
<li> Örnek alma işleminin sadece bir kamera ile kolaylıkla yapılabilinir.</li>
</ul>
<p><strong>Dezavantajları:</strong></p>
<ul>
<li> Uygulanması diğer yöntemlere göre oldukça zordur.</li>
<li> Çevre koşullarından çok fazla etkilenmesi.</li>
<li> Kişilerin yüzündeki ufak mimiklerden bile tanımanın yanlış sonuçlar verebilme ihtimali vardır.</li>
<li> Yüzde oluşacak bir yara ve hasarın tanımayı olumsuz etkilemesi söz konusudur.</li>
</ul>
<p><strong>iii.    İris Tanıma</strong></p>
<p><strong> Tarihçe:</strong><br />
1936 yılında Frank Burch isimli göz doktoru bir bireyi tanımak için iris desenlerinin kullanılabileceği fikrini öne sürdü. 1985 yılında Dr. Leonard Flom ve Dr. Aran Safir tüm irislerin eşsiz olduğunu ispatlayarak 1987 iris tanıma ile ilgili patentlerini aldılar. Dr. Flom, Dr. John Daugman’dan iris tanımayı otomatik hale getirecek bir algoritma geliştirmesini istemiştir. 1993 yılında ABD’de Defense Nuclear Agecny bu işlemi yapacak bir prototip üstünde çalışmalara başlamıştır. 1995 yılında tamamlanan sistem Dr. Daugman’a bu dalda bir patent kazandırmıştır. 1995 yılında otomatik iris tanıma yapabilen cihazlar piyasaya çıkmaya başlamıştır.<br />
<strong></strong></p>
<p><strong> Özellikleri:</strong></p>
<p>İris tanıma sistemleri yüz ve parmak tanımada olduğu gibi özel noktaların çıkarılmasıyla yapılamamaktadır. Daha çok ‘pattern recognition’ olarak bilinen doku arama yöntemiyle yapılır.</p>
<p>İris tanımada ilk adım göz resminden iris bölgesinin bulunmasıdır. Bunun için iris şeklinden yararlanılabilineceği gibi göz bebeğinin siyah renginden de yararlanılıp histogramdan da bu bölge çıkarılabilir. Ayrıca sobel kenar algılama algoritması ile kenarlar bulunup ‘circle detection’ algoritmalarıyla da göz bebeği ve iris bulunabilir. Göz kapağının tamamen açık olmadığı durumlarla da karşılaşılabileceği için önce göz bebeği ardından irisin bulunması daha iyi sonuçlar vercektir.<br />
<a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/15.jpg"><img class="size-full wp-image-101" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/15.jpg" alt="" /></a></p>
<p>İris bölgesi seçildikten sonra bu bölge üzerinden dokuya dayalı olarak özellik çıkarma işlemleri yapılır. Bu özellik çıkarma ve karşılaştırma işlemininde birden fazla yolu bulunmaktadır.</p>
<p>Bu yöntemlerden biri göz bebeğinin etrafından alınan parçalar üzerinde işlem yapmaktır. Tüm iris üzerinde işlem yapılmamasının bir diğer sebebi ise göz kapağının yarı kapalı olması ve kirpiklerin irisi örtmesidir. İris üzerinden göz bebeğine bitişik yerlerden belirli sayıda parça alınarak bu karşılaştırma yapılabilir.<br />
<a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/16.jpg"><img class="size-full wp-image-101" title="turler" src="http://www.ahmetkakici.com/wp-content/uploads/2008/12/biyometri/16.jpg" alt="" /></a></p>
<p>Yukarıdaki şekilde olduğu gibi göz bebeğinin sağından solundan ve altından belirli sabit büyüklükte parçalar alınır. Bu parçaların büyüklüğünün her zaman eşit olduğuğunu garanti altına almak için örnek olarak alınan görüntülerin boyutları sabit olmalıdır. İşleme başlamadan önce resmi tekrar boyutlandırmak gerekebilir. Görüntüden örnek olarak alınan bu üç parça birleştirilerek bu üçlü parçaya ait co-occurance matrisi oluşturulur.</p>
<p>Belli bir yönde &#8216;d&#8217;, belli bir mesafede &#8216;a&#8217; belirlenen gri seviye değerleriyle iki pikselin resim üzerinde hangi sıklıkta bulunduğunu belirten matrise co-occurance matris denir. Herhangi d ve a değerleri kullanılabilir, bu değerlerin seçimi bir kurala tabi değildir.</p>
<p>Yönü belirten açı değeri 0; I, gri seviyeye sahip resmimizde mesafeyi ‘a’ olarak alırsak ; co-occurance matris de p ile simgelensin, i = I (x,y) , j = I (x+a,y) =&gt; p (i,j) değeri bir arttırılır. Bu işlem resmin tamamına uygulanır ve sonuçta co-occurance matris oluşturulmuş olur.</p>
<p>Bu matris oluşturulduktan sonra yapay sinir ağlarını eğitmekte kullanılır. Daha sonra alınan örnekler üzerinde de aynı işlem yapıldıktan sonra YSA ile sınıflandırma yapılarak eşleştirme sonucu elde edilir.</p>
<p><strong> Avantajları:</strong></p>
<ul>
<li> İris parmak veya yüz gibi vücud dışında olan bir organ olmadığından dolayı zarar görme olasılığı daha düşüktür.</li>
<li> Parmak izi gibi yöntemlerde örnek alınırken fiziksel olarak temas olduğundan dolayı örnek alma sırasında yanlış veriler alınabilir. İris örneği alınırken ~10cm mesafeden bir resim çekilmesi yeterlidir.</li>
<li> Tek yumurta ikizlerinde bile iris yapıları farklıdır. Yani iris dokusu tamamen kişiye özel bir yapıdadır.</li>
<li> Doğumdan sonra oluşan iris dokusu dışardan bir etki gelmediği sürece ölene kadar değişmez.</li>
<li> Göz, insanın ölümünden sonra en kısa sürede değişime uğrayan organlardan biridir.</li>
</ul>
<p><strong>Dezavantajları:</strong></p>
<ul>
<li> Tanımanın yapılabilmesi için çekilen resmin çözünürlüğünün ve kalitesinin çok iyi olması gerekir.  Aksi halde beklenen sonuçlar elde edilmeyebilir.</li>
<li> Yüksek çözünürlüklü iris resimleri ve üzerine iris deseni basılmış lensler ile varolan sistemleri aşmak mümkün olabilir.</li>
</ul>
<p><strong>iv.    Retina Tanıma</strong></p>
<p>Retina tanıma işlemi insanın göz bebeği arkasındaki damar tabakanın tanınmasıdır. Bu bölgedeki damarlar kişiden kişiye değişmesine rağmen damar ve göz hastalıklarından (ör:diabet) damarların etkilenmesi söz konusu olduğundan pek yaygınlaşmış bir yöntem değildir. Ayrıca örnek alma sırasında kişinin belirli bir noktaya bakması da bu işlemi zorlaştırmakta ve yöntemin az tercih edilmesine yol açmıştır.</p>
<p>Retina resmi çekildikten sonra elde edilen görüntüde eşikleme yapılarak damar görüntüsü elde edilir. Bu eşikleme işlemi için gerekli olan değer dinamik olarak (genellikle otsu algoritmasıyla) elde edilir. Daha iyi sonuç almak için eşikleme işlemi ardışıl olarak yapılır ve birden çok eşik değeri alınarak adım adım damar görüntüsü elde edilir. Ortaya çıkan son görüntü üzerinde özellik çıkarma işlemleri yapılır. Buradan sonraki işlemler parmak izindeki yöntemlere benzemektedir.</p>
<p><strong>v.    Damar Tanııma</strong></p>
<p>Damar tanıma retina tanıma ile aynı algoritma ile çalışır. Ancak bu yöntemde örnekler göz arkasında bulunan damarlar yerine el üzerinde ki damarlardır.  Bu yöntemde de el resmi çekildikten sonra damar yapısı ortaya çıkarılır ve tanıma işlemi retina yönteminde olduğu gibi yapılır. Elde bulundan damarlarda kişiye özgü olduğundan dolayı geçerliliği olan bir yöntemdir. Ayrıca retina yönteminin aksine elden örnek resim alması daha kolay olmaktadır. Buna rağmen fiziksel olarak değişime ve deformasyona açık olan bir bölge olan el üstünde yara vs gibi değişimler olduğu zaman tanıma işlemi olumsuz sonuç vermektedir.</p>
<p><strong> vi.    El Yazısı Tanıma</strong></p>
<p>El yazısı tanıma işlemi ilk bakışta kesin bir sonuç vermeyeceği düşüncesi uyandırmasına rağmen tanıma işlemini başarıyla gerçekleştirmektedir. Kişilerin el yazısında kullandıları harflerin biçimleri birbirinden farklılık göstermesinin yanı sıra bu harfleri oluşturma biçimleri de dikkate alınır ve yöntemin başarı oranı arttırılır.  Harfleri oluşturma sırası, noktaları ve çizgileri çizme sırası da dikkate alınabilecek bir takım özelliklerdendir.</p>
<p>Varolan bir yazıdan tanıma yapılırsa birçok özellik kaybolabilir ve taklidi muhtemel bir hale gelir. Bundan dolayı yazı yazılırken yapılan tespit hem daha doğru sonuçlar verir hemde güvenliği artırır.</p>
<p>Diğer tanıma yöntemlerinde örneğin alındığı cihazın (ör:kamera) sadece o iş için üretilmemiş olması yani başka amaçlarda da kullanılmasının yanı sıra el yazsını tanımak için kullanılan cihazlar bu amaca özel hizmet eden cihazlardır. Bundan dolayı maliyeti diğer yöntemlerde kullanılan cihazlara göre daha fazla olabilir.</p>
<p><strong>Biyometrinin Geleceği</strong></p>
<p>Yakın gelecekte biyometrik kimliklerimiz bizleri yanımızda taşıdığımız kimliklerden, şifrelerden, kartlardan tamamen kurtaracaktır. Günlük hayatta birçok işlemimizi bu yöntemlerle yapabileceğiz. Örneğin kredi kartı kullanılmaya başladıktan sonra insanlar nakit para taşımak yerine bu kartları taşımaya başladılar. Daha sonraları ise kartların çalınmasıyla gerek bankalar gerek kullanıcılar birçok sorunla karşılaştılar. Eğer biyometrik tanıma yöntemleri bu alanda kullanılırsa alışveriş sonrası kasada sadece parmağımızı yada bakışımızı (iris- retina vs ) kullanarak paramızı ödeyebileceğiz.</p>
<p>Bu tip sistemler insanların tamamen kayıt altına aldığı için bu tip verilerin saklandığı veritabanlarının güvenliği en üst düzeyde olmalıdır. Ayırca sahte kimlik veya kredi kartı gibi olayların da önüne geçilmesi için mükemmele yakın bir çözüm üretmektedir. Yeterince yaygın kullanıma eriştiği zaman suç oranında etkisi hissedilir şekilde düşüşler yaşanacağı kesindir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkakici.com/genel/biyometrik-tanima-sistemleri/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>C# ile Görüntü İşleme &#8211; 1</title>
		<link>http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-1/</link>
		<comments>http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-1/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 21:42:13 +0000</pubDate>
		<dc:creator>Ahmet Kakıcı</dc:creator>
				<category><![CDATA[Programlama]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[görüntü işleme]]></category>
		<category><![CDATA[image processing]]></category>

		<guid isPermaLink="false">http://www.ahmetkakici.com/?p=85</guid>
		<description><![CDATA[Blogda bu kadar kod dolu yazılar yazmak konusunda kararszıdım ama yine de bir kez denemek istedim bakalım ilgi olacak mı. Görüntü işleme ile ilgili temel bilgileri biliyorsunuz farzederek bu yazıyı yazıyorum. Zira işin hikaye kısmını yazması biraz zor oluyor diyerekten konuya geçelim. Görüntü işleme sırasında image veya bitmap nesneleri üzerinde işlem yapmak yerine dizileri kullanıyorum [...]]]></description>
			<content:encoded><![CDATA[<p>Blogda bu kadar kod dolu yazılar yazmak konusunda kararszıdım ama yine de bir kez denemek istedim bakalım ilgi olacak mı.</p>
<p>Görüntü işleme ile ilgili temel bilgileri biliyorsunuz farzederek bu yazıyı yazıyorum. Zira işin hikaye kısmını yazması biraz zor oluyor diyerekten konuya geçelim.</p>
<p><span id="more-85"></span></p>
<p>Görüntü işleme sırasında image veya bitmap nesneleri üzerinde işlem yapmak yerine dizileri kullanıyorum ondan dolayı aşağıdaki kodlarda da bütün işlemler diziler üzerinde olacak. Kullandığım birçok fonksiyon pointer kullanarak çalışıyor. C# ile nasıl pointer kullanacağınızı bilmiyorsanız<strong> <a href="http://www.ahmetkakici.com/yazilim/pointer-ve-c/">şurada</a></strong> bulunan yazımı okuyabilirsiniz.</p>
<p>Öncelikle picturebox nesnesinden diziye dönüşüm işlemini yapan fonksiyonu verelim:</p>
<pre class="brush: csharp; title: ; notranslate">

int[,] pixelArray = new int[pictureBox1.Image.Height, pictureBox1.Image.Width];
int[,] greyPixelArray = new int[pictureBox1.Image.Height, pictureBox1.Image.Width];

private void BuildPixelArray(Image myImage)
{
Rectangle rect = new Rectangle(0, 0, myImage.Width, myImage.Height);
Bitmap temp = new Bitmap(myImage);
BitmapData bmpData = temp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int remain = bmpData.Stride - bmpData.Width * 3;
unsafe
{
byte* ptr = (byte*)bmpData.Scan0;
for (int i = 0; i &lt; bmpData.Height; i++)
{
for (int j = 0; j &lt; bmpData.Width; j++)
{
pixelArray[i, j] = ptr[0] + ptr[1] * 255 + ptr[2] * 255 * 255;
greyPixelArray[i, j] = (int)((double)ptr[0] * 0.11 + (double)ptr[1] * 0.59 + (double)ptr[2] * 0.3);
ptr += 3;
}
ptr += remain;
}
}
temp.UnlockBits(bmpData);
}
</pre>
<p>Bu fonksiyon sayesinde picturebox nesnesindeki görüntüyü pixelArray dizisine taşıyoruz. Aynı fonksiyonda greyPixelArray dizisi ile tutulan griseviye görüntü de oluşturuluyor.</p>
<p>Dizideki görüntüyü form üzerinde bulunan bir picturebox nesnesine aktarmak için aşağıdaki fonksiyonu kullanabilirsiniz.</p>
<pre class="brush: csharp; title: ; notranslate">

private void SetImage(int[,] sourceArray, ref PictureBox myPictureBox)
{
Rectangle rect = new Rectangle(0, 0, myPictureBox.Image.Width, myPictureBox.Image.Height);
Bitmap temp = new Bitmap(myPictureBox.Image);
BitmapData bmpData = temp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int remain = bmpData.Stride - bmpData.Width * 3;
unsafe
{
byte* ptr = (byte*)bmpData.Scan0;
for (int i = 0; i &lt; bmpData.Height; i++)
{
for (int j = 0; j &lt; bmpData.Width; j++)
{
ptr[0] = ptr[1] = ptr[2] = (byte)sourceArray[i, j];
ptr += 3;
}
ptr += remain;
}
}
temp.UnlockBits(bmpData);
myPictureBox.Image = temp;
}
</pre>
<p>Üstteki fonksiyon aldığı diziyi gri seviye olarak değerlendiriyor. Eğer renkli bir görüntünüz varsa bir aşağıdaki fonksiyonu kullanabilirsiniz</p>
<pre class="brush: csharp; title: ; notranslate">

public void SetColorImage(ref int[,] sourceArray)
{
Rectangle rect = new Rectangle(0, 0, sourceArray.GetLength(0), sourceArray.GetLength(1));
Bitmap temp = new Bitmap(sourceArray.GetLength(0), sourceArray.GetLength(1));
BitmapData bmpData = temp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int remain = bmpData.Stride - bmpData.Width * 3;
unsafe
{
byte* ptr = (byte*)bmpData.Scan0;
for (int i = 0; i &lt; bmpData.Width; i++)
{
for (int j = 0; j &lt; bmpData.Height; j++)
{
ptr[0] = (byte)(sourceArray[i, j]%256);
ptr[1] = (byte)((sourceArray[i, j]/256)%256);
ptr[2] = (byte)((sourceArray[i, j]/65536)%256);
ptr += 3;
}
ptr += remain;
}
}
temp.UnlockBits(bmpData);
destPictBox.Image = temp;
}
</pre>
<p>Görüntüyü yeniden boyutlandırmak için aşağıdaki fonksiyonu kullanabilirsiniz. ConstWidth değişkenine istediğiniz değeri vererek işlem sonucundaki görüntünün enini ayarlayabilirsiniz. Ben tüm görüntüleri standart boyuta getirmek için böyle bir yol kullanmıştım. Fonksiyonun çalışmasını kolaylıkla anlayabilir ve istediğiniz en-boy değiştirme işlemini kolayca yapabilirsiniz.</p>
<pre class="brush: csharp; title: ; notranslate">

private void ResizeImage(ref Image myImage)
{
float nPercent = ((float)constWidth / myImage.Width);
int sourceWidth = myImage.Width;
int sourceHeight = myImage.Height;
int sourceX = 0;
int sourceY = 0;

int destX = 0;
int destY = 0;
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);

Bitmap bmPhoto = new Bitmap(destWidth, destHeight, PixelFormat.Format24bppRgb);
bmPhoto.SetResolution(myImage.HorizontalResolution, myImage.VerticalResolution);

Graphics grPhoto = Graphics.FromImage(bmPhoto);
grPhoto.DrawImage(myImage,
new Rectangle(destX, destY, destWidth, destHeight),
new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
GraphicsUnit.Pixel);
myImage = bmPhoto;
grPhoto.Dispose();
}
</pre>
<p>Kenar algılama, gürültü yok etme ve yapısal (morfolojik) filtreleri de <a href="http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-2/">bir sonraki yazımda</a> paylaşmak üzere. İyi işlemeler diliyorum :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-1/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
	</channel>
</rss>

