Professional Documents
Culture Documents
Goruntu Isleme Ders Notlari Combined
Goruntu Isleme Ders Notlari Combined
com
Program içerisinde Menü ve Araç çubuğu kullanılacaktır. Bu amaçla MenuStrip ve ToolStrip nesneleri
kullanılacaktır.
ToolStrip (araç çubuğu) üzerindeki butonların resimlerini atarken, Paintte oluşturulan örnek resimler projenin
içerisindeki Bin klasörünün altına kopyalayalım.
Daha sonra ToolStrip üzerindeki butonu seçip Image özelliğinden butonu yükleyelim.
Butonun resmi yüklendikten sonra Properties penceresinden başka gerekli ayarlamalar yapılabilir. Örneğin
butonun adı yapacağı işle ilgili olarak değiştirilebilir.
1
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Programımızın tasarımını üstte bir menu çubuğu, altında ise Araç çubuğu olacak şekilde tasarlayalım. Form
üzerinde ise iki tane Picturebox olsun. Bunlardan birincisi orjinal resmi, diğeri ise dönüştürülmüş resmi göstersin.
Program ilerledikçe ekleme ve çıkarmalar olacaktır. Bu altyapı üzerinde devam edelim.
RESİM YÜKLEME
Bilgisayarımızdaki herhangi bir resmi PictureBox1 yüklemek için aşağıdaki kodları kullanabiliriz. Bunu fonksiyon
şeklinde yazarsak hem menüden hem de araç çubuğunda aynı kodlar kullanılarak resim yüklenebilir. Burada
geliştirilen programda iki tane picturebox kullanılmaktadır. Birincisinde orjinal resim (giriş resmi), ikincisinde ise
dönüştürülmüş resim (çıkış resmi) görüntülenecektir.
2
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Dosya açarken uzantıların görüntülenmesi süzmek için uygun olacaktır. Bunun için aşağıdaki kodları
kullanabiliriz.
openFileDialog1.DefaultExt = ".jpg";
openFileDialog1.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|All files (*.*)|*.*";
Eğer resim yükleme çalışırken openFileDalog açıldıktan resim seçilmeyip "iptal" tuşuna basılırsa, resimyolu
değişkeni "null" olacağı için program hata verir. Bunu engellemek için Try-Catch kodları içine yazılması gerekir.
private void DosyaAc_menu_Click(object sender, EventArgs e)
{
DosyaAc();
}
private void DosyaAc_toolbar_Click(object sender, EventArgs e)
{
DosyaAc();
}
//DOSYA AÇ -----------------------------
public void DosyaAc()
{
try
{
openFileDialog1.DefaultExt = ".jpg";
openFileDialog1.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|All files (*.*)|*.*";
openFileDialog1.ShowDialog();
d) CenterImage (resmin orta bölgesi çerçeve içinde normal şekilde görüntülenir, sığmayan kısımlar dışarıda kalır,
e) Zoom (resmin orantısı bozulmadan tamamı çerçeve içinde görüntülenir).
Not: Kodla size ayarlamak için
pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
a) b)
c) d) e)
RESMİ KAYDETME
Birinci picturebox da görüntülenen orjinal resim, belli filtrelerden geçirildikten sonra ikinci picturebox da
görüntülenecektir. Görüntülenen bu ikinci resim gerektiğinde bilgisayara kaydedilebilmelidir. Bu amaçla
aşağıdaki kodları kullanabiliriz. Burada üç tip resim kaydetme yapılmaktadır. Bunlar jpeg, bitmap ve gif
resimleridir.
//RESMİ KAYDETME-----------------------------------------
public void ResmiKaydet()
{
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "Jpeg Resmi|*.jpg|Bitmap Resmi|*.bmp|Gif Resmi|*.gif";
4
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
switch (saveFileDialog1.FilterIndex)
{
case 1:
pictureBox2.Image.Save(DosyaAkisi, System.Drawing.Imaging.ImageFormat.Jpeg);
break;
case 2:
pictureBox2.Image.Save(DosyaAkisi, System.Drawing.Imaging.ImageFormat.Bmp);
break;
case 3:
pictureBox2.Image.Save(DosyaAkisi, System.Drawing.Imaging.ImageFormat.Gif);
break;
}
DosyaAkisi.Close();
}
}
Not:
2019 Versiyonunda bir komutun kütüphanesini (reference) eklemek için aşağıdaki gibi mouse ile üzerine gelince
potansiyel seçenekleri gösterecektir. Bunun için “Show potential fixes” tıklayınız. Daha sonra çıkan listede
using.System..IO; kütüphanesini seçin. Kendisi otomatik olarak programın en üstüne ekleyecektir.
5
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
R = OkunanRenk.R;
G = OkunanRenk.G;
B = OkunanRenk.B;
pictureBox2.Image = CikisResmi;
}
6
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Programlama
R = 255 - OkunanRenk.R;
G = 255 - OkunanRenk.G;
B = 255 - OkunanRenk.B;
pictureBox2.Image = CikisResmi;
7
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
her renk (RGB-RedGreenBlue) benzer şekilde 256 ton renk alarak 28*3=224 yani 24 bit yer kaplar. Bu durumda
aynı resim bu sefer 3 katı yer kaplar.
Griton resimleri, kenar tespiti yada eşik uygulamaları gibir farklı amaçlar için ileriki uygulamlarımızda
kullanacağız.
Renkli resmin Gri-Ton a dönüştürülmesi
Renkli sayısal bir görüntüyü gri-ton bir görüntüye dönüştürme işlemi aslında RGB renk modelinde belirtilen her
bir renk bandına karşı düşen gri-ton görüntülerin ölçeklendirilmesinden başka bir şey değildir. Normalde üç
rengin değerini toplayıp üçe bölerek gri tonu elde edebiliriz. Fakat bu gözümüzün farklı renkleri farklı algılama
hassasiyetini tam yansıtmaz. Bu nedenle aşağıdaki formüllerde verildiği gibi ölçekleme yapılmalıdır. İlk verilen
formül en gerçekçi olanıdır. Dördüncü formülü ise basit olarak kullanabileceğimiz akılda kalıcı bir olabilir.
GriDegeri = (R + G + B)/3
8
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Programlama
int GriDeger = 0;
for (int x = 0; x < ResimGenisligi; x++)
{
for (int y = 0; y < ResimYuksekligi; y++)
{
OkunanRenk = GirisResmi.GetPixel(x, y);
double R = OkunanRenk.R ;
double G = OkunanRenk.G ;
double B = OkunanRenk.B ;
pictureBox2.Image = CikisResmi;
}
Gri-ton formülü olarak 3 kanal (R,G,B) renk ortalamasını alarak da gri-ton a dönüştürebiliriz. Ama bu formül daha
az gerçekçi bir sonuç verecektir. Bunun için yukarıdaki programda ilgili satırı aşağıdaki kodlarla değiştirmeliyiz.
int GriDegeri = (int)(OkunanRenk.R + OkunanRenk.G + OkunanRenk.B)/3; //Ortalama Gri-ton formülü
9
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Not:
Resmin üzerindeki noktaların renk değerlerini öğrenmek için aşağıdaki kodları kullanabilirsiniz. Böylece hangi
rengin dönüşümlerde nasıl değiştiğini daha iyi yorumlarsınız.
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
Color Renk = ((Bitmap)pictureBox1.Image).GetPixel(e.X, e.Y);
txtRGB.Text = string.Format("R:{0} G:{1} B:{2}", Renk.R, Renk.G, Renk.B);
}
Araştırma: Renkli resimleri, Gri resme dönüştürmeyi öğrendik. Peki Gri resmi, renkli resme nasıl dönüştürürüz.
Üzerinde araştırma yapın. Aşağıdaki linkteki bu uygulamanın başarısını gözlemleyin. Daha iyi bir algoritmayı nasıl
geliştirirsiniz fikir geliştirin. (https://demos.algorithmia.com/colorize-photos )
PARLAKLIK (BRIGHTNESS)
Bir resmin parlaklılığını artırma yada rengini açma, beyaz tona doğru ilerlemek için renk kanalları üzerine aynı
büyüklükte eşdeğer bir sayı eklemekle gerçekleştirilir. Resmi koyulaştırmak için tam tersi sayı çıkarılır. Burada
dikkat edilmesi gereken üzerine eklenen sayılarla sonuç 255 değerini geçmemelidir yada çıkarılan sayılar
nedeniyle 0 altına düşmemelidir. Şu şekilde formülüze edebiliriz.
f(x,y)= g(x,y)(R∓b, G∓b, B∓b)
Program Kodları
Birinci resimler orjinal resim, ikinciler rengi 50 değerinde açılmış resimdir.
10
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
11
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
EŞİKLEME (Thresholding)
Bu teknikte resim içerisindeki her pikselin renk değeri belli bir eşik değeri ile kıyaslanır. Eğer bu eşik değerinin
altında ise bir renk, üzerinde ise başka bir renk atanır. Örneğin gri-ton bir resmi bu filtreden geçirirken, renk
değeri 128 gibi bir eşik değerin altındaysa 0-siyah olarak, üzerinde ise 255-beyaz olarak atanabilir. Matematiksel
olarak aşağıdaki gibi gösterilebilir.
0 𝑒ğ𝑒𝑟 𝑔(𝑥, 𝑦) < 𝑇 = 128
𝑓(𝑥, 𝑦) = {
255 𝑑𝑖ğ𝑒𝑟
Programlama
//EŞİKLEME -------------------------------------
public Bitmap ResmiEsiklemeYap()
{
int R = 0, G = 0, B = 0;
Color OkunanRenk, DonusenRenk;
Bitmap GirisResmi, CikisResmi;
GirisResmi = new Bitmap(pictureBox1.Image);
pictureBox2.Image = CikisResmi;
}
HİSTOGRAM
Resim üzerinde eşikleme işlemi yapıldığında belli özellikleri ortaya çıkarmak için, uygun eşik değeri kullanmamız
gerekir. Fakat bu eşik değerinin hangi değer olması gerektiğini tam olarak bilemeyiz. İşte tam bu noktada
histogram konusu devreye girmektedir.
Görüntü histogramı, gri-ton resmin üzerindeki piksel bilgilerini gösteren bir çubuk grafiktir. Grafiğin yatay x-
ekseni 0-255 arasındaki gri ton değerlerini gösterir. y-ekseni ise bu değerlere sahip piksel sayılarını gösterir.
Aşağıdaki grafikte yatay eksen 0-255 arası eşit 4 parçaya bölünmüştür. Dikey eksen ise hangi renk tonundan en
fazla adet varsa onun sayısına bağlı olarak (n ile gösterilmiştir) eşit kısımlara bölünmüştür. Buna göre en fazla
piksel adedi 10 renk tonu civardında olduğu görülmektedir.
Resme bakıldığında renklerin koyu piksellerden oluştuğu gözükmektedir. Bu durum histogramın sol tarafa siyaha
yakın bölgede toplanmasına yol açmıştır. Aynı zamanda histogramın orta bölgeye yakın bir yerde bir zirve
yaptığını görmekteyiz. Bu bölgedeki renkler zambakların yapraklarının renginden kaynaklanmaktadır (suyun
üstündeki geniş yapraklar). 128 den sonra renk sayılarının azaldığını görmekteyiz. Bunlar açık renkli tonlardır.
Aşağıdaki gibi yapılacak iki farklı eşikle (128 veya 192) renklerin hangi nesnelere ait olduğunu görebiliriz.
13
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Programlama
int Gri = 0;
Color OkunanRenk;
int R = 0, G = 0, B = 0;
Gri = OkunanRenk.R;
//RENKLERİ SAYMA**************
14
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
for (int r = 0; r <= 255; r++) //256 tane renk tonu için dönecek.
{
int PikselSayisi = 0;
}
}
DiziPikselSayilari[r] = PikselSayisi;
}
//Maksimum ve Minimum X değerlerini bulma === histogramın iki ucundaki sayıları bulma
int MaksX = 0;
int MinX = 255;
}
txt1.Text = MinX.ToString();
txt2.Text = MaksX.ToString();
pictureBox2.Refresh();
15
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
if (x % 50 == 0)
{
CizimAlani.DrawLine(Kalem2, (int)(X_kaydirma + x * OlcekX), GrafikYuksekligi,
(int)(X_kaydirma + x * OlcekX), 0);
}
}
txt3.Text = RenkMaksPikselSayisi.ToString();
}
KARŞITLIK (CONTRAST)
Bir görüntünün ayırt edilebilirliğini ifade eden kontras ifadesini Türkçe olarak da kullanmaktayız. Resim
üzerindeki renk değerleri birbirine çok yakın değerlerde olursa (dar bir aralıkta toplandığında) düşük kontraslı
resim olur. Bunu görebilmek için resmin Histogramını çizdirmek gerekir. Bu resimlerin renk değerlerini
birbirinden uzaklaştırmak için resmin histogramı üzerinde gerdirme işlemi yapmak gerekir. Bunun için burada üç
farklı örnek üzerinde durulacaktır.
Resmin kontrasını (karşıtlığını) artırmak ile keskinliğini artırmak (sharpen) aynı şey değildir. Kontrasda resim
üzerindeki alanların renk değerleri birbirinden uzaklaştırılır. Keskinleştirmede ise alanların iç kısımları değil kenar
kısımları belirgin hale getirilir. Bu konu ileride gelecektir.
Kontras örneği: Resim renk değerlerinin arası açılmış Keskinleştirme: Kenarlar belirgin yapılmış (sharpen)
16
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
sayıdaki renkler resmi etkilememiş olur. Çok sayıdaki bu renkler zaten grafiğin ortalarında bir yerdeyse bunlar
zaten sınırları etkilemeyecektir. Burada söz konusu olan sınırların dışında bulunan birkaç pikselin renk değeridir.
Kontras için kullanacağımız formülü aşağıdaki gibi elde edebiliriz. Sonuçta bu formül lineer olarak grafik üzerinde
bir değeri elde etmek istediğimiz genel bir formüldür. Formülün çıkarılışı için Lineer bir grafik üzerindeki orantı
kullanılabilir.
Not: Bu formüldeki Y değerlerini A,B,C olarak değiştirmek iyi olacaktır. Resmin Y eksenine ait değerler gibi
algılanıyor. Y1,, A yap , Y2 -B yap, Y –C yap
(𝑋 − 𝑋1)
𝑌= (𝑌2 − 𝑌1) + 𝑌1
(𝑋2 − 𝑋1)
private void KONTRAS_histogram_Click(object sender, EventArgs e)
{
Color OkunanRenk, DonusenRenk;
//int R = 0, G = 0, B = 0;
int Red;
17
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
int X1 = Convert.ToInt16(txt1.Text);
int X2 = Convert.ToInt16(txt2.Text);
int A = 0; //Convert.ToInt16(textBox3.Text);
int B = 255; //Convert.ToInt16(textBox4.Text);
Red = OkunanRenk.R;
//G = OkunanRenk.G;
//B = OkunanRenk.B;
//int Gri = (R + G + B) / 3;
int X = Gri;
18
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
2006.]
Not: Yukarıda verilen histogram örnekleri renkli resimlere de uygulanabilir. Histogram hesabı gri renk üzerinden
yapılırsa ve bulunan değerler üç kanal içinde uygulandığında sonuçlar gözlemlenebilir. Bu denemeler ödevler
içinde istenecektir.
---------------------------***-------------------------
19
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Algoritma'nın doğru çalışması için kontrast düzeltme faktörü (F) değerinin bir tamsayı değil, ondalık sayı (double)
olması gerekir. Formüldeki C değeri, istenilen kontrast seviyesini belirtir.
Bir sonraki adım, gerçek kontrast ayarını yapmaktır. Aşağıdaki formüller kırmızı (R), yeşil (G), mavi (M) renkler
için verilmiştir.
𝑅 ′ = 𝐹(𝑅 − 128) + 128
𝐺 ′ = 𝐹(𝐺 − 128) + 128
𝐵′ = 𝐹(𝐵 − 128) + 128
Bu formüllerden çıkan R,G,B renk değerlerinin 0-255 geçerli renk aralığında olması gerekir.
Kırmızı, yeşil ve mavi değerlerin 0'dan 255'e kadar geçerli bir aralıkta olmasını sağlar. Kontrast seviyesi (C) ise
+255 ile -255 arasında olmalıdır. Pozitif değerler kontrast miktarını artırırken, Negatif değerler kontrast miktarını
düşürecektir.
---------------------------***-------------------------
Program Kodları
Aşağıdaki resimler Orijinal resim, +128 Kontrast ve -128 kontrast miktarlarını göstermektedir.
20
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
if (R < 0) R = 0;
if (G < 0) G = 0;
if (B < 0) B = 0;
}
pictureBox2.Image = CikisResmi;
}
ÖDEVLER
Ödev 1: (Parlaklık)
Sürgü kullanarak bir resmin parlaklığını artırma yada düşürme işlemini dinamik olarak gerçekleştirin.
21
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Ödev 2: (Eşikleme)
Form üzerinde iki tane sürgü kullanarak Eşikleme yapan bir program yazınız. Sürgüler grafik altında x ekseni
boyunca olsun. Sürgü ilerletildikçe resmin nasıl değiştiği gözlemlenebilsin. Olay şöyle çalışsın. Sürgülerin birisi 50,
diğeri 200 gösteriyorsa, Gri renk değeri 50 ile 200 da ise o pikseli direk göstersin. Bu iki sınırın dışında ise
göstermesin yani siyah yapsın.
Aynısını Renkli Resim içinde yapın. Yani Kırmızı, Yeşil ve Mavi kanallara göre 3 tane ayrı Histogram grafiği çizdirin.
Her grafiğin altında iki tane sürgü bulunsun. Okunan renk Kanal değeri (örneğin kırmızı) Bu sürgülerin değerleri
arasında ise kırmızıyı kendi renginde göstersin. Dışında ise hiç göstermesin (yani siyah yapsın). Aynı işlemi diğer
üç kanal içinde yapmanız gerekir.
Histogram grafikleri bize hangi sınırı dışarıda tutacağımız daha iyi gösterir.
b) Aynı uygulamayı çift sürgü ile yapın. Yani resmi hem aşağıdan yukarı doğru sıkıştırın, hemde üstten aşağı
doğru sıkıştırın. Böyle bir resimde renk değerleri belli bir aralık içine gelmiş olacaktır.
c) Yeni oluşan resim üzerinde istenen noktaya Mouse ile tıklandığında Textbox içinde o noktanın X ve Y
koordinatını göstersin. Ayrıca R, G, B şeklinde üç renk değerinide göstersin. Böylece resmin hangi kısmı
nasıl bir renk değeri almış kontrol edilsin. Bunun için MouseMove ve MouseDown olaylarına
bakmalısınız. Örnek kodlar İnt.Tab.Prg dersinin sayfalarında vardır.
22
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
23
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
a) Çizgilerle belli bir alanı çizmek için İnt.Tab.Prg dersinin sayfasında örnek kodlar vardır. Oradaki bilgilerle
bu çizimi yaptırın.
b) Tıklanan noktanın Kapalı bir poligonun içerisinde olup olmadığını bulmak için Analik Geometri konuları
içinde bir araştırma yapmalısınız. Yani tıklanan nokta bir poligonun (çokgenin) içinde mi kalır yoksa
dışında mı kalır bunu araştırın. Bulduğunuz formül ve yöntemleri anlatın. Ezbere olmasın, mantığını
anlayın.
Ödev 7:
Renkli Resimler üzerinde farklı kanalların histogramlarını çizdirme yapınız. Sonuçları yorumlayarak bu bilgiler
nelerde kullanılabilir yazınız.
Ödev 8:
Eski tarihi bir siyah resmi alıp bunun üzerinde belirleyeceğiniz 10 tane noktanın rengini siz verin. Bu renk
tahminlerinden yola çıkarak tüm resmi renklendirme işlemini kendi yazacağınız algoritma yapsın…
Ödev 9:
İyi bir gece görüş dürbünü yapabilmek için sadece ortamın ışığını artırmak yetmez. Bunun için renklerinde
birbirinden uzaklaştırılması (kontrası artırmak) gerekir. Bu işlem için kendiniz bir gece görüş kamerası algoritması
geliştirin. Gece karanlığında çok az ışıkta çekilmiş bir çok fotografı en iyi gündüz çekimine dönüştüren
algoritmayı yazın. Çekimler geceleyin bir ay ışığı görüntüsü olabilir, karanlık bir odada camdan az bir ışık geliyor
olabilir. İyi bir algoritma geliştirmek için kontras sınırlarını kendiniz sürükleyerek ayarlamaya çalışın. Ayrıca belli
bölgelerde ışık artırma işlemide yapın. Birde Histogram grafiğinin ortasında bir noktadan kaydırma yaparak onun
altındaki renkleri açarak, yukarısındaki renkleri ise bir birine yaklaştırarak daha iyi görüntüler elde etmeye
çalışın.
24
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Ödev 10:
Aşağıdaki gibi kişiye özel renk paleti oluşturmak için bir uygulama yapın. Bunun için Pikturebox içinde 16 milyon
rengin her birini oluşturun. (R*G*B=255*255*255 = 16.581.375). Mantığını kendiniz bulacaksınız. Ardından yan
tarafa bir skala daha oluşturun. Ortadan bir renk seçildiğinde o rengin tonlarını açıktan koyuya doğru bir şerit
halinde göstersin. Böylece kişi ortadan hangi rengi atamak istediğini belirlesin, yandan da bu rengin tonlarını
oluştursun. En son karar verdiği rengin RGB değerlerini aşağıda göstersin ve Bu rengi kaydet dediği zaman yanda
oluşturulan küçük pencerelerin içine rengi kaydetsin (yani orda göstersin). Böylece kişiye özgü bir renk paleti
oluşmuş olsun.
Ödev 11:
Gri Resmi, renkli resme dönüştüren bir program yazın. Bu dönüşüm normal algoritma ile zordur. İçerisinde yapay
zekaya ihtiyaç vardır. Yapay zeka kısmını kendimiz şu şekilde oluşturabiliriz. Resmin üzerinden yaklaşık 10 tane
nokta seçin. Bu noktalardaki renkleri yan tarafta bir Textboxlarda gösterin. Aldığınız bu örnek rengin tahmini
olması gereken renk değerini atayın. Bu tahmini renkler üzerinde yukarı aşağıya tolerans belirleyelim. Bu şekilde
25
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
10 tane rengin tahmini üzerinde resmi tekrar renkli resme dönüştürün. Yada kendiniz farklı bir algoritma
geliştirin. 3 tane resmi aynı ekranda gösterin (Orijinal, Gri, Dönüşmüş Resim)
Ödev 12
Aşağıda resimlerde görüldüğü gibi bir resmi sulu boyama efekti verecek şekilde renklendirme algoritması
geliştirin. Burada kırmızı bölgedeki detaylar kırmızı tek renkle boyanıyor muş gibi olsun. Mavilerde tek mavi
renkle boyanıyor muş gibi olsun. Bunun Eşikleme mantığını kullanabilirsiniz. Tabii bu mantığı daha da
geliştirmeniz gerekir. Algoritmanın çalıştığını farklı resimler gösterin. (Not: Aşağıdaki örnek hatalıdır. Çünkü sarı
çiçekte oranın hepsini sarı görmek isteriz. Mavini olduğu bölge hepsi mavi olmalıdır. Kırmızı da aynı şekilde)
26
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
GEOMETRİK DÖNÜŞÜMLER
Geometrik dönüşümler resim üzerindeki her pikselin bir konumdan (x1,y1) başka bir konuma (x2,y2)
haritalanmasıdır. Bununla ilgili olarak aşağıdaki işlemler kullanılabilir.
• Taşıma (Move):Resim içeriğinin konumunu değiştirme. Kanvas (tuval) üzerinde pikseller hareket ettirilir.
• Aynalama (Mirror): Resmin aynadaki görüntüsüne benzer simetrisini alma, görüntüyü takla attırma.
• Eğme ve Kaydirma (Skew): Resmin bir kenarından tutup kaydırma işlemidir.
• Ölçekleme (Zoom/Scale): Resim boyutunu değiştirme yada yaklaştırma uzaklaştırma.
• Döndürme (Rotate): Resmi çevirme.
Bu temel operatörler için aşağıdaki genel fonksiyonu kullanabiliriz. Bu formülde A matrisi ölçekleme, döndürme
ve aynalama işlemlerini formülüze ederken, B matrisi taşıma için kullanılır. Perspektif dönüşümlerde ise her iki
matris de kullanır.
𝑥2 𝑥1
[𝑦 ] = [𝐴] [𝑦 ] + [𝐵]
2 1
Geometrik dönüşümler görüntünün belli bir bölgesini yaklaştırma, yada belli bir seri resmin birleştirme için
kullanılabilir. Örneğin sırayla çekilmiş resimleri tek bir resim halinde panoramik (geniş açılı resimler) halin
getirmek için kullanılabiilr.
TAŞIMA (Translate)
Taşıma operatörü, giriş resmindeki her pikseli, çıkış resmindeki yeni bir konuma taşıma işlemidir. Orjinal
resimdeki (x1,y1) koordinatındaki her piksel belli bir öteleme mesafesi (βx, βy) boyunca taşınarak yeni konumu
olan (x2,y2) koordinatına yerleştirilir. Taşıma işlemi görüntü üzerinde iyileştirmeler yaparken yada başka
uygulamaların alt işlemleri olarak kullanılabilir.
𝑥2 = 𝑥1 + 𝑇𝑥
𝑦2 = 𝑦1 + 𝑇𝑦
Matris formatında
𝑥2 𝑥1 𝑇𝑥
[𝑦 ] = [𝑦 ] + [𝑇 ]
2 1 𝑦
Yeni oluşan koordinatlar (x2,y2) resmin sınırları dışına çıktıysa ya yok sayılır veya sınırlar genişletilerek, geride
bırakılan boşluk alanları doldurulur. Bu durumda iki tane alandan bahsedebiliriz. Bir tanesi görüntünün
bulunduğu resim (image) diğeri ise üzerinde kaydırıldığı zemin yani tuval (canvas) (bkz resim a). Burada resim
kaydırıldığında altında kanvas da görünecektir (resim b). Kanvas yeni sınırları da kapsayacak şekilde büyütülürse
resmin dışarı çıkan kısımları tekrar görünecektir fakat zeminde kanvas da görünecektir (resim c). Kanvas istenen
renge boyanabilir yada renksiz düşünülebilir (resim d).
1
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
a) b) c) d)
Programlama
double x2 = 0, y2 = 0;
x2 = x1 + Tx;
y2 = y1 + Ty;
if (x2 > 0 && x2 < ResimGenisligi && y2 > 0 && y2 < ResimYuksekligi)
CikisResmi.SetPixel((int)x2, (int)y2, OkunanRenk);
}
}
pictureBox2.Image = CikisResmi;
}
2
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
ResmiDiziyeYukle();
}
diziR.Add(OkunanRenk.R);
diziG.Add(OkunanRenk.G);
diziB.Add(OkunanRenk.B);
diziX.Add(x);
diziY.Add(y);
}
}
}
{
if (TasimaIslemi == true)
{
Tx2 = e.X;
Ty2 = e.Y;
Tasima(Tx, Ty);
int x2 = x1 + Tx;
int y2 = y1 + Ty;
}
pictureBox1.Image = CikisResmi;
}
AYNALAMA (Mirror/Reflect/Flip)
Yansıtma işlemi, görüntüyü orijinal resimdeki (x1, y1) konumundan alarak, belirlenen eksen veya bir nokta
etrafında yansıtarak yeni bir konuma (x2, y2) yerleştirilmesidir.
Bunun için x0 mesafesinden x1 mesafesini çıkarırsak birinci koordinatın eksene uzaklığını buluruz. Bunun iki katını
alıp x1 mesafesini de eklersek x2 koordinatının mesafesini bulmuş oluruz. y koordinatları değişmeyecektir.
Ekranın ortası yerine tıklanan noktayı eksen kabul ederek aynalama da benzer şekilde yapılabilir.
𝑥2 = 𝑥1 + 2(𝑥0 − 𝑥1 )
𝑥2 = −𝑥1 + 2𝑥0
4
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
𝑦2 = 𝑦1
𝑦2 = −𝑦1 + 2𝑦0
c) (x0,y0) noktasından geçen herhangi bir θ açısına sahip bir eksen etrafında aynalama.
∆= (𝑥1 − 𝑥0 ) 𝑆𝑖𝑛𝜃 − (𝑦1 − 𝑦0 ) 𝐶𝑜𝑠𝜃
olmak üzere
𝑥2 = 𝑥1 + 2 𝛥 (−𝑆𝑖𝑛𝜃) yeni x koordinatını verir.
𝑦2 = 𝑦1 + 2 𝛥 (𝐶𝑜𝑠𝜃) yeni y koordinatını verir.
Eğer (x0,y0) noktası resmin merkezi olmazsa, yansıyan görüntü sınırların dışına çıkacaktır.
Programlama
Orta dikey eksen etrafında aynalama Orta yatay eksen etrafında aynalama
5
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
double x2 = 0, y2 = 0;
if (x2 > 0 && x2 < ResimGenisligi && y2 > 0 && y2 < ResimYuksekligi)
CikisResmi.SetPixel((int)x2, (int)y2, OkunanRenk);
}
}
6
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
pictureBox2.Image = CikisResmi;
}
Şekil. İki noktası bilinen doğrunun eğimi karşı kenarın komşu kenara oranı ile belirtilir.
İki noktası bilinen doğrunun eğimin den hareket edersek x ve y değerleri arasındaki bağıntı bu doğrunun
eğiminden bulunur. denklemini ifade eder.
𝑦2 − 𝑦1 𝑦 − 𝑦1
𝑚= =
𝑥2 − 𝑥1 𝑥 − 𝑥1
İçler dışlar çarpımı yaparak x değerini girdi y değerini çıktı olarak verirsek buna göre doğrunun denklemi
aşağıdaki şekilde olacaktır. Bu denklemde sadece x ve y değerleri bilinmiyor. Diğerlerinin hepsi bilinen sayısal bir
değerdir.
(𝑦2 − 𝑦1)(𝒙 − 𝑥1)
𝒚= + 𝑦1
(𝑥2 − 𝑥1)
Örnek: Noktanın doğruya göre simetriğinin bulunması için aşağıdaki şekilde verildiği şekliyle somut bir örnek
üzerinde görelim. Buradaki doğrunun denklemi ve A noktasının koordinatları bilinmektedir. Bilinenler ışığında B
noktasının koordinatlarını bulmaya çalışalım.
Doğru denkleminden doğrunun eğimi bulunmaktadır. Denklemde y yalnız bırakılır ve x’in katsayısı eğimi ifade
etmektedir. Doğrunun eğimi aşağıda verilmiştir.
A noktasının eğime olan dik uzaklığı ile B noktasının eğime olan dik uzaklığı birbirine eşittir. Bu eşitlik yardımı ile
koordinat bilgisine ulaşılacaktır. A noktası ile B noktası arasındaki uzaklığın orta noktası yani C noktasının
koordinatları aşağıda bulunmaktadır.
C noktasının x ve y noktaları doğrunun denkleminde yerine yazılırsa aşağıdaki eşitlikler elde edilir.
Birbirine dik doğruların eğimleri çarpımı 1 eşittir. Bu eşitlik ile bir denklem daha türetilecektir. Öncelikle AB
doğrusunun eğimi aşağıdaki gibi ifade edilmektedir.
Doğrunun eğimi ve AB doğrusunun eğimlerinin çarpım ifadesinden aşağıdaki denklem elde edilir.
Yukarıdaki (2a+b=8) denklemi ile (a-2b=-5) eşitliği alt alta toplanarak denklemdeki bilinmeyen (a, b) değerleri
bulunur (iki bilinmeyenin çözümü için iki denklem gerekir).
EĞME-KAYDIRMA (Shearing)
Resmin bir tarafı sabit dururken diğer tarafının x ekseni yada y ekseni doğrultusunda kaydırmak için aşağıdaki
matrisi kullanabiliriz.
x-ekseni doğrultusunda kaydırmak için;
8
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
𝑥2 1 𝑏 𝑥1 𝑥2 = 𝑥1 + 𝑏 𝑦1
[𝑦 ] = [ ][ ]
2 0 1 𝑦1
𝑦2 = 𝑦1
𝑥2 1 −𝑏 𝑥1 𝑥2 = 𝑥1 − 𝑏 𝑦1
[𝑦 ] = [ ][ ]
2 0 1 𝑦1
𝑦2 = 𝑦1
𝑥2 1 0 𝑥1 𝑥2 = 𝑥1
[𝑦 ] = [ ][ ]
2 −𝑏 1 𝑦1
𝑦2 = −b𝑥1 + 𝑦1
// +X ekseni yönünde
//x2 = x1 + EgmeKatsayisi * y1;
//y2 = y1;
// -X ekseni yönünde
//x2 = x1 - EgmeKatsayisi * y1;
//y2 = y1;
// +Y ekseni yönünde
//x2 = x1;
//y2 = EgmeKatsayisi * x1 + y1;
// -Y ekseni yönünde
x2 = x1;
y2 = -EgmeKatsayisi * x1 + y1;
if (x2 > 0 && x2 < ResimGenisligi && y2 > 0 && y2 < ResimYuksekligi)
CikisResmi.SetPixel((int)x2, (int)y2, OkunanRenk);
}
}
pictureBox2.Image = CikisResmi;
}
ÖLÇEKLEME (Scaling)
Ölçekleme işlemi bir görüntünün boyutunu veya bir bölümünü küçültme yada büyültmek için kullanılır. Bu işlem
görüntü üzerinde alınan bir grup matrisin pikselin değerini daha küçük yada büyük matrise dönüştürme ile
gerçekleştirilir. Böylece matris büyüklüğüne göre ya pikseller çoğaltılır (yaklaştırma), yada azaltılır (uzaklaştırma).
Ölçeklenen resimler büyük resimlerin küçültülerek daha küçük hafızalarda saklanması, yada büyüterek belli bir
bölgeye dikkat çekmek için kullanılabilir.
Uzaklaştırma (Küçültme)(Zoom out)
Yeni oluşturulacak görüntüdeki pikselin değeri için iki farklı teknik kullanılabilir.
a) Piksel değiştirme: Bir grup komşu pikselin değeri, tek bir piksel değerine dönüştürülürken içlerinden birinin
değerine yada rastgele herhangi birinin değerine dönüştürülebilir. Bu metot işlemler açısından daha basittir
fakat örneklenen pikseller arasındaki farklılık çok fazla ise zayıf sonuçlara yol açabilir.
10
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
b) Piksel İnterpolasyonu: İkinci metod ise komşu pikseller arasında istatistiksel bir örnekleme yaparak (örneğin
ortalamasını alarak) oluşturulacak pikselin değerini belirler.
Şekil. Piksel değiştirmede dörtlü çerçevelerin sol üst köşelerindeki değerler kullanılmıştır. İnterpolasyonda ise
dört tane pikselin ortalama değeri kullanılmıştır.
11
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
{
OkunanRenk = GirisResmi.GetPixel(x1, y1);
R = R + OkunanRenk.R;
G = G + OkunanRenk.G;
B = B + OkunanRenk.B;
}
}
}
catch { }
return CikisResmi;
}
Şekil. Yakınlaştırma yöntemleri. a) Piksel değeri ile çoğaltma, b) İnterpolasyon ile çoğaltma.
13
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Programlama
int x2 = 0, y2 = 0;
OkunanRenk = GirisResmi.GetPixel(x1 , y1 );
if (x2 > 0 && x2 < ResimGenisligi && y2 > 0 && y2 < ResimYuksekligi)
CikisResmi.SetPixel(x2 , y2 , OkunanRenk);
}
}
}
pictureBox2.Image = CikisResmi;
DÖNDÜRME (Rotation)
Döndürme işlemi bir nokta etrafında belli bir açı (θ) değerinde çevirerek giriş resmindeki (x1,y1) koordinatını
çıkış resmindeki (x2,y2) noktasına taşıma işlemidir. Çoğu döndürme işleminde sınırların dışına çıkan kısımlar yok
sayılır.
14
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Döndürme işlemi çoğunlukla resmin görünümü daha iyi hale getirmek için kullanılabilir. Afin işlemlerinde
(persfektif bakış) de kullanılan bir işlem olacaktır.
Döndürme işlemi için formüllerimizi çıkaralım. Bir orijin (0,0) etrafında x-y eksen takımını saat yönünde θ açısı
kadar döndürdüğümüzde şekildeki gibi olacaktır. Burada x1 ve y1 değerleri ile θ açısı bilenen değerlerdir. x2 ve
y2 değerlerini bulmaya çalışalım. θ açısının bulunduğu üçgenlerin kenarlarına a,b,c,d sembollerini atarsak
aşağıdaki formüllerimiz çıkacaktır.
𝑑 𝑆𝑖𝑛𝜃 1 𝑆𝑖𝑛𝜃
𝑇𝑎𝑛𝜃 = → 𝑑 = 𝑥2 𝑇𝑎𝑛𝜃 → 𝑑 = 𝑥2 𝑥1 = 𝑎 + 𝑏 → 𝑥1 = 𝑥2 + 𝑦1 →
𝑥2 𝐶𝑜𝑠𝜃 𝐶𝑜𝑠𝜃 𝐶𝑜𝑠𝜃
𝑏 𝑆𝑖𝑛𝜃 1 𝑆𝑖𝑛𝜃
𝑇𝑎𝑛𝜃 = → 𝑏 = 𝑦1 𝑇𝑎𝑛𝜃 → 𝑏 = 𝑦1 𝑥2 = 𝑥1 − 𝑦1 →
𝑦1 𝐶𝑜𝑠𝜃 𝐶𝑜𝑠𝜃 𝐶𝑜𝑠𝜃
𝑥2 = 𝑥1 𝐶𝑜𝑠𝜃 − 𝑦1 𝑆𝑖𝑛𝜃
𝑆𝑖𝑛𝜃
𝑑 𝑑 (𝑥2 𝐶𝑜𝑠𝜃 )
𝑆𝑖𝑛𝜃 = →𝑎= → 𝑎= → 1 𝑆𝑖𝑛𝜃
𝑎 𝑆𝑖𝑛𝜃 𝑆𝑖𝑛𝜃 𝑦2 = 𝑐 + 𝑑 → 𝑦2 = 𝑦1 + 𝑥2 →
𝐶𝑜𝑠𝜃 𝐶𝑜𝑠𝜃
1
𝑎 = 𝑥2 1 𝑆𝑖𝑛𝜃
𝐶𝑜𝑠𝜃 𝑦2 = 𝑦1 + (𝑥1 𝐶𝑜𝑠𝜃 − 𝑦1 𝑆𝑖𝑛𝜃) →
𝐶𝑜𝑠𝜃 𝐶𝑜𝑠𝜃
𝑆𝑖𝑛𝜃
𝑏 𝑏 (𝑦1 𝐶𝑜𝑠𝜃 )
𝑆𝑖𝑛𝜃 = →𝑐= → 𝑐= → 1 𝑆𝑖𝑛2 𝜃
𝑐 𝑆𝑖𝑛𝜃 𝑆𝑖𝑛𝜃 𝑦2 = 𝑦1 + 𝑥1 𝑆𝑖𝑛𝜃 − 𝑦1 →
𝐶𝑜𝑠𝜃 𝐶𝑜𝑠𝜃
1
𝑐 = 𝑦1 1 𝑆𝑖𝑛2 𝜃
𝐶𝑜𝑠𝜃 𝑦2 = 𝑥1 𝑆𝑖𝑛𝜃 + 𝑦1 ( − ) →
𝐶𝑜𝑠𝜃 𝐶𝑜𝑠𝜃
𝐶𝑜𝑠 2 𝜃
𝑦2 = 𝑥1 𝑆𝑖𝑛𝜃 + 𝑦1 ( ) →
𝐶𝑜𝑠𝜃
𝑦2 = 𝑥1 𝑆𝑖𝑛𝜃 + 𝑦1 𝐶𝑜𝑠𝜃
Bu iki denklemi matris formunda yazarsak, orijin etrafında (resmin sol üst köşesi) bir noktanın dönüşü şu şekilde
olur.
𝑥2 𝐶𝑜𝑠𝜃 𝑆𝑖𝑛𝜃 𝑥1
[𝑦 ] = [ ][ ]
2 −𝑆𝑖𝑛𝜃 𝐶𝑜𝑠𝜃 𝑦1
15
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Pozitif θ açısı saatin yönünde dönmeyi ifade etmektedir. Resim alanı içerisindeki görüntü döndürülürken
döndürme noktası sol üst köşe yerine resmin ortasını almak gerekir. Bu durumda koordinatlardan resmin orta
noktasını gösteren x0 ve y0 değerlerini çıkarmak gerekir. Yani ilk işlemde orijin resmin ortasındaymış gibi
düşünüp, dönme işlemi gerçekleştikten sonra, resmi sol üst köşeye taşırsak x0 ve y0 değerlerini çıkarırız.
Resimlerde y koordinat ekseni aşağıya doğru bakmaktadır. Buna göre kullanacağımız formülleri çıkarırsak, şu
şekilde olacaktır.
𝑥2 = 𝑥1 𝐶𝑜𝑠𝜃 − 𝑦1 𝑆𝑖𝑛𝜃
(𝑥2 − 𝑥0 ) = (𝑥1 − 𝑥0 )𝐶𝑜𝑠𝜃 − (𝑦1 − 𝑦0 ) 𝑆𝑖𝑛𝜃
𝑥2 = (𝑥1 − 𝑥0 )𝐶𝑜𝑠𝜃 − (𝑦1 − 𝑦0 ) 𝑆𝑖𝑛𝜃 + 𝑥0
𝑦2 = 𝑥1 𝑆𝑖𝑛𝜃 + 𝑦1 𝐶𝑜𝑠𝜃
(𝑦2 − 𝑦0 ) = (𝑥1 − 𝑥0 )𝑆𝑖𝑛𝜃 + (𝑦1 − 𝑦0 )𝐶𝑜𝑠𝜃
𝑦2 = (𝑥1 − 𝑥0 )𝑆𝑖𝑛𝜃 + (𝑦1 − 𝑦0 )𝐶𝑜𝑠𝜃 + 𝑦0
Bu iki denklemi matris formunda yazarsak, resmin ortasındaki (x0,y0) noktası etrafında, (x1,y1) noktasını
çevirdiğimizde (x2,y2) yeni konumuna şu formülle döndürülür.
𝑥2 𝐶𝑜𝑠𝜃 𝑆𝑖𝑛𝜃 (𝑥1 − 𝑥0 ) 𝑥0
[𝑦 ] = [ ][ ] + [𝑦 ]
2 −𝑆𝑖𝑛𝜃 𝐶𝑜𝑠𝜃 (𝑦1 − 𝑦0 ) 0
Döndürme işlemi nedeniyle resmin orjinal boyutunun dışına çıkan kısımlar yok sayılabilir yada bu kısımlar siyah
renge dönüştürülebilir.
Bu formüller kullanıldığında x2 ve y2 koordinat değerleri, formül içindeki Sin ve Cos değerlerinden dolayı ondalık
sayı olarak çıkacaktır. Bu durumda dönmüş olan piksel değeri, resim üzerindeki yatay ve dikey konumda olan
piksel ızgarasının üzerine tam oturmayacaktır. Aynı anda birkaç pikselin üzerine basacaktır. Eğer en yakın tam
sayı değerine yuvarlatılsa bile bazı noktalara renk ataması yapılamayacaktır. Bazı pikseller çift adreslenirken
bazıları kaçırılacaktır. Bu durumda resim üzerinde boşluklar gözükecektir. Bu bozucu duruma alias (aliasing)
denir.
16
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Bu sorunu çözmek için değişik yöntemler kullanılabilir. Bunlardan üç tanesi şu şekildedir. Başka yöntemlerde
geliştirilebilir.
a) Kaynak resim üzerindeki pikseller aşırı örneklenerek büyütülebilir. Yani her piksel aynı renkte olmak
üzere nxn lik küçük bir matris şeklinde (örn: 2x2) büyütülebilir. Bu haliyle resim döndürülür ve ardından
küçültülürse aradaki boşluklar kaybolacaktır.
b) İkinci yöntemde ise sorunu tersine çevirebiliriz. Hedef piksel üzerine basan 4 tane kaynak pikselin
hangisi ağırlıkça en fazla yer işgal ediyorsa onun rengi atanabilir. Ayrıca bu algoritmaya üzerine basan 4
tane pikselin alan ağırlılığı ile doğru orantılı olacak şekilde ortalama bir renk değeri atanabilir. Bu durum
daha pürüzsüz bir görüntünün oluşmasını sağlayacaktır fakat hesaplama zamanı artacaktır.
c) Üçüncü yöntem ise daha ilginç bir yöntemdir. Bu yöntemde tüm pikseller önce yatay olarak sağa doğru
kaydırılır. Daha sonra dikey olarak aşağı doğru kaydırılır. Sonra tekrar sağa doğru yatayda kaydırılırsa
resim dönmüş olarak gözükecektir.
17
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
𝑦2 = (𝑦1 − 𝑦0 ) + 𝑦0
Bu işlemleri matris formatında gösterirsek topluca şu şekilde olacaktır.
𝑥2 1 −Tan (𝜃/2) 1 0 1 −Tan (𝜃/2) (𝑥1 − 𝑥0 ) 𝑥0
[𝑦 ] = [ ][ ][ ][ ] + [𝑦 ]
2 0 1 𝑆𝑖𝑛𝜃 1 0 1 (𝑦1 − 𝑦0 ) 0
Araştırma: Buradaki Kaydırma işlemi ile Döndürme İşlemi arasındaki arasındaki bağlantıların nasıl bulunduğunu
çıkarın.
Programlama (Alias düzeltme yok)
Alias düzeltilmeden sadece resmi döndürmeye ait kodlar aşağıdadır. Resim üzerinde farklı açılardaki alias
oluşumları gösterilmiştir.
double x2 = 0, y2 = 0;
//Döndürme Formülleri
x2 = Math.Cos(RadyanAci) * (x1 - x0) - Math.Sin(RadyanAci) * (y1 - y0) + x0;
y2 = Math.Sin(RadyanAci) * (x1 - x0) + Math.Cos(RadyanAci) * (y1 - y0) + y0;
18
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
double x2 = 0, y2 = 0;
x2 = Convert.ToInt16(x2);
y2 = Convert.ToInt16(y2);
19
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
x2 = Convert.ToInt16(x2);
y2 = Convert.ToInt16(y2);
x2 = Convert.ToInt16(x2);
y2 = Convert.ToInt16(y2);
if (x2 > 0 && x2 < ResimGenisligi && y2 > 0 && y2 < ResimYuksekligi)
CikisResmi.SetPixel((int)x2, (int)y2, OkunanRenk);
}
}
pictureBox2.Image = CikisResmi;
}
Araştırma: Yukarıda Alias düzeltme yapıldığı halde 30 derece neden hala boşlukların çıktığını araştırın.
KIRPMA
Kırpma işleminin mantığını ve algoritmasını kendiniz geliştirin. Ödev olarak istenecektir.
------------------------- 000 ------------------------------
Haftalık Ödev: Aşağıda verilen Ö1, Ö3 ve Ö4 ödevlerinin hepsinin uygulamasınıı yapınız.
------------------------- 000 ------------------------------
Ödev 1: a)Tıklayarak Resmi Taşıma: Resim üzerine bir noktaya tıklansın. Ardından ikinci noktaya tıklandığında
resmin o noktası yeni yerine gelecek şekilde resmi taşıyın. Tıklanan noktların gözle görülebilmesi için resim
üzerinde küçük bir kare çizdirin. (Picturebox üzerinde çizgi nasıl çizdirilir öğrenmek için İnt.Tab.Prg 4. Notlara
bakın)
b)Basılı Tutarak Resmi Taşıma: Bu işlemin aynısı mouse basılı iken de yapılabilir. Mouse basılı iken her hareket
ettiği nokta alınıp resim sürekli mouse takip edecek şekilde taşınabilir.
c) Formül Çıkarma: Aynalama komutlarından Resmin orta noktasına göre (x0,y0) belli bir açıda (θ) aynalarken
kullanılan aşağıdaki formüllerin çıkarılışını bulunuz. (Bilinenler x1, y1, x0, y0 dır. Bulunacak olan x2, y2) (Örnek
olarak döndürme işlemlemlerinin içindeki formül çıkarma yöntemini kullanabilirsiniz). Bu formüllerin
doğruluğunu kontrol ediniz, nasıl çalıştığını gösteriniz.
(x0,y0) noktasından geçen herhangi bir θ açısına sahip bir eksen etrafında aynalama.
∆= (𝑥1 − 𝑥0 ) 𝑆𝑖𝑛𝜃 − (𝑦1 − 𝑦0 ) 𝐶𝑜𝑠𝜃
olmak üzere
𝑥2 = 𝑥1 + 2 𝛥 (−𝑆𝑖𝑛𝜃) yeni x koordinatını verir.
𝑦2 = 𝑦1 + 2 𝛥 (𝐶𝑜𝑠𝜃) yeni y koordinatını verir.
Eğer (x0,y0) noktası resmin merkezi olmazsa, yansıyan görüntü sınırların dışına çıkacaktır.
20
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Ödev 2: Kaydırma komutuna tıklandığında resmin köşelerinden tutulup çekebilecek şekilde kaydırma
işlemi yapın. Örnek görünümü aşağıdakine benzer olsun. Burada olduğu gibi tüm köşelerden tutmak yerine üst
kenara yakın bölgede mouse basılı iken yana doğru sürükleme yaparsak, resim sağa doğru kaysın. Yan kenara
yakın bir bölgede mouse basılı iken aşağıda doğru sürüklersem resim aşağı doğru kaysın. Bu şekilde 4 kenar
üzerinde de bunu yapabilelim. Her iki yönede kayacak şekilde ayarlayabilelim.
Bir resim yana kaydırıldıktan sonra o resim tekrar aynı picturebox üzerinde gözükmeli. Yani yan tarafta değil
hepsi picturebox1 üzerinde olmalı. Böylecde tekrardan eğik resim üzerinde ikinci bir kaydırma işlemi
yapılabilmeli. Fakat bu esnada dışarı taşan piksellerin bilgisi kaybolacağından bunları kaybetmemek için tüm
resim üzerindeki piksel değerlerinin hem koordinatları hemde renk bilgileri dizide tutulabilir.
Ödev 3: Tıklanan iki noktayı eksen kabul eden çizginin etrafında aynalama yapan programı yazınız. Formüller
ders notları içerisinde vardır.
Ödev 4: Küçük bir resmi belli oranlarda büyütebilen bir program yazınız. Resim büyütme esnasında aralarda
oluşan piksel boşlukları (alias) için çözümde bulmaya çalışın.
Ödev 5: Resim üzerinde mouse ile tıklanan iki noktanın arasında oluşan dikdörtgeni Kırpma aracı olarak kullanan
programı yazın. Yani çizilen dikdörtgenin dışındaki kısımlar ikinci resimde olmayacak.
21
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
➔
------------------ 000--------------
Ödev 6: Bir resmi yukarıda anlatıldığı gibi yarı yarıya küçültme değil belli oranlarda küçültme yapabilecek
programı yazınız. %70, %30 gibi oranlarda da küçültme yapabilsin.
Ödev 7: Resmin ortasında tıklanan herhangi bir nokta etrafında texbox’tan girilen açı kadar çevirme yapan
kodaları yazın. Resmin ortasında tıklanan yerde küçük bir artı şeklinde işaret çizdirin. Dönme işleminden sonra
bu işaret kalkmalı.
a) b)
Ödev 9: Ölçekleme işlemlerinden büyültme işlemini hem "Piksel Değiştirme" metodu ile hem de "Piksel
İnterpolasyon" metodu ile programlayın. Hangisinin daha iyi bir sonuç verdiğini görmek için print-screen ile
alarak Paintte büyütüp inceleyin. Yanyana getirip kenarları karşılaştırın.
Ödev 10: Mouse ile bir resmi döndürme işlemi yaptırın. Resmin üzerinde mouse sol tuşana basılı tutarken ve
mouse ile döndürme hareketi yaparken resmin 4 kenarını çizgi şeklinde ve mouse takip edecek şekilde Orta
22
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
nokta etrafında çizdirin. Mousdan elimizi çektiğimiz anda resim gösterilen en son dikdörgenin içerisinde dönmüş
olarak gözüksün. Bu esnada picturbox ın dışına taşan kısımlar gözükmeyecektir.
Ödev 11: Resim döndürme işlemini açı olmadan Kaydırma yöntemini kullanarak programlayın. (Köşelerden 50
piksel kaydırak dönder)(Hem saat yönünde, hemde tersi yönde çalışan komutlar geliştirin)
Ödev 12: a) Döndürme komutunu programlarken Geometrik dönüşümle programlayın. Oluşan Alias boşluklarını
yok etmek için resim oluştuktan sonra siyah noktaların etrafındaki pikselleri okutun ve renk olarak etrafındaki
piksellerin ortalamasını alacak şekilde programlayın. Bu şekilde döndürme nedeniyle oluşan hatayı yok etmeye
çalışın. Eğer Aliasları yok etmek için iyi bir algoritma bulursanız büyük harflerle anlatın.
b) Döndürme işlemini Yana ve aşağı kaydırarak programlayın. Notlarda bu konuda hazır formül verilmiştir
fakat bunlar resmin ortasına göre kaydırma yapıyor. Siz bunu kullanmayacaksınız. Resmin köşesinden
eğerek döndürme yapacak. Bu konu notlar içinde anlatılmıştı. Burada yana ve aşağı kaydırırken oluşan
açı yı geliştireceğiniz formüller içinde kullanının. Yani açı verildiği zaman köşeden itibaren eğerek tam o
açı kadar dönmeyi sağlayacak yöntemi yada formülü bulun. Resmin dışına çıkan kısımların
kaybolmamasına dikkat edin. O problemi de çözün. Geliştirdiğiniz önemli uygulamaları büyük harflerle
anlatın.
a)
b)
Ödev 13: Kırpma işlemini yapan kodları yazınız. Mouse takip eden çizgi çizdirerek yapın...
23
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Ödev 14:
Aşağıdaki gibi bir resmin 4 kenarından tutup sağa-sola yada yukarı aşağı mouse ile sürükleme yaptığımızda, o
kenar üzerinde ilgili kaydırma işlemini yaptırın. Bu uygulamada mouse ile aynı anda kaydırma işlemi oluşsun...
Ödev 15:
Aşağıdaki resimde gösterildiği şekilde bir resim büyültme algoritması geliştirin. Bu işlemde resim iki bütülürken
her pikseli 4 lü gözlerin bir köşesine ekleyin. Aralardaki boşlukları sağa doğru tararken iki pikselin ortalamasını
alarak, aşağı doğru tararken yine iki pikselin ortalamasını alarak algoritmayı geliştirin.
Ödev 16 (Mouse un bulunduğu nokta etrafında tekerle zoom yapma): Aşağıdaki resimde gösterildiği gibi Mouse
resmin herhangi bir noktasında iken Mouse tekerini çevirdiğimizde bulunduğu noktanın etrafında zoom in/out
(yaklaştırma /uzaklaştırma) işlemlerini yapan algoritmayı geliştirin.
24
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Ödev 17 (Mouse bulunduğu nokta etrafında, tekerle döndürme): Aşağıdaki resimde gösterildiği gibi Mouse
resmin üzerinde herhangi bir noktada tutalım. Döndürme komutunu aktif ettikten sonra bu işlemleri yapmalıyız.
Odaklanılan nokta üzerinde iken Mouse tekeri geriye yada ileri dönderildiğinde resimde bulunan noktanın
etrafında dönsün. Oluşan Alias (resim piksel boşlukları) olayı da bu esnada bulunabilir.
Ödev 18 (Alias Yok Etme): Resim pikselleri üzerinde hesaplama yaptığımızda double olan küsüratlı değerler
resmin üzerine yerleştirilirken integer a çevrilmek zorundadır. Bu nedenle küsüratlar kaybolunca bazı piksellerin
üzerine renk atanmamaktadır. Bu durum Alias dediğimiz boşlukların oluşmasına neden olmaktadır. Aşağıda
resimde verildiği şekilde bir resmi değişik açılarda döndürdüğümüzde alias oluşan boşlukları kapatan bir
algoritma geliştirin. Bunun için fikir olarak şu söylenebilir. Resmi öncelikle diziye atın. Döndürme işlemlerini dizi
üzerinden yapın. Yeni resmin çerçevesini de dizide tutun. Bu ikinci dizide her renk atanan koordinata bir eğer bir
atama yapıldıysa bunu bir bilgide tutun. En tarama işlemi bittiğinde bu ikinci dizi bize hangi piksellerde renk
atanmadığı bilgisini verecektir. Sonrada ikinci resmi bir daha taradığımızda renk atanmayan piksellerindeki
etrafındaki 9 piksele bakıp bunların ortalama rengi, bu atanmayan piksele verilebilir. Bu şekilde algoritmayı
geliştirin.
25
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
26
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Homojen koordinat sistemi yukarıda da bahsedildiği gibi,iki boyutlu kartezyen koordinat sistemine üçüncü bir
boyut (z) eklenmesiyle oluşturulur. A(x1,y1) koordinatları artık A(x1,y1,h) üçlüsüne dönüşür. Dönüşüm için
homojen koordinatlar bir h değeri ile çarpılır yada bölünür. Bu sayede iki koordinat sistemi arasında bir ilişki
oluşur.
Araştırma: Homejen koordinatlara neden ihtiyaç duyuyoruz. Bu koordat sistemi olmadan matris tersini alamaz
mıyız. Araştırın?
Bu ilişkide kullanılan üçüncü koordinat bileşeni olan z, genel olarak h ile ifade edilir ve 1 alınır. Çünkü iki
boyutlu eksendeki bir noktanın, homojen koordinat ekseninde sonsuz gösterimi olacaktır. Örneğin kartezyen
koordinat sisteminde (x=2,y=3) koordinatlarına sahip bir cismin, Homojen koordinattaki gösterimi aşağıdaki gibi
sonsuz sayıda olabilir.
Kartezyen gösterim = Homojen gösterim
A(x1,y1)= A(x1,y1,h)
A(2,3)= A(2,3,1) (h=1)
A(2,3)= A(4,6,2) (h=2)
A(2,3)= A(6,9,3) (h=3)
... = ......
A(2,3)= A(2n,3n,n) (h=n)
1
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Bu noktaların hepsi kartezyen koordinatta aynı noktayı gösterir ve hepsi birbirine eşit demektir. Bu nedenle bir
çok işlemi kolaylaştırması için homojen koordinatta h=1 alınır. Böylece matematiksel dönüşümler kolaylaşmış
olacaktır. Dikkat edersek yukarıda tek tablo şeklinde verilen dönüşüm formüllerindeki matris gösterimleri
homojen koordinatlarda verilmiştir. Örnek olarak birini yazacak olursak (döndürme matrisini seçelim) aşağıdaki
şekilde olur.
Döndürme matrisinin normal gösterimi Döndürme matrisinin homojen koordinatlar
kullanılarak gösterimi
𝑥2 𝐶𝑜𝑠𝜃 𝑆𝑖𝑛𝜃 𝑥1 𝑥2 𝐶𝑜𝑠𝜃 𝑆𝑖𝑛𝜃 0 𝑥1
[𝑦 ] = [ ][ ]
2 −𝑆𝑖𝑛𝜃 𝐶𝑜𝑠𝜃 𝑦1 [𝑦2 ] = [−𝑆𝑖𝑛𝜃 𝐶𝑜𝑠𝜃 0] [𝑦1 ]
𝑧 0 0 1 1
Sonuç olarak homojen koordinat sistemi bize afin dönüşümlerinin tamamının çarpımsal matris formunda
uygulanabilme kolaylığı sağlayacak. Geometrik hesaplamalarda esnek bir hesaplama imkanı sağlayacaktır. Bu
avantajı gelecek örneklerde daha iyi anlayacağız.
-------------------000----------------
Şimdi gelelim pespektif dönüşüm için kullanılan parametrelerin nasıl bulunabileceğine. Perspektif dönüşümünün
bir matris çarpması ile yapıldığını biliyoruz. Dönüşüm için kullandığımız matrisi homojen koordinatları da dahil
ederek aşağıdaki gibi oluşturabiliriz. Homojen koordinatlarda yazarken h=1 aldığımız için denklemler aşağıdaki
gibi oluşturulur. Burada (x1,y1) giriş resmindeki pikselin koordinatlarını, (X1,Y1) ise çıkış resmindeki
koordinatları temsil etmektedir (Dikkat: önceki notlarda çıkış resminin koordinatlarını x2,y2 şeklinde
kullanıyorduk. Fakat aşağıda 4 tane noktaya ihtiyaç olacak. Dolayıs noktaları 1,2,3,4 indisleri ile
kullanacağımızdan burada çıkış resimlerinin koordinatları büyük harflerle gösterilmiştir.) Her iki resimdeki bu
noktaların koordinat değerleri bilinmektedir. Bilinmeyen [A] matrisinin elemanlarıdır.
𝑿𝟏 𝑧 𝑎11 𝑎12 𝑎13 𝑥1
[𝒀𝟏 𝑧 ] = [𝑎21 𝑎22 𝑎23 ] [𝑦1 ]
𝑧 𝑎31 𝑎32 1 1
Burada amacımız A matrisinin (axx-elemanları ile gösterilen matris) elemanlarını bulmaktır. İlk olarak matris
değerlerini açık denklemler şeklinde yazalım.
𝑿𝟏 z = 𝑎11 𝑥1 + 𝑎12 𝑦1 + 𝑎13
𝒀𝟏 z = 𝑎21 𝑥1 + 𝑎22 𝑦1 + 𝑎23
z = 𝑎31 𝑥1 + 𝑎32 𝑦1 + 1
Buradaki z denklemini önceki iki denklemde yerine yazarsak ve X1,Y1 çekersek denklemler aşağıdaki gibi olur.
𝑎11 𝑥1 + 𝑎12 𝑦1 + 𝑎13
𝑿𝟏 =
𝑎31 𝑥1 + 𝑎32 𝑦1 + 1
𝑎21 𝑥1 + 𝑎22 𝑦1 + 𝑎23
𝒀𝟏 =
𝑎31 𝑥1 + 𝑎32 𝑦1 + 1
Bu denklemlere içler dışlar çarpımı uygularsak;
𝑎31 𝑥1 𝑿𝟏 + 𝑎32 𝑦1 𝑿𝟏 + 𝑿𝟏 = 𝑎11 𝑥1 + 𝑎12 𝑦1 + 𝑎13
𝑎31 𝑥1 𝒀𝟏 + 𝑎32 𝑦1 𝒀𝟏 + 𝒀𝟏 = 𝑎21 𝑥1 + 𝑎22 𝑦1 + 𝑎23
Yalnız kalan X1 veY1 terimlerini çekersek;
𝑿𝟏 = 𝑎11 𝑥1 + 𝑎12 𝑦1 + 𝑎13 − 𝑎31 𝑥1 𝑿𝟏 − 𝑎32 𝑦1 𝑿𝟏
𝒀𝟏 = 𝑎21 𝑥1 + 𝑎22 𝑦1 + 𝑎23 − 𝑎31 𝑥1 𝒀𝟏 − 𝑎32 𝑦1 𝒀𝟏
Bu iki denklemi matris formunda yazacak olursak [C]=[B][A] şeklinde bir format ortaya çıkar. Burada [A] bir
vektördür (Tek boyutlu matris).
2
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
𝑎11
𝑎12
𝑎13
𝑿𝟏 𝑥 𝑦 1 0 0 0 −𝑥1 𝑿𝟏 −𝑦1 𝑿𝟏 𝑎21
[ ]=[ 1 1 ]
𝒀𝟏 0 0 0 𝑥1 𝑦1 1 −𝑥1 𝒀𝟏 −𝑦1 𝒀𝟏 𝑎22
𝑎23
𝑎31
[𝑎32 ]
ifadesi elde edilir. Burada aranılan [A] matrisi [A]=[B−1][C] işlemi ile kolaylıkla bulunabilir. Burada dikkat
edilmesi gereken bir nokta elimizde sekiz bilinmeyenli bir [A] matrisi olmasına rağmen görünürde sadece iki
denklemimiz olmasıdır. Sekiz bilinmeyenli bir denklemin çözümü için bağımsız sekiz tane denklem
gerekmektedir. Bu amaçla tek bir nokta yerine 4 tane (x,y) noktası kullanılarak [A] matrisinin elemanları
bulunacak. Bulduğumuz axx değerleri iki resim arasındaki dönüşümü yapacak olan 3x3 lük dönüşüm matrisini
oluşturacaktır. Bilinen 4 nokta için matris denklemimizi tekrar yazarsak aşağıdaki şekilde olur.
𝑿𝟏 𝑥1 𝑦1 1 0 0 0 −𝑥1 𝑿𝟏 −𝑦1 𝑿𝟏 𝑎
11
𝒀𝟏 0 0 0 𝑥1 𝑦1 1 −𝑥1 𝒀𝟏 −𝑦1 𝒀𝟏 𝑎
12
𝑿𝟐 𝑥2 𝑦2 1 0 0 0 −𝑥2 𝑿𝟐 −𝑦2 𝑿𝟐 𝑎13
𝒀𝟐 0 0 0 𝑥2 𝑦2 1 −𝑥2 𝒀𝟐 −𝑦2 𝒀𝟐 𝑎21
=
𝑿𝟑 𝑥3 𝑦3 1 0 0 0 −𝑥3 𝑿𝟑 −𝑦3 𝑿𝟑 𝑎22
𝒀𝟑 0 0 0 𝑥3 𝑦3 1 −𝑥3 𝒀𝟑 −𝑦3 𝒀𝟑 𝑎23
𝑿𝟒 𝑥4 𝑦4 1 0 0 0 −𝑥4 𝑿𝟒 −𝑦4 𝑿𝟒 𝑎31
[𝑎 ]
[ 𝒀𝟒 ] [ 0 0 0 𝑥4 𝑦4 1 −𝑥4 𝒀𝟒 −𝑦4 𝒀𝟒 ] 32
Bu matris denkleminde, en sağdaki [A] matrisinin elemanları hariç diğer tüm elemanları biliyoruz. [A] matrisini
yanlız bırakabilmek için ortadaki 8x8 lik [B] matrisinin tersini alıp, karşı taraftaki 8x1 lik [C] matrisi ile
çarpmalıyız. Yani [A]=[B−1][C] şeklinde bir işlem yapacağız. Bu işlem için matris tersini almayı öğrenmemiz
gerekiyor. Şimdi bu konuya bakalım daha sonra kaldığımız yerden devam ederiz.
Bir örnek üzerinde bu yöntemi inceleyelim. Aşağıdaki denklem takımını çözmeye çalışalım.
11 = 𝑥 + 2𝑦 + 2𝑧
4 = 3𝑥 + 2𝑦 − 𝑧
3 = 2𝑥 − 𝑦 + 𝑧
Bu denklem takımını matris formatında yazarsak aşağıdaki şekilde olur.
11 1 2 2 𝑥
[ 4 ] = [3 2 −1] [𝑦]
3 2 −1 1 𝑧
Bu matris takımını [C]=[A][X] matris formatında gösterirsek, buradaki [X] matrisindeki değerleri bilmiyoruz ve
bunu bulmak için [A] matrisinin tersini alıp [C] matrisi ile çarpmalıyız. Yani [X]=[A -1][C] şeklinde olmalıdır.
Buna göre [A] katsayılar matrisinin tersini nasıl alırız. Bunun için Gauss Jordan yöntemini kullanacağız.
Gauss Jordan yönteminde [A] katsayı matrisini birim matrise dönüştürmeye çalışacağız ve bu durumda [C]
matrisi de ilgili sayılarla çarpılarak belli bir değer alacak. [A] matrisi birim matris olunca yeni değerlere sahip
olan [C] matrisi x,y,z değerlerini gösteren sonuç matrisi olacaktır, yani denklem takımının çözümü olacaktır.
11 1 2 2 𝑥 ∗ 1 0 0 𝑥
[ 4 ] = [3 2 −1] [𝑦] ==> [∗] = [0 1 0] [𝑦]
3 2 −1 1 𝑧 ∗ 0 0 1 𝑧
Buradaki işlemleri matrsi formunda kısaltmalı olarak gösterirsek,
[C] =[A] [X] [A] [A-1] = [I]
[C] =([I]/ [A-1]) [X] [A]= [I]/ [A-1]
[C] [A-1] = [I] [X]
Şimdi [C][A] matrislerine çeşitli satır işlemleri uygulayarak bu dönüşümü yapalım. Burada uygulanabilecek satır
işlemleri aşağıdaki işlemlerden herhangi biri olabilir.
• Bir satırın bir sabit ile çarpılması
• Bir satırın diğer bir satır ile yer değiştirmesi
• Bir satırın diğer bir satırdan çıkarılması
Daha basit gösterim için aşağıdaki formatı kullanalım. Burada [C] matrisi ile [A] matrisi sadece yanyana
getirilmiş. Herhangi bir matematiksel anlamı yok. İşlemler yapılırken her iki matrisi de uygulanacak. Böylece sağ
taraftaki [A] matrisi birim matrise dönüşürken sol taraftaki [C] matriside başka bir değerler alacaktır. Böyle [A]
matrisinin birim matris olması sonucu ortaya çıkan [C] matrisi aslında çözüm olarak aradığımız [C] [A-1] ifadesi
olmuş oluyor.
11 1 2 2
[ 4 ] [3 2 −1]
3 2 −1 1
Önce köşegenin altındaki terimleri 0 yapalım. Köşegen üzerindeki değerleri de 1 yapalım. Burada hangi satırda
işlem yaparsak o satırın kaçıncı elemanı 0 yada 1 yapmaya çalışıyoruz ona bakıyoruz. Eğer 3 eleman bulunan
satırın ilk elemanı değiştirmeye çalışıyorsak en yukarıdaki 1 satırda işlemleri yapmalıyız. Son 3. Elemanı
değiştirmeye çalışıyorsak en son 3. Satırı kullanmalıyız. Çıkan değerleri kendi bulunduğu satır ile topluyoruz.
a) (a21=3) değerini 0 yapmak için birinci satırı -3 ile çarpıp (ilk terim olduğu için birinci satır ile çarpıyoruz) 2.
satır ile toplayalım. Yani [-3*11][-3*1 , -3*2, -3*2] = [-33][-3, -6, -6] olur. Bu değerleri 2. satır ile toplarsak
[33+4][-3+3, -6+2, -6-1]=[-29][0,-4,-7]. Bu sonucu matristeki yerlerinde gösterirsek; (Not: burada R gösterimi
Row (satır manasında). İşlem yapılan satırları ifade ediyor. )
4
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
11 1 2 2 𝑅2 =−3𝑅1 +𝑅2 11 1 2 2
[ 4 ] [𝟑 2 −1] → [−29] [𝟎 −4 −7]
3 2 −1 1 3 2 −1 1
b) (a22=-4) değerini 1 yapmak için ikinci satırı -4 bölmemiz yeterli olacaktır. Yani [-29/-4][0/-4 , -4/-4, -7/-4] =
[29/4][0 , 1, 7/4] olur. Bu sonucu matristeki yerlerinde gösterirsek;
11 1 2 2 𝑅2 =𝑅2 /−4 11 1 2 2
[−29] [0 −𝟒 −7] → [29/4] [0 𝟏 7/4]
3 2 −1 1 3 2 −1 1
c) (a31=2) değerini 0 yapmak için; o satırdaki ilk eleman olduğu için birinci satırı kullanmalıyız. Birinci satırı -2
ile çarparsak ve çıkan sonuçları da 3. satır ile toplarsak bu ilk terimi sıfır yapmış oluruz. Yani [-2*11][-2*1 , -2*2,
-2*2] = [-22][-2, -4, -4] olur. Bu değerleri 3. satır ile toplarsak [-22+3][-2+2, -4-1, -4+1]=[-19][0,-5,-3]. Bu
sonucu matristeki yerlerinde gösterirsek;
11 1 2 2 𝑅3 =−2𝑅1 +𝑅3 11 1 2 2
[29/4] [0 1 7/4] → [29/4] [0 1 7/4]
3 𝟐 −1 1 −19 𝟎 −5 −3
d) (a32=-5) değerini 0 yapmak için; için ikinci satırı kullanmalıyız. İkinci satırı +5 ile çarparsak ve çıkan sonuçları
da kendisi ile toplarsak bu ikinci terimi sıfır yapmış oluruz. Yani [5*29/4][5*0 , 5*1, 5*7/4] = [145/4][0, 5, 35/4]
olur. Bu değerleri 3. satır ile toplarsak [(145/4) -19][0+0, 5-5, (35/4)-3] =[69/4][0,0,23/4]. Bu sonucu matristeki
yerlerinde gösterirsek;
11 1 2 2 𝑅 =+5𝑅 +𝑅 11 1 2 2
3 2 3
[29/4] [0 1 7/4] → [29/4] [0 1 7/4 ]
−19 0 −𝟓 −3 69/4 0 𝟎 23/4
e) (a33=23/5) değerini 1 yapmak için; üçüncü satırı ya 23/4 bölmeliyiz yada 4/23 ile çarpmalıyız.
11 1 2 2 𝑅 =𝑅 ∗4/23 11 1 2 2
3 3
[29/4] [0 1 7/4 ] → [29/4] [0 1 7/4]
69/4 0 0 𝟐𝟑/𝟒 3 0 0 𝟏
Buraya kadar yapılan işlemler Gauss Eliminasyon yöntemi olarak geçmektedir. Köşegenin üst kısmındaki
değerleri de 0 yaparsak Gauss Jordan yöntemi olmuş oluyor. Benzer şekilde kaldığımız yerden devam ederek
köşegenin üst kısmını da 0 yapalım.
f) (a12=2) değerini 0 yapmak için; ikinci satırı -2 ile çarpıp birinci satır ile toplamalıyız. Yani [-2*29/4][-2*0 , -
2*1, -2*7/4] = [-29/2][0, -2, -7/2] olur. Bu değerleri 1. satır ile toplarsak [-29/2+11][0+1, -2+2, -7/2+2]=[-
7/2][1,0,-3/2]. Bu sonucu matristeki yerlerinde gösterirsek;
11 1 𝟐 2 𝑅 =−2∗𝑅 +𝑅 −7/2 1 𝟎 −3/2
1 2 1
[29/4] [0 1 7/4] → [ 29/4 ] [0 1 7/4 ]
3 0 0 1 3 0 0 1
f) (a13=-3/2) değerini 0 yapmak için; üçüncü satırı 3/2 ile çarpıp birinci satır ile toplamalıyız. Yani [3/2*3][3/2*0 ,
3/2*0, 3/2*1] = [9/2][0, 0, 3/2] olur. Bu değerleri 1. satır ile toplarsak [9/2-7/2][0+1, 0+0, 3/2-3/2]=[1][1,0,0]. Bu
sonucu matristeki yerlerinde gösterirsek;
−7/2 1 0 −𝟑/𝟐 𝑅 =3/2∗𝑅 +𝑅 1 1 0 𝟎
1 3 1
[ 29/4 ] [0 1 7/4 ] → [29/4] [0 1 7/4]
3 0 0 1 3 0 0 1
g) (a23=7/4) değerini 0 yapmak için; üçüncü satırı -7/4 ile çarpıp ikinci satır ile toplamalıyız. Yani [-7/4*3][-7/4*0
, -7/4*0, -7/4*1] = [-21/4][0, 0, -7/4] olur. Bu değerleri 2. satır ile toplarsak [-21/4+29/4][0+0, 0+1, -
7/4+7/4]=[2][0,1,0]. Bu sonucu matristeki yerlerinde gösterirsek;
1 1 0 0 𝑅 =−7/4∗𝑅 +𝑅 1 1 0 0
1 3 2
[29/4] [0 1 𝟕/𝟒] → [2] [0 1 𝟎]
3 0 0 1 3 0 0 1
Böylece katsayılar matrisini birim matrise dönüştürmüş olduk. Sonuç itibariyle denklem takımımız şöyle olur.
5
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
1 1 0 0 𝑥
[2] = [0 1 0] [𝑦]
3 0 0 1 𝑧
Bu matris formatını açarsak x=1, y=2, z=3 olarak bulmuş oluruz.
C# Kodları
return CikisMatrisi;
}
-------------------000-------------------
Kaldığımız yerden devam edersek, matris tersini almayı öğrendik. Şimdi aşağıdaki 4 nokta üzerinde perspektif
düzeltme yapacak matris denklemindeki axx katsayılarını bulalım. Bunun için bir örnek resim kullanalım ve
üzerindeki anahtar noktaların koordinatlarını paint programında okuyup dönüşüm matrisini bulalım.
Bu resimdeki 1,2,3,4 nolu noktaları sırayla a,b,c,d noktalarının olduğu köşelere doğru gerdirilecektir. Böylece
plakanın yazım alanı resmin tamamını kaplayacaktır. Fakat plakanın en boyu orantısı bozulacağı için a,b,c,d
noktalarının olduğu koordinatlar resmin içerisine sığdırmak yerine, istediğimiz herhangi bir dikdörtgenin köşeleri
olarak da atayabiliriz. Önce birinci uygulamayı bir yapalım. Bu 8 noktanın koordinatlarını paint gibi basit bir
programa atıp mouse ile üzerinde gezdirirsek koordinatları okuyabiliriz. Tabi burada resmin üzerine sonradan
eklenen çizgiler işlemlerde olmayacaktır. Yukarıdaki resmin üzerindeki noktaların koordinatları aşağıda gibi
okunmuştur. x2=806 değeri çerçevenin dışında bir nokta olarak belirlenmiştir.
1.nokta, x1= 47, y1=155 a noktası, X1 = 0, Y1=0
2.nokta, x2=806, y2=101 b noktası, X2 = 800, Y2=0
7
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
8
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
--------------------- 0000------------------------------
bxx matrisin tersinin katsayılarını bulduğumuza göre ve Xx,Yx koordinatlarını da biliyoruz buradan axx değerlerini
buluruz. Bu değerler aynı zamanda dönüşüm denklemindeki [A] matrisinin elemanlarıdır. Yani aşağıdaki
denklemdeki katsayılar matrisidir.
Bu denklemi resim üzerindeki tüm noktalara uygulamak için genelleştirirsek ve aynı zamanda programlamada
kullanacağımız indislere dönüştürürsek aşağıdaki şekilde olur. Programlarken diziler (0,0) değerinden başlar.
z = 𝑎20 x + 𝑎21 y + 1
Dikkat: Matrisleri programlarken indisler bir sayı aşağıdan başlar. Çünkü dizilerin başlangıç değerleri (0,0) dır.
Buna göre programda a11 matris elemanı a00 olarak gösterilir.
Artık bu formülleri kullanarak tüm belirlediğimiz alanı istediğimiz çerçeve içine sığdırabiliriz.
Plakayı daha gerçekci boyutlar görmek için dönüşeceği sınırları daha küçük tutmalıyız. (X1,Y1=0,178;
X2,Y2=800,178; X3,Y3=0,378; X4,Y4=800,378). Çerçeve 800x200 olarak belirlenmiştir.
9
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
Resim ne kadar büyük bir çerçeveye yerleştirilirse aradaki boşluklar (piksel kayıpları-alias) o kadar fazla
olmaktadır. Elde edilen resimler tekrar filtreden geçilip kayıp pikseller düzeltilmelidir. Eğer yerleştirilecek
çerçeve daha küçük seçilirse kayıp piksel azalmaktadır. Aşağıdaki örnek (400x100) boyutlarındadır. Burada
gösterilen resimler küçültülmüş boyutlardadır. Bu resimlerin her biri gerçekte 800x600 boyutlarındadır.
Yukarıdaki ilk örnekte plaka alanı (800x600) alana yerleştirilince kayıp piksel artmıştır (a resmi). Plaka 400x100
boyutlarına küçültüldüğünde kayıp pikseller daha az oluşmuştur (b resmi).
a) b)
private void btnPERSPEKTIF_Click(object sender, EventArgs e)
{
double x1 = Convert.ToDouble(txt_x1.Text);
double y1 = Convert.ToDouble(txt_y1.Text);
double x2 = Convert.ToDouble(txt_x2.Text);
double y2 = Convert.ToDouble(txt_y2.Text);
double x3 = Convert.ToDouble(txt_x3.Text);
double y3 = Convert.ToDouble(txt_y3.Text);
double x4 = Convert.ToDouble(txt_x4.Text);
double y4 = Convert.ToDouble(txt_y4.Text);
double X1 = Convert.ToDouble(txtX1.Text);
double Y1 = Convert.ToDouble(txtY1.Text);
double X2 = Convert.ToDouble(txtX2.Text);
double Y2 = Convert.ToDouble(txtY2.Text);
double X3 = Convert.ToDouble(txtX3.Text);
double Y3 = Convert.ToDouble(txtY3.Text);
double X4 = Convert.ToDouble(txtX4.Text);
double Y4 = Convert.ToDouble(txtY4.Text);
10
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
GirisMatrisi[5, 3] = x3;
GirisMatrisi[5, 4] = y3;
GirisMatrisi[5, 5] = 1;
GirisMatrisi[5, 6] = -x3 * Y3;
GirisMatrisi[5, 7] = -y3 * Y3;
//---------------------------------------------------------------------------
double[,] matrisBTersi = MatrisTersiniAl(GirisMatrisi);
double X, Y, z;
z = a20 * x + a21 * y + 1;
X = (a00 * x + a01 * y + a02) / z;
Y = (a10 * x + a11 * y + a12) / z;
pictureBox2.Image = CikisResmi;
}
13
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.com
noktaları) daha sonra düzeltmeye çalışın. Bu kısımlara geldiğinde etrafındaki 9 tane pikselin değerine bakın ve
ortadaki pikseli bu piksellerin ortalaması olarak aldırın. Buna benzer resmi daha da iyileştirecek bir yöntem
bulmaya çalışın.
Araştırma: Gaus Jordan yönteminin ne olduğunu araştıralım. Yukarıda geçen 8x8 matrislerin tersini almak için
programlamada bu yöntem mi kullanılmaktadır, değilse hangi yöntemi kullanıyor.
14
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
1
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
}
}
pictureBox2.Image = CikisResmi;
}
Yukarıda verilen örnek resim filtrenin özelliklerini görmek için yeterli olmaz. Yumuşatma filtreleri daha çok
resim üzerindeki gürültüyü azaltmak için kullanılır. Aşağıdaki resimler Mean filtresinin gürültülü bir resim
üzerindeki etkisini göstermektedir. Sırayla normal gürültülü resim, 3x3, 5x5 ve 7x7 şablon (matris)
kullanılan resimlerdir.
3
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Aynı resim üzerinde 3 defa 3x3 şablonu ile Mean filtresini uygularsak aşağıdaki gibi sonuç alırız. Bu
sonucun 5x5 şablonuna yakın bir sonuç verdiğini görebiliriz. Her iki uygulamada da işlem gören piksel
sayısı yakın bir değer olmuş olur. (3x3=9)x3=27 piksel. 5x5=25 piksel.
4
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Araştırma: Çekirdek matris resim üzerinde ilerlerken her seferinde eski resmin piksellerine bakmaktadır.
Oysa rengi değişmiş olan piksellerin rengi de kullanılabilir. Böyle uygulama durumunda resim de nasıl bir
değişiklik görürüz. Deneyerek bulmaya çalışın.
5
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
6
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
int SablonBoyutu = 0;
try
{
SablonBoyutu = Convert.ToInt32(textBox1.Text);
}
catch
{
SablonBoyutu = 3;
}
int ElemanSayisi = SablonBoyutu * SablonBoyutu;
int x, y, i, j;
7
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
R[k] = OkunanRenk.R;
G[k] = OkunanRenk.G;
B[k] = OkunanRenk.B;
Gri[k] = Convert.ToInt16(R[k] * 0.299 + G[k] * 0.587 + B[k] * 0.114); //Gri ton formülü
k++;
}
}
GeciciSayi = R[i];
R[i] = R[j];
R[j] = GeciciSayi;
GeciciSayi = G[i];
G[i] = G[j];
G[j] = GeciciSayi;
GeciciSayi = B[i];
B[i] = B[j];
B[j] = GeciciSayi;
}
}
}
//Sıralama sonrası ortadaki değeri çıkış resminin piksel değeri olarak atıyor.
CikisResmi.SetPixel(x, y, Color.FromArgb(R[(ElemanSayisi - 1) / 2], G[(ElemanSayisi - 1) /
2], B[(ElemanSayisi - 1) / 2]));
}
}
pictureBox2.Image = CikisResmi;
}
Medyan filtresinin dezavantajı olarak şundan bahsedilebilir. Resim üzerinde büyük boyutlarda gürültü varsa,
Medyan filtresi küçük matrislerle (şablonla) gürültüyü tam olarak kaldıramaz. Bu gibi durumlarda daha
büyük matrisler kullanmak gerekir yad a bir kaç kez aynı filtreden geçirmek gerekebilir.
Bir diğer dezevantajı ise hesaplama zamanın uzun olmasıdır. Çünkü komşu piksellerin değerlerini alıp
bunları sıralamaya tabi tutar. Bazı akıllı algoritmalar ile sıralama hızı artırılabilir. Örneğin şablon resim
üzerinde gezerken bir birçok pikselin değeri bir adımdan diğerine aynı kalmaktadır.
8
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
9
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
1 𝑥2
𝐺(𝑥) = 𝑒 − 2𝜎
√2𝜋 𝜎
1 𝑥 2 +𝑦 2
−
𝐺(𝑥) = 𝑒 2𝜎2
√2𝜋 𝜎 2
Burada σ dağılımın standart sapmasıdır. Ayrıca, dağılımın ortalamasının sıfır olduğu varsayılmıştır (yani, x
= 0 çizgisine ortalanmıştır). 2 boyutlu ve 3 boyutlu grafik eksenel olarak simetrik değerlere sahiptir.
İki boyutlu grafiği Standart sapma σ=1 için x=∓2 aralığında excel de çizecek olursak aşağıdaki grafiği elde
ederiz.
3 boyutluğu grafiği çizmek için Word içerisine yine microsoft'un bir eklentisi olan Mathematics programını
(https://www.microsoft.com/en-us/download/confirmation.aspx?id=17786) adresinden indirip kuralım.
Word'ü kapatıp açtığımızda ilgili sekme gözükecektir. Ardından denklemimizi sayfada yazıp seçersek
10
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
menüden Plot in 3D seçip grafiği çizdirebiliriz. Grafik üzerinde bazı ayarları (çizim aralıklarını vs seçip
istenilen grafiğin durumunu görebiliriz.
a) Standart sapma σ=1 için çizilen grafik b) Standart sapma σ=2 için çizilen grafik
Dikkat edilirse standart sapma değeri arttıkça grafik daha yayvan hale gelmektedir. z değerinin 0 yakın bir
değerden başlaması için x ve y değerlerinin daha büyük değer aralığını almasını gerektirir (Burada σ=2 için -
4,+4 aralığı alınmıştır) . Dolayısı ile standart sapma değeri (σ) arttıkça onu temsil eden matrisleride daha
büyük seçmek uygun olacaktır.
Standart sapma σ=1 için matris değerlerimizi hesaplayalım. Bunun için 5x5 bir matris oluşturalım.
Dolayısıyla x ve y değer aralığımızı -2,-1,0,1,2 olarak belirleyelim.
Ölçek:
1/0,007306897=
x y σ 136,856991
-2 -2 1 0,398943084 0,018315639 0,007306897 1
-1 -2 1 0,398943084 0,082084999 0,032747242 4,48168907
0 -2 1 0,398943084 0,135335283 0,053991075 7,389056099
1 -2 1 0,398943084 0,082084999 0,032747242 4,48168907
2 -2 1 0,398943084 0,018315639 0,007306897 1
-2 -1 1 0,398943084 0,082084999 0,032747242 4,48168907
-1 -1 1 0,398943084 0,367879441 0,146762959 20,08553692
0 -1 1 0,398943084 0,60653066 0,241971212 33,11545196
1 -1 1 0,398943084 0,367879441 0,146762959 20,08553692
2 -1 1 0,398943084 0,082084999 0,032747242 4,48168907
11
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Bu değerler matris formatına dönüştürülürse aşağıdaki Gauss yumuşatma operatörünün çekirdek matrisi elde
edilmiş olur.
Diğer sayılarda ona göre en yakın tam sayıya yuvarlandığında bu tablo elde edilir. Gauss formülündeki
katsayılar bu mantıkla değiştirilerek farklı değerlerde matrislerde elde edilebilir. Tablo yanındaki çarpım
değerleri matristeki elemanların toplamını gösterir. Burada olduğu gibi uygun bir Gauss çekirdek matrisi
oluşturulduktan sonra ortadaki piksel, resim üzerindeki hedef piksel üzerinde olmak üzere, komşu pikseller
de matristeki komşu değerler ile çarpılır ve sol taraftaki toplam değere (273, 112, 16 şeklinde verilen
değerler) bölünür.
Burada olduğu gibi konvolüsyon işlemi 3 boyutlu grafikten türetilen 2 boyutlu matrisle (kare matris)
yapılabileceği gibi, 2 boyutlu grafikten türetilen 1-boyutlu vektör matrisle, iki ayrı işlemle yapılabilir. 1-
boyutlu vektör matrise örnek aşağıda verilmiştir (1x7 matris). Buradaki 1x7 lik matris 2 boyutlu gauss
12
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
grafiğinden elde edilmiştir. Matristeki değerler en uçtaki değer 1 olacak şekilde ölçeklenirse yanında
verildiği şekilde çekirdek matris elde edilir. Bu matrisin en ortadaki elemanı işlem yapılan piksel üzerinde
olmak üzere önce x ekseninde yatay olarak tüm resimdeki piksellerle çarpılabilir, ardından dikeyde y ekseni
üzerindeki tüm piksellerle çarpılarak konvolüsyon işlemi yapılabilir.
Büyük çekirdek matris kullanarak hesaplama yapmak yerine, daha küçük matrisle resim üzerinden geçmek
(konvolüsyon yapmak) de mümkündür. Bu tür bir işlem paralel donanımlar kurarak hesaplama için daha
uygun olur.
Gauss'un resim düzgünleştirme etkisi, bir görüntüyü ortalama filtreye benzer şekilde bulanıklaştırmaktır.
Düzeltme derecesi Gaussian'ın standart sapması ile belirlenir. Daha büyük standart sapma değeri, ortaya
çıkan grafiği daha geniş hale getirir. Bundan türetilen çekirdek matrisinde doğru bir temsil yapabilmesi için
daha büyük boyutta olmasını gerektirir.
Gauss, her piksel bölgesinin ağırlıklı ortalamasını çıkarır. Merkez piksel değerine doğru yaklaştıkça
ağırlıklandırma artar. Bu durum, ortalama filtrenin (Mean) (her yeri eşit ağırlıklandırma yapar) aksine daha
ince bir düzeltme sağlar, kenarları benzer büyüklükteki bir ortalama filtreden daha iyi korur.
Gauss yumuşatma filtresinin kullanmanın gerekçelerinden biri de, resim üzerindeki uzaysal-mekansal
frekans bileşenleri korumaktır (yani çok sık aralıkla resim üzerindeki değişimleri korumasıdır). Çoğu diğer
filtre alçak geçirgen filtre gibi davranır (yap hep ya hiç kuralı gibi). Her iki filtrede yüksek frekansları
zayıflatır (örn: keskin kenarları). Ancak Ortalama filtresi frekans tepkimesi olarak salınımlar gösterir. Gauss
filtresi ise salınım göstermez. Aşağıdaki şekiller Ortalama filtre (5x5 boyutunda) ve Gauss filtrenin (standart
sapması σ=3) frekans tepkilerini göstermektedir.
Gauss filtrenin daha büyük matrislerle (standart sapmalarla) pürüzsüzleştirme etkisini görmek için şu
örnekleri inceleyin.
13
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Color OkunanRenk;
Bitmap GirisResmi, CikisResmi;
GirisResmi = new Bitmap(pictureBox1.Image);
14
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
k++;
}
}
ortalamaR = toplamR / MatrisToplami;
ortalamaG = toplamG / MatrisToplami;
ortalamaB = toplamB / MatrisToplami;
}
}
pictureBox2.Image = CikisResmi;
}
Görüldüğü gibi Gauss filtresi kenarları korumada daha başarılıdır. Fakat Tuz-biber ekilmiş gürültülü resimlerde
çok da başarılı sayılmaz (Bu tip resimlerde Medyan filtresinin başarılı olduğunu hatırlayalım). Gauss filtresinin
9x9, 15x15 örneklerini de siz deneyin. Ayrıca aynı resim için Mean ve Medyan filtresi ile karşılaştırmalar
yapınız.
Ödev 1: Örnek 4 tane resim tespit edin. Bir tanesi insan yüzü, saç ve kirpiklerin olduğu bir resim olsun. Bir tanesi
üzeride tekrar eden çizgilerin olduğu bir resim olsun (Izgara benzeri şeyler olsun). Bir taneside bir manzara resmi
olsun. Bir tanede üzerinde tuz-biber noktaları oluşturulmuş bir resim olsun. 3 farklı Algoritmayı (Mean, Median,
Gauss) algoritmayı 3x3, 5x5, 7x7 ve 9x9 matrisleri kullanarak bu 4 resim üzerinde deneyin. Ortaya çıkan
sonuçları yorumlayın. En iyi hangi algoritmalar hangi matriste sonuç verdi bulun.
15
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Ödev 2: İnternetten bulanıklaştırma ile ilgili başka bir algoritma bulun. Yada tamamen kendi mantığınıza göre bir
algoritma geliştirin (ders notlarında anlatılmayan bir yöntem olması gerekir). Bu algoritmanın performansını
Mean, Median ve Gauss ile karşılaştırın. Örnek başka blur algoritmaları: Konservativ yumuşatma (Conservative
Soomthing), Crimmins Parlaklık Giderme (Crimmins Speckle Removal), Frekans Filtreleri (Frequency Filters)
vs.. daha başka vardır araştırın.
Ödev 3: İçerisinde reklam olan bir resmin köşelerine tıklayın. Sadece o bölgeyi buzlu cama dönüştürsün
(bulanıklaştırsın) ve reklamı gizlesin.
Ödev 4: Gauss algoritmasında standart sapmanın etkisinin ne olduğunu programlayarak farklı resimler üzerinde
gösterin ve yorumlayın.
Ödev 5: İçerisinde bina olan bir resmi açın. Resim üzerinde binanın dış kenarların mouse ile tıklayarak bir
çerçeve çizin. Çok sayıda nokta olacaktır. Ardından Ortalama (mean) algoritmasını çalıştırın. Tüm resmi tararken
binanın dışında kalan kısımları bulanıklaştırsın. Binanın içerisindeki bölgeye gelince resim net olarak kalsın.
Böylelikle baktığımız nesneyi net olarak, arka planı ise bulanık görmüş oluruz.
Çoklu nokta şeklinde yapamayanlar, dikdörtgen çerçeve şeklinde bölgeyi seçsinler. Bu şekilde yapanlar daha
düşük puan alır.
Ödev 6: Blur (bulanıklaştırma) aracı kullanarak bir resim üzerinde mouse takip eden bulur işlemi yaptırın. Bunun
için aşağıdaki adımları takip edin.
a) Mouse ın etrafında büyüklüğü ayarlanabilir belli bir bölge olsun. Örneğin açılır menüden 50 piksel
seçilirse mouse etrafında 50x50 lik kare bir şekilde dolaşsın. Bu alanın içi bulanıklaşsın.
b) Kişi ister bu şekli Kare yada Daire olarak değiştirebilsin. Bu bölge Kare yada Daire olarak seçilebilsin.
Bu bölgenin içerisi mouse hareket ettikçe, bulanıklaşsın.
c) Ayrıca bu aracın kenarları üzerinde geçişli bir bulanık oluşturmak için bir ayar daha eklensin. Örneğin
burada %100 seçilirse Dairenin merkezinden kenara kadar yavaş yavaş bulur azalarak gitsin. %50
seçilirse darenin yarısından sonra yavaş yavaş bulur azalsın.
d) Bulurun yoğunluğunun ayarlanabildiği bir seçenek daha ekleyin. Aşağıda Intensity olarak gösterilmiş. Bu
ayarı kullanmak için kullanılan çekirdek matrsi boyutunu artırarak gerçekleştirebilirsiniz. 7x7 lik matris
kullanımı 3x3 lük matristen daha fazla yoğunluk bulur yapar.
16
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
e) Kullanılan algoritma açılır menüden, yada radyo buton listesinden seçilebilsin. Örneğin; Mean
algoritması, Medyan algoritması, Gauss algoritması gibi .
Ödev 7: Bulanıklaştırma işlemi yaparken resim üzerinde gezdirilen matrisin içindeki renk değerlerini tarayın. Bu
renk değerlerinden en fazla hangi renk var ise o rengi yandaki resim üzerine atasın. Algoritmanın kodları Medyan
algoritmasına benzerdir. O kodları kullanın. Algoritmada kullanılan matrisin büyüklüğü dışarıdan girilebilsin.
3x3, 5x5, 7x7, 9x9 olmak üzere çeşitli büyüklükte matrisler kullanarak performansını ölçün.
Bu şekilde yapılan bulanıklaştırma resmini Ortalama (Mean) ve Orda Değer (Median) algoritmaları ile
karşılaştırın. (Bu iki algoritmanın kodları zaten notlarda var). Farklı resimler üzerinde deneyerek sizin
geliştirdiğiniz algoritmanın hangi resimlerde daha mantıklı bulanıklaştırma yaptığını bulun.
Örnek: Aşağıda 5x5 bir matrisin içindeki sayılara baktığımızda. Tabii renkli resimde 3 kanal var. Siz Medyan
filtresinde olduğu gibi Gri renk üzerinden sıralama yaparak en fazla renk sayısı hangisi ise onu atayabilirsiniz.
Sonuçların mantıklı çıkıp çıkmayacağını görün bakalım.
[1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 7, 7, 8, 8, 8, 8 9, 9, 9, 9 ] =(En fazla değer 3 tür. Piksele 3 atanır)
Ödev 8: Gauss algoritmasında kullanılan matrisin değerlerini oluştururken bir tepe şeklinde geometriden değerler
alınıyordu. Bu şekilde oluşan yükseltilere göre tabandaki matris oluşturuluyordu. Bu sefer Tepe şeklinde değilde
Pramit şeklinde (Mısır piramitlerini göz önüne getirin) bir yükseltiden tabandaki Matrisin değerlerini oluşturun.
Ona göre resim üzerinde bir bulanıklaştırma yapın.
Bu uygulamada matrisde iç içe halkaların hepsi aynı sayıları alır. En dış halka 1 ise daha iç halka diyelim 3
onunda içindeki 5, ortadaki de 7 gibi değerler alır. Yani sayılar lineer (doğrusaldır). Farklı yükseklikte Pramit için
matrisi değiştirerek sonuçları gözlemleyin.
17
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Standart sapmanın anlamı nedir? Elimizde iki farklı veri grubu olsun. Bunların her ikisininde aritmetik
ortalaması aynı olsun. Bu verilerin ortalamaları aynı ise bunları karşılaştırmak için neye bakabiliriz. Bunun
için merkezi yayılma durumuna bakabiliriz. Yani verilerin ortalamadan ne kadar uzakta yada yakında
toplandığı bize bir fikir verebilir. Buna standart sapma denir.
• Standart sapma verilerin aritmetik ortalamaya göre nasıl bir yayılım gösterdiğini anlatır.
• Aritmetik ortalamaları aynı olan farklı veri gruplarından; açıklığı küçük olanın standart sapması küçük,
açıklığı büyük olanın standart sapması büyüktür.
• Standart sapması küçük olması bir veri grubundaki değerlerin birbirine yakın olduğunu gösterir, büyük
olması ise veri grubundaki değerlerin birbirinden uzak olduğunu gösterir.
• Standart sapmanın küçük olması, ortalamadan sapmanın az olduğunu gösterir buda riskin az olduğu
yönünde yorumlanabilir. büyük olması durumunda ise tam tersidir.
Örnek: İki öğrencinin bir hafta içinde okudukları kitap sayfa sayısı 5 gün içinde şu şekilde gerçekleşmiş
olsun. A={10,25,15,20,10} B={15,10,35,5,15}. Bu iki öğrencinin günlük kitap okuma ortalamalarına
bakacak olursak her ikisi de aynı ortalamaya sahip (ortalama 16 sayfa kitap okumuşlardır). Peki bu iki
öğrenci aynı performansa mı sahiptir? Ortalamaları aynı ise, aynı performansa sahip diyebiliriz fakat durum
öyle değildir. En düzenli ve istikrarlı okuyan hangisi ise onu daha performanslı saymak gerekir. Bunun
içinde günlük okumalarının ortalamadan ne kadar saptığını ölçmemiz gerekir. Bu amaçla Standart
sapmasını hesaplamalıyız. Hesaplayalım.
Dizimizdeki eleman sayısı n=5 dir. 5 gün boyunca okunan değerler ölçülmüştür.
A nın Ortalaması: (10+25+15+20+10) / 5=16
B nin Ortalaması: (15+10+35+5+15) / 5=16
(16−10)2 +(16−25)2 +(16−15)2 +(16−20)2 +(16−10)2
A nın Standart Sapması: √ (5−1)
= 6,5
Bu değerleri yorumlarsak, her iki öğrencinin ortalama okudukları kitap sayısı aynıdır ama A öğrencinin
standart sapması düşüktür. Bu da kitap okuma konusunda daha istikrarlı olduğunu gösterir. Bunu
öğrencilerin okudukları sayfa sayılarındaki değişimlere bakarak da anlayabilirdik.
18
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Filtrenin frekans cevabını inceleyerek işlemi daha iyi anlayabiliriz. Eğer bizim elimizde aşağıda Şekil a daki gibi
bir sinyal varsa, bu sinyal Şekil b’de olduğu gibi lowpass filtreden geçirilirse, yani düşük frekanslar geçirilerek
resmin yumuşatılması sağlanırsa, ortaya Şekil c’deki gibi highpass görüntü yani yüksek frekansların geçtiği
keskin kenarların ortaya çıktığı bir görüntü elde edilir. Bu keskin kenarlar, orjinal görüntü ile birleştirilirse
netleştirilmiş (kenarları keskinlşetirilmiş) görüntü oluşur (Şekil d).
Şekil. Keskinleştirme filtresi için frekans cevabı ile kenar görüntüsü hesaplama
Keskinleştirme filtresi konvolüsyon işlemi ile yapılır. Yani çekirdek bir matris kullanılarak, resim alanı üzerinde
gezdirilir ve gerekli çarpma işlemleri ile yeni resim elde edilir. Görüntünün yumuşatılmış versiyonunu
oluşturmak için 3x3 lük Ortalama filtresi (mean filter) kullanılabilir. Ardından yumuşatılmış görüntü, orjinal
1
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
görüntüden piksel değerleri üzerinden çıkarılır. Bu esnada ortaya çıkan değerler negatif yada 255 i geçebilir. Bu
durumda değerleri normalize etmek gerekir.
Değerleri normalize etme: Matematiksel işlemler sonunda görüntüdeki R,G,B değerleri 0-255 değerlerinin
dışına çıkarsa tüm resmi aynı orantıya tabi tutarak değerleri yeniden normalize etmek gerekir.
Resim içerisindeki limit değerleri a,b ile, bu değerlerin olması gereken aralık olan 0,255 sayılarını da c,d ile,
normalize edilecek değeri Pin, normalize olmuş halinide Pout ile gösterirsek, bu işlemi aşağıdaki şekilde
formülüze edebiliriz. Dikkat edilirse bu formül verilen aralıklarda değerleri orantı kurarak bir gerdirme işlemidir.
Aşağıdaki resimde üçgenlerdeki benzerliği kullanarak formülü bulabiliriz.
(𝑑 − 𝑐) (𝑃𝑜𝑢𝑡 − 𝑐) 𝑑−𝑐
= → 𝑃𝑜𝑢𝑡 = (𝑃𝑖𝑛 − 𝑎) ( )+𝑐
(𝑏 − 𝑎) (𝑃𝑖𝑛 − 𝑎) 𝑏−𝑎
Örneklersek; Keskinleştirme işlemi yapıldıktan sonra resim içindeki üst ve alt sınırlar yani a ve b değerleri -30 ile
330 değerlerini alsın. Bu takdirde sınırlarımız ve aradaki herhangi bir 120 değeri şu şekilde hesaplanır.
255 − 0
𝑃𝑜𝑢𝑡 = (120 − (−30)) ( ) + 0 = 106
330 − (−30)
Not: Burada normalleştirme öncesi üst ve alt sınırlardan biri (a ve b değerlerinden biri) 0 ve 255 değerlerini
aşmaz ise (her ikiside aşmıyorsa zaten normalleştirmeye gerekte yoktur!), çıkış resmindeki düzeltilmiş üst ve alt
sınırlar olan d ve c sayıları 0 ve 255 alınamaz. Bu durumda normalleşmiş resmindeki d ve c sayıları giriş
resmindeki a ve b değerleri ile aynı alınmalıdır. Diğer türlü orijinal resimde hiç beyaz yada siyah bölge yokken,
çıkış resminde bu bölgeler ortaya çıkmaya başlar. (dikkat! Netleştirilen resimde her iki uçta 0-255 aşmıyorsa
zaten normalleştirmeye de ihtiyaç yoktur. Sınırlardan biri 0 yada 255 aşıyorsa ve diğeri aşmıyorsa, aşmayan taraf
önceki değeri olarak alınır. Yani buradaki örnekte -30 yerine bu a değeri +10 olsaydı o zaman c değeri +10
alınmalı. Bu takdirde normalleştirme için 10-330 aralığının 10-255 aralığı olarak yapılmasını gerektirir.
2
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
3
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
//NETLEŞTİRME-------------------------------
private void netlestirmeToolStripMenuItem_Click_1(object sender, EventArgs e)
{
Bitmap OrjinalResim = new Bitmap(pictureBox1.Image);
pictureBox2.Image = NetlesmisResim;
}
//**************************************************************************************************
4
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
int R, G, B;
double Olcekleme = 2; //Keskin kenaları daha iyi görmek için değerini artırıyoruz.
for (int x = 0; x < ResimGenisligi; x++)
{
for (int y = 0; y < ResimYuksekligi; y++)
{
OkunanRenk1 = OrjinalResim.GetPixel(x, y);
OkunanRenk2 = BulanikResim.GetPixel(x, y);
//===============================================================
//Renkler sınırların dışına çıktıysa, sınır değer alınacak. (Dikkat: Normalizasyon
yapılmamıştır. )
if (R > 255) R = 255;
if (G > 255) G = 255;
if (B > 255) B = 255;
if (R < 0) R = 0;
if (G < 0) G = 0;
if (B < 0) B = 0;
//================================================================
DonusenRenk = Color.FromArgb(R, G, B);
CikisResmi.SetPixel(x, y, DonusenRenk);
}
}
return CikisResmi;
}
//**************************************************************************************************
int R, G, B;
R = OkunanRenk1.R + OkunanRenk2.R;
5
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
G = OkunanRenk1.G + OkunanRenk2.G;
B = OkunanRenk1.B + OkunanRenk2.B;
//===============================================================
//Renkler sınırların dışına çıktıysa, sınır değer alınacak. //DİKKAT: Burada sınırı aşan
değerler NORMALİZASYON yaparak programlanmalıdır.
if (R > 255) R = 255;
if (G > 255) G = 255;
if (B > 255) B = 255;
if (R < 0) R = 0;
if (G < 0) G = 0;
if (B < 0) B = 0;
//================================================================
}
}
return CikisResmi;
}
Kullanım şekli;
6
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
int SablonBoyutu = 3;
int ElemanSayisi = SablonBoyutu * SablonBoyutu;
int R, G, B;
int[] Matris = { 0, -2, 0, -2, 11, -2, 0,-2,0};
int MatrisToplami = 0 + -2 + 0 + -2 + 11 + -2 + 0 + -2 +0;
{
OkunanRenk = GirisResmi.GetPixel(x + i, y + j);
k++;
}
}
R = toplamR / MatrisToplami;
G = toplamG / MatrisToplami;
B = toplamB / MatrisToplami;
//===========================================================
//Renkler sınırların dışına çıktıysa, sınır değer alınacak.
if (R > 255) R = 255;
if (G > 255) G = 255;
if (B > 255) B = 255;
if (R < 0) R = 0;
if (G < 0) G = 0;
if (B < 0) B = 0;
//===========================================================
}
}
pictureBox2.Image = CikisResmi;
Orijinal Resim
private void btnKeskinlestirmeMatris_Click(object sender, EventArgs e)
{
Color OkunanRenk;
Bitmap GirisResmi, CikisResmi;
GirisResmi = new Bitmap(pictureBox1.Image);
8
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
int SablonBoyutu = 3;
int ElemanSayisi = SablonBoyutu * SablonBoyutu;
int R, G, B;
int[] Matris = { 0, -2, 0, -2, 11, -2, 0, -2, 0 };
int MatrisToplami = 3;
int EnBuyukR = 0;
int EnBuyukG = 0;
int EnBuyukB = 0;
int EnKucukR = 0;
int EnKucukG = 0;
int EnKucukB = 0;
k++;
}
}
R = toplamR / MatrisToplami;
G = toplamG / MatrisToplami;
B = toplamB / MatrisToplami;
//===========================================================
//Renkler sınırların dışına çıktıysa, sınır değer alınacak.
if (R > 255)
{
if (EnBuyukR < R)
EnBuyukR = R;
//R = 255;
}
if (G > 255)
9
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
{
if (EnBuyukG < G)
EnBuyukG = G;
//G = 255;
}
if (B > 255)
{
if (EnBuyukB < B)
EnBuyukB = B;
//B = 255;
}
//------------------------
if (R < 0)
{
if (EnKucukR > R)
EnKucukR = R;
//R = 0;
}
if (G < 0)
{
if (EnKucukG > G)
EnKucukG = G;
//G = 0;
}
if (B < 0)
{
if (EnKucukB > B)
EnKucukB = B;
//B = 0;
}
//===========================================================
}
}
txtX1.Text = EnBuyukR.ToString();
txtX2.Text = EnBuyukG.ToString();
txtX3.Text = EnBuyukB.ToString();
txtY1.Text = EnKucukR.ToString();
txtY2.Text = EnKucukG.ToString();
txtY3.Text = EnKucukB.ToString();
10
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
pictureBox4.Image = NormallesmisNetResim; }
int x, y, i, j;
int R, G, B;
int[] Matris = { 0, -2, 0, -2, 11, -2, 0, -2, 0 };
int MatrisToplami = 3;
k++;
}
}
R = toplamR / MatrisToplami;
G = toplamG / MatrisToplami;
B = toplamB / MatrisToplami;
//NORMALİZASYON------------------------
int YeniR = (255 * (R - EnKucuk)) / (EnBuyuk - EnKucuk) ;
int YeniG = (255 * (G - EnKucuk)) / (EnBuyuk - EnKucuk) ;
int YeniB = (255 * (B - EnKucuk)) / (EnBuyuk - EnKucuk) ;
11
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
}
}
return CikisResmi;
}
---------------------
Ödev 1: Netleştirme işleminde resmi bulanıklaştırırken kullanılan buradaki Mean yönteminin dışında Median ve
Gauss yöntemlerini kullanarakda netleştirme yapın.
Ödev 2: Bulanık bir resmi netleştirirken daha büyük ölçekli matrislere ihtiyaç olacaktır. Böyle bir resim üzerinde
kullanılan matris boyutunu aşama aşama artırarak resmin netliğinde nasıl bir etkisi olduğunu gösterin.
Ödev 4: Yukarıdaki tüm uygulamaları Normalizasyon yaparak düzenleyin. Eğer sınırlar 0-255 dışına çıkıyorsa
ve elimizdeki resimde hiç beyaz yada siyah yoksa yani (30 – 230) gibi bir değerde ise Dışarı çıkan bu sınırlar
resmin en uç noktaları arasında normalize edilmelidir.
Ödev 5: Bir resmin üzerindeki bir bölgeyi seçmek için köşe noktalarına mouse tıklayalım. Tıkladığımız her
noktanının arasına bir çizgi çizsin. Tüm bölgeyi kapattıktan sonra, çerçevenin iç bölgesinde netleştirme
uygulasın, dış bölgesinde ise Bulanıklaştırma uygulasın. Hangi algoritma ile netleştirme, hangi ile bulanıklaştırma
uygulayacağını ise yan taraftaki menüden kişi seçebilsin. Bunun için RadioButton seçeneği kullanılabilir.
Çoklu nokta şeklinde yapamayanlar, dikdörtgen çerçeve şeklinde bölgeyi seçsinler. Bu şekilde yapanlar daha
düşük puan alır.
Ödev 6: Sharpen (netleştirme) aracı kullanarak bir resim üzerinde mouse takip eden bulur işlemi yaptırın. Bunun
için aşağıdaki adımları takip edin.
a) Mouse ın etrafında büyüklüğü ayarlanabilir belli bir bölge olsun. Örneğin açılır menüden 50 piksel
seçilirse mouuse etrafında 50x50 lik kare bir şekilde dolaşsın. Bu alanın içi netleşsin.
b) Kişi ister bu şekli Kare yada Daire olarak değiştirebilsin. Bu bölge Kare yada Daire olarak seçilebilsin.
Bu bölgenin içerisi mouse hareket ettikçe, bulanıklaşsın.
12
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
c) Ayrıca bu aracın kenarları üzerinde geçişli bir netlik oluşturmak için bir ayar daha eklensin. Örneğin
burada %100 seçilirse Dairenin merkezinden kenara kadar yavaş yavaş netlik azalarak gitsin. %50
seçilirse darenin yarısından sonra yavaş yavaş netlik azalsın.
d) Netliğin yoğunluğunun ayarlanabildiği bir seçenek daha ekleyin. Aşağıda Intensity olarak gösterilmiş.
e) Kullanılan algoritma açılır menüden, yada radyo buton listesinden seçilebilsin. Örneğin; Kenar bulma
algoritması yada Matris algoritması gibi.
Ödev 7: Aşağıdaki gibi bir resmin üzerinde belirlenen bölgenin iç kısmında netleştirme, dış kısmında
bulanıklaştırmayı otomatik olarak yapan kodları geliştirin. Bunu gerçekleştiremeyenlerde dikdörtgen şeklinde bir
çerçevenin içerisine ve dışarısına algoritmaları uygulasın. Hangi algoritmaların uygulanacağı menülerden
seçilebilsin. Ayrıca iç ve dış tarafın bulanık/net olması değiştirilebilsin. Belirlenen bölgenin kenarlarına bir çizgi
çizdirirseniz daha anlaşılır olacaktır.
13
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Bu durumda 0 derece yatay duran çizgileri, 90 derece ise dikey duran çizgileri gösterecektir. Eğik duran çizgilerde
diğer açıları oluşturacaktır. Burada sıfır derece çizgide alt kısım siyahtan, üst kısım beyaza doğru geçişi gösterir. 0
derecenin bir benzeri olan yine yatay duran çizgi 180 derecede ise üst kısım siyah bölgeden alt kısım beyaz bölgeye
doğru bir geçişi gösterecektir. Açılar saatin tersi yönüne göre ölçülür.
Burada Gx konvolüsyon matrisi tek başına kullanılırsa yatayda renk değişimini bulacağından, ortaya çıkan çizgileri
dikey olarak görürüz. Benzer şekilde Gy konvolüsyon matrisi de tek başına kullanılırsa aşağıdan yukarıya doğru
renk geçişini (siyahtan-beyaza) göstereceğinden ortaya çıkan çizgiler yatay olacaktır. Resim üzerindeki çizgileri
yatay yada dikey görmek yerine kendi doğal duruşlarını görmek istersek, her iki konvolüsyon matrisini yukarıda
formülü verilen hesaplama ile toplayabiliriz. Benzer şekilde yukarıda verilen karaköklü formülü de kullanabiliriz.
Eğer resim üzerinde belli açılardaki çizgileri ortaya çıkarmak istersek verilen açı formülü ile hesaplama yaparak bu
çizgileri de belirleyebiliriz.
1
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
İki matrisi aynı anda kullanmak için ve matris üzerindeki noktaları aşağıdaki şekilde temsil etmek için hesaplama
yaparak deneyelim.
|𝐺| = √𝐺𝑥 2 + 𝐺𝑦 2
Burada renkli resimde renk değerleri 3 kanal olduğunda tek kanal üzerinden işlem yapmak için Gri renk değerleri
üzerinden işlem yapmak gerekir. Aşağıdaki programda Gri renk için 3 kanalın ortalması alınmıştır. Gerekirse Gri
renk formülleri de kullanılabilir (daha önceki konularda geçti).
1. Kodlama
private void mnuSobel_Click(object sender, EventArgs e)
{
Bitmap GirisResmi, CikisResmiXY, CikisResmiX, CikisResmiY;
GirisResmi = new Bitmap(pictureBox1.Image);
2
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
int SablonBoyutu = 3;
int ElemanSayisi = SablonBoyutu * SablonBoyutu;
int x, y;
Color Renk;
int P1, P2, P3, P4, P5, P6, P7, P8, P9;
//int TetaRadyan = 0;
//if (Gy != 0)
// TetaRadyan = Convert.ToInt32(Math.Atan(Gx / Gy));
//else
// TetaRadyan = Convert.ToInt32(Math.Atan(Gx));
}
}
pictureBox2.Image = CikisResmiXY;
pictureBox3.Image = CikisResmiX;
pictureBox4.Image = CikisResmiY;
}
2. Kodlama
int SablonBoyutu = 3;
int ElemanSayisi = SablonBoyutu * SablonBoyutu;
int x, y, i, j;
int Gri = 0;
k++;
}
RenkX = Math.Abs(toplamGriX);
RenkY = Math.Abs(toplamGriY);
RenkXY = Math.Abs(toplamGriX) + Math.Abs(toplamGriY);
//===========================================================
//Renkler sınırların dışına çıktıysa, sınır değer alınacak.
if (RenkX > 255) RenkX = 255;
if (RenkY > 255) RenkY = 255;
if (RenkXY > 255) RenkXY = 255;
//===========================================================
5
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
|𝐺| = √𝐺𝑥 2 + 𝐺𝑦 2
Ortaaya çıkan kenarın yön açısı (piksel ızgarasına göre) x ve y yönlerindeki değerlerine bakarak şu şekilde bulunur.
|𝐺𝑥|
𝜃 = arctan ( )
|𝐺𝑦|
Programlama (Prewitt Algoritması)
6
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
int SablonBoyutu = 3;
int ElemanSayisi = SablonBoyutu * SablonBoyutu;
int x, y;
Color Renk;
int P1, P2, P3, P4, P5, P6, P7, P8, P9;
int PrewittDegeri = 0;
PrewittDegeri = Gx;
PrewittDegeri = Gy;
}
}
pictureBox2.Image = CikisResmi;
7
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Sobel’de matrislerin yönleri x ve y eksenleri yönünde idi. Burada ise Resmin ızgarasına 45 açıyla durmaktadır.
Kullanılacak formüller burada yine Gx ve Gy şeklinde gösterilmiştir fakat bu yönlerin ızgaraya 45 ve 135 derece
ile durduğunu kabul edelim.
Bunun için aşağıdaki iki formülü kullanabiliriz. İkinci formül daha hızlı çalışır.
|𝐺𝑥| = |𝑃1 − 𝑃4 |
|𝐺𝑦| = |𝑃2 − 𝑃3 |
Olmak üzere
|𝐺| = |𝐺𝑥| + |𝐺𝑦|
|𝐺| = √𝐺𝑥 2 + 𝐺𝑦 2
Formülleri kullanılabilir. Oluşan kenarın resim ızgarasına olan açısı aşağıdaki formülle bulunabilir (Dikkat formülü
deneyerek teyid edin!).
𝐺𝑦
𝜃 = arctan ( ) + 45
𝐺𝑥
Bu operatörde 4 piksel olduğundan çıkış pikselin hangisine denk geldiği belirsizdir. Aslında yarım piksellik bir
kaymadan söz edilebilir. Programlarken referans pikseli sol üst köşedeki ilk piksel alınmıştır.
8
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Dikkat bu uygulamada zeminle öndeki nesne arasındaki fark arttıkça kenarlar daha belirgin olmaktadır. Sebebini
yorumlamaya çalışın.
private void mnuRobertCross_Click(object sender, EventArgs e)
{
Bitmap GirisResmi, CikisResmi;
GirisResmi = new Bitmap(pictureBox1.Image);
int x, y;
Color Renk;
int P1, P2, P3, P4;
for (x = 0; x < ResimGenisligi - 1; x++) //Resmi taramaya şablonun yarısı kadar dış
kenarlardan içeride başlayacak ve bitirecek.
{
for (y = 0; y < ResimYuksekligi - 1; y++)
{
int RobertCrossDegeri = 0;
RobertCrossDegeri = Gx;
RobertCrossDegeri = Gy;
//Eşikleme
//if (RobertCrossDegeri > 50)
// RobertCrossDegeri = 255;
//else
// RobertCrossDegeri = 0;
}
}
pictureBox2.Image = CikisResmi;
-1 -1 -1 -1 -1 +1 -1 +1 +1 +1 +1 +1
+1 -2 +1 -1 -2 +1 -1 -2 +1 -1 -2 +1
+1 +1 +1 +1 +1 +1 -1 +1 +1 -1 -1 +1
00 450 900 1350
+1 +1 +1 +1 +1 +1 +1 +1 -1 +1 -1 -1
+1 -2 +1 +1 -2 -1 +1 -2 -1 +1 -2 -1
-1 -1 -1 +1 -1 -1 +1 +1 -1 +1 +1 +1
1800 2250 2700 3150
Buradaki kullanılan Compass algoritması olarak kullanılan çekirdek matrisin haricinde aşağıda 2 açıdaki örnekleri
verilen algoritmalarda Compass mantığı ile kullanılabilir. Hatırlanırsa Sobel algoritması yukarıda 900 ve 00 derece
olarak kullanılmıştı. Burada verilen 1350 açı değerinde ve yukarıdaki örnek uygulamalarda nasıl yapıldığı
10
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
incelenerek diğer 8 adet açıdaki matrisleri oluşturulabilir. Bunları kendiniz oluşturunuz. Ayrıca bu örneklerden
Kirsch ve Robinson matrislerini yukarıda Sobel konusunda verildiği şekilde Gx ve Gy mantığı ile kenar bulma
işlemleri için deneyin. Sobel, Kirsch ve Robinson algoritmalarını iki eksende kullanıldığında hangisi daha iyi sonuç
vermektedir gözlemleyin.
00 1350
-1 0 1 0 1 2
Sobel -2 0 2 -1 0 1
-1 0 1 -2 -1 0
-3 -3 5 -3 5 5
Kirsch -3 0 5 -3 0 5
-3 -3 5 -3 -3 -3
-1 0 1 0 1 1
Robinson -1 0 1 -1 0 1
-1 0 1 -1 -1 0
11
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Ödevler
Ödev 1: Aşağıdaki kenar bulma algoritmalarının programlarını yazınız. 5 tane farklı tarzlarda resim üzerinde en
iyi kenar bulan algoritma hangisidir (Bakış açısına göre yada aranan özelliğe göre değişebilir ama sizin kendi
yorumunuz olsun) karşılaştırın. Örneğin manzara resminde en iyi kenar bulan Sobeldir, İnsa yüzü görüntüsünde en
iyi kenar bulan Aşındırma algoritaması gibi yorumlar yapın ve bunları görsel olarak gösterin. Programlayacağınız
algoritmalar;
a) Sobel
b) Prewitt
c) Cany (bu algoritma ders notlarında yoktur. Araştırın programını kendiniz yazın. Diğerlerinin kodları
notlarda vardır. Sadece kendinize uyarlayın.)
d) Bulanıklaştırma ile kenar bulma (6 notlarda)
e) Aşındırma ile kenar bulma (8 notlarda)
Ödev 2: Çelik kontrüksiyon şeklinde aşağıdaki örneklere benzer yapıların üzerindeki çizgilerin açılarını bulup
bunları renklendirin. Bu işlem için Sobel ve Compass algoritmalarını kullanın. Hangi renklerin hangi açıyı
gösterdiğini anlayabilmek için kenarda bir grafik oluşturun yani resmin dış tarafında belirlediğiniz renkleri gösteren
ve kaç derece açıya karşılık geldiğini gösteren bir grafik olsun. (her adım 10 derece şeklinde gösterilebilir. 360
derece açıların hepsini göstersin).
Ödev 3: 6 ve 7 nolu dökümanlardaki kodları hazır olarak verilmiş olan tüm algoritmaları kendi yazdığınız
program içerisinde deneyin. Her algoritmanın en iyi sonuç verdiği örnek resimler bularak uygulamasını gösterin.
Denediğiniz her algoritmayı hangi resimlerde daha iyi sonuç verdiğinin sebebini yorumlayarak birer cümle ile
açıklayın.
Ödev 4: Compas algoritmasını farklı 3 matris türüyle deneyerek renkli çizgileri kaliteli bir şekilde programı
yazınız.
12
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Ödev 5: Siyah zemin üzerine düz bir çizgi çizdirin. Kenar bulma algoritmalarından Sobel kullanarak (2 matris ile)
bu çizginin açısını buldurun. Açı değerini Textbox içerisine yazdırın. Aynı açı bulma işini Compass algoritması ile
(8 matris kullanarak) tekrar hesaplatın. Hangisi daha hassas hesaplamaktadır karşılaştırın.
Birde resim üzerine düz olmayan yaklaşık olarak düz giden fakat dağınık bir şekilde duran resmin içerisindeki
görüntünün açısını hesaplatın. Böylece net bir çizgide ne kadar doğru hesaplıyor bulun. Ayrıca dağınık bir çizgide
ortalama açıyı bulabiliyor mu gösterin. Örnek resimler aşağıdaki gibi olabilir.
13
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
14
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Yukarıdaki kodların, bizim kodlara dönüştürülmüş hali. Kodlar Compass Algoritması mantığında çalışıyor. 9*9
boyutunda 8 tane matris arasında bir pixel için en büyük değeri bulup, eşikleme yaparak o pikselin değerini
belirliyor.
// ---------------------------------- DÖNÜŞTÜRÜLEN PROGRAM BLOGU -------------------------------
-------------
private void toolStripButton2_Click(object sender, EventArgs e)
{
Bitmap GirisResmi, CikisResmi;
GirisResmi = new Bitmap(pictureBox1.Image);
int ResimGenisligi = GirisResmi.Width;
int ResimYuksekligi = GirisResmi.Height;
CikisResmi = new Bitmap(ResimGenisligi, ResimYuksekligi);
int x, y;
Color Renk;
int P1, P2, P3, P4, P5, P6, P7, P8, P9;
int GM, G;
//int[,] Matris = { { -3, -3, 5, -3, 0, 5, -3, -3, 5 }, { -3, 5, 5, -3, 0, 5, -3, -3, -3 },
{ 5, 5, 5, -3, 0, -3, -3, -3, -3 }, { 5, 5, -3, 5, 0, -3, -3, -3, -3 }, { 5, -3, -3, 5, 0, 3, 5,
15
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
-3, -3 }, { -3, -3, -3, 5, 0, -3, 5, 5, -3 }, { -3, -3, -3, -3, 0, -3, 5, 5, 5 }, { -3, -3, -3,
-3, 0, 5, -3, 5, 5 } }; // Kirsch Matrisi
//int[,] Matris = { { -1, -1, -1, 1, -2, 1, 1, 1, 1 }, { -1, -1, 1, -1, -2, 1, 1, 1, 1 }, {
-1, 1, 1, -1, -2, 1, -1, 1, 1 }, { 1, 1, 1, -1, -2, 1, -1, -1, 1 }, { 1, 1, 1, 1, -2, 1, -1, -1,
-1 }, { 1, 1, 1, 1, -2, -1, 1, -1, -1 }, { 1, 1, -1, 1, -2, -1, 1, 1, -1 }, { 1, -1, -1, 1, -2,
-1, 1, 1, 1 } }; // Compass Matrisi
//int[,] Matris = { { -1, 0, 1, -2, 0, 2, -1, 0, 1 }, { 0, 1, 2, -1, 0, 1, -2, -1, 0 }, { 1,
2, 1, 0, 0, 0, -1, -2, -1 }, { 2, 1, 0, 1, 0, -1, 0, -1, -2 }, { 1, 0, -1, 2, 0, -2, 1, 0, -1 },
{ 0, -1, -2, 1, 0, -1, 2, 1, 0 }, { -1, -2, -1, 0, 0, 0, 1, 2, 1 }, { -2, -1, 0, -1, 0, 1, 0, 1,
2 } }; // Sobel Matrisi;
int[,] Matris = { { -1, 0, 1, -1, 0, 1, -1, 0, 1 }, { 0, 1, 1, -1, 0, 1, -1, -1, 0 }, { 1,
1, 1, 0, 0, 0, -1, -1, -1 }, { 1, 1, 0, 1, 0, -1, 0, -1, -1 }, { 1, 0, -1, 1, 0, -1, 1, 0, -1 },
{ 0, -1, -1, 1, 0, -1, 1, 1, 0 }, {-1, -1, -1, 0, 0, 0, 1, 1, 1 }, {-1, -1, 0, -1, 0, 1, 0, 1, 1
} }; // Robinson Matrisi
for (x = 1; x < ResimGenisligi - 1; x++) //Resmi taramaya şablonun yarısı kadar dış
kenarlardan içeride başlayacak ve bitirecek.
{
for (y = 1; y < ResimYuksekligi - 1; y++)
{
Renk = GirisResmi.GetPixel(x - 1, y - 1);
P1 = (Renk.R + Renk.G + Renk.B) / 3;
Renk = GirisResmi.GetPixel(x, y - 1);
P2 = (Renk.R + Renk.G + Renk.B) / 3;
Renk = GirisResmi.GetPixel(x + 1, y - 1);
P3 = (Renk.R + Renk.G + Renk.B) / 3;
Renk = GirisResmi.GetPixel(x - 1, y);
P4 = (Renk.R + Renk.G + Renk.B) / 3;
Renk = GirisResmi.GetPixel(x, y);
P5 = (Renk.R + Renk.G + Renk.B) / 3;
Renk = GirisResmi.GetPixel(x + 1, y);
P6 = (Renk.R + Renk.G + Renk.B) / 3;
Renk = GirisResmi.GetPixel(x - 1, y + 1);
P7 = (Renk.R + Renk.G + Renk.B) / 3;
Renk = GirisResmi.GetPixel(x, y + 1);
P8 = (Renk.R + Renk.G + Renk.B) / 3;
Renk = GirisResmi.GetPixel(x + 1, y + 1);
P9 = (Renk.R + Renk.G + Renk.B) / 3;
GM = 0;
Araştırma:
Aşağıdaki linkte verilen gelişmiş kırpma işleminde Sobel Filtresi kullanılmaktadır. Bu kırpma işleminde kullanılan
algoritmayı programlayın.
http://www.cescript.com/2015/07/icerik-tabanli-imge-olcekleme.html
16
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Yukarıdaki enerji haritası yardımıyla farklı teknikler kullanılarak boyut indirgemesi yapılabilir. Bunlardan biri her
satırdan, o satırın en düşük enerjili piksel değerini silmektir. Ancak böyle bir silme işlemi her satırda farklı
sütunlardan pikseller sileceğinden görüntüde kaymalara/bozulmalara neden olacaktır. Kaymaları engellemek için
kullanılacak bir diğer yöntem ise her seferinde en düşük enerjili sütunu kaldırmaktır. Bu durumda ise imge
içerisinde bazı önemli nesnelerin silinebilmesi söz konusudur. Bildiride önerilen ve yukarıdaki olumsuzlukları
gideren yöntem en düşük enerjili yolu silmeyi önermektedir. Enerjili yolu (seam), görüntünün tepesinden başlayıp
tabanında son bulan ve her satırdan tek bir kez geçen eğrilere verilen isimdir. Amacımız imge boyunu azaltırken
oluşacak bilgi kaybını en aza indirmek olduğundan, olası tüm yollar içerisinden en düşük enerjili yolun bulunarak
silinmesi gerekmektedir.
Ancak arama uzayımız imgenin genişliği ile doğrusal, yüksekliği ile üstel büyüdüğünden, olası tüm yolların
bulunup en düşük enerjili eğrinin seçilmesi verimli olmamaktadır. Amacımız, bu yollar içerisinden en düşük enerjili
olanı bulmak olduğundan, dinamik programlamayı kullanarak görüntü boyu ile doğrusal karmaşıklıkta problemi
çözebiliriz. Algoritma uzun ve karmaşık olduğundan detayları bir sonraki yazıya bırakıyorum. Şimdilik bulunan bu
yolun path dizisinde saklandığını ve bu dizinin y' inci elemanı, eğrinin x koordinatını (x = path[y]) içerdiğini
bilmemiz yeterli.
******************************************************
17
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
The Canny operator was designed to be an optimal edge detector (according to particular
criteria --- there are other detectors around that also claim to be optimal with respect to
slightly different criteria). It takes as input a gray scale image, and produces as output an
image showing the positions of tracked intensity discontinuities.
How It Works
The Canny operator works in a multi-stage process. First of all the image is smoothed by
Gaussian convolution. Then a simple 2-D first derivative operator (somewhat like
the Roberts Cross) is applied to the smoothed image to highlight regions of the image with
high first spatial derivatives. Edges give rise to ridges in the gradient magnitude image. The
algorithm then tracks along the top of these ridges and sets to zero all pixels that are not
actually on the ridge top so as to give a thin line in the output, a process known as non-
maximal suppression. The tracking process exhibits hysteresis controlled by two
thresholds: T1 and T2, with T1 > T2. Tracking can only begin at a point on a ridge higher
than T1. Tracking then continues in both directions out from that point until the height of the
ridge falls below T2. This hysteresis helps to ensure that noisy edges are not broken up into
multiple edge fragments.
The effect of the Canny operator is determined by three parameters --- the width of the
Gaussian kernel used in the smoothing phase, and the upper and lower thresholds used by
the tracker. Increasing the width of the Gaussian kernel reduces the detector's sensitivity to
noise, at the expense of losing some of the finer detail in the image. The localization error in
the detected edges also increases slightly as the Gaussian width is increased.
Usually, the upper tracking threshold can be set quite high, and the lower threshold quite
low for good results. Setting the lower threshold too high will cause noisy edges to break up.
18
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Setting the upper threshold too low increases the number of spurious and undesirable edge
fragments appearing in the output.
One problem with the basic Canny operator is to do with Y-junctions i.e. places where three
ridges meet in the gradient magnitude image. Such junctions can occur where an edge is
partially occluded by another object. The tracker will treat two of the ridges as a single line
segment, and the third one as a line that approaches, but doesn't quite connect to, that line
segment.
Using a Gaussian kernel with standard deviation 1.0 and upper and lower thresholds of 255
and 1, respectively, we obtain
Most of the major edges are detected and lots of details have been picked out well --- note
that this may be too much detail for subsequent processing. The `Y-Junction effect'
mentioned above can be seen at the bottom left corner of the mirror.
The image
is obtained using the same kernel size and upper threshold, but with the lower threshold
increased to 220. The edges have become more broken up than in the previous image, which
is likely to be bad for subsequent processing. Also, the vertical edges on the wall have not
been detected, along their full length.
The image
19
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
is obtained by lowering the upper threshold to 128. The lower threshold is kept at 1 and the
Gaussian standard deviation remains at 1.0. Many more faint edges are detected along with
some short `noisy' fragments. Notice that the detail in the clown's hair is now picked out.
The image
is obtained with the same thresholds as the previous image, but the Gaussian used has a
standard deviation of 2.0. Much of the detail on the wall is no longer detected, but most of
the strong edges remain. The edges also tend to be smoother and less noisy.
Edges in artificial scenes are often sharper and less complex than those in natural scenes,
and this generally improves the performance of any edge detector.
The image
The Gaussian smoothing in the Canny edge detector fulfills two purposes: first it can be
used to control the amount of detail that appears in the edge image and second, it can be
used to suppress noise.
20
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
which contains Gaussian noise with a standard deviation of 15. Neither the Roberts
Cross nor the Sobel operator are able to detect the edges of the object while removing all the
noise in the image. Applying the Canny operator using a standard deviation of 1.0 yields
All the edges have been detected and almost all of the noise has been removed. For
comparison,
is the result of applying the Sobel operator and thresholding the output at a value of 150.
We use
to demonstrate how to control the details contained in the resulting edge image. The image
is the result of applying the Canny edge detector using a standard deviation of 1.0 and an
upper and lower threshold of 255 and 1, respectively. This image contains many details;
however, for an automated recognition task we might be interested to obtain only lines that
correspond to the boundaries of the objects. If we increase the standard deviation for the
Gaussian smoothing to 1.8, the Canny operator yields
Now, the edges corresponding to the uneveness of the surface have disappeared from the
image, but some edges corresponding to changes in the surface orientation remain. Although
21
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
these edges are `weaker' than the boundaries of the objects, the resulting pixel values are the
same, due to the saturation of the image. Hence, if we scale down the image before the edge
detection, we can use the upper threshold of the edge tracker to remove the weaker edges.
The image
is the result of first scaling the image with 0.25 and then applying the Canny operator using
a standard deviation of 1.8 and an upper and lower threshold of 200 and 1, respectively. The
image shows the desired result that all the boundaries of the objects have been detected
whereas all other edges have been removed.
Although the Canny edge detector allows us the find the intensity discontinuities in an
image, it is not guaranteed that these discontinuities correspond to actual edges of the object.
This is illustrated using
We obtain
by using a standard deviation of 1.0 and an upper and lower threshold of 255 and 1,
respectively. In this case, some edges of the object do not appear in the image and many
edges in the image originate only from reflections on the object. It is a demanding task for
an automated system to interpret this image. We try to improve the edge image by
decreasing the upper threshold to 150, as can be seen in
22
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
We now obtain most of the edges of the object, but we also increase the amount of noise.
The result of further decreasing the upper threshold to 100 and increasing the standard
deviation to 2 is shown in
Common Variants
The problem with Y-junctions mentioned above can be solved by including a model of such
junctions in the ridge tracker. This will ensure that no spurious gaps are generated at these
junctions.
Interactive Experimentation
Exercises
1. Adjust the parameters of the Canny operator so that you can detect the edges of
2. What effect does increasing the Gaussian kernel size have on the magnitudes of the
gradient maxima at edges? What change does this imply has to be made to the tracker
thresholds when the kernel size is increased?
3. It is sometimes easier to evaluate edge detector performance after thresholding the
edge detector output at some low gray scale value (e.g. 1) so that all detected edges
are marked by bright white pixels. Try this out on the third and fourth example
images of the clown mentioned above. Comment on the differences between the two
images.
4. How does the Canny operator compare with the Roberts Cross and Sobel edge
detectors in terms of speed? What do you think is the slowest stage of the process?
5. How does the Canny operator compare in terms of noise rejection and edge detection
with other operators such as the Roberts Cross and Sobel operators?
6. How does the Canny operator compare with other edge detectors on simple artificial
2-D scenes? And on more complicated natural scenes?
23
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
7. Under what situations might you choose to use the Canny operator rather than the
Roberts Cross or Sobel operators? In what situations would you definitely not choose
it?
References
E. Davies Machine Vision: Theory, Algorithms and Practicalities, Academic Press, 1990,
Chap. 5.
Local Information
More general advice about the local HIPR installation is available in the Local
Information introductory section.
24
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
25
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
26
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
ycoord = j - y;
pixels[x + 2, y + 2] = original.GetPixel(xcoord, ycoord);
}
for (int k = 0; k < 5; k++)
for (int l = 0; l < 5; l++)
tempSum += kernel[k, l] * pixels[k, l].R;
runningSum = tempSum / 273;
newColor = Color.FromArgb(runningSum, runningSum, runningSum);
newBitmap.SetPixel(i, j, newColor);
tempSum = 0;
runningSum = 0;
}
return newBitmap;
}
private Bitmap DetectEdge(Bitmap original)
{
Bitmap newBitmap = new Bitmap(original.Width, original.Height);
int xleft;
int xright;
int ytop;
int ybot;
double gx;
double gy;
double tempAngle;
Color color1, color2;
double[,] magnitudes = new double[original.Width, original.Height];
double[,] angles = new double[original.Width, original.Height];
bool[,] isEdge = new bool[original.Width, original.Height];
double maxMag = 0;
for (int i = 0; i < original.Width; i++)
for (int j = 0; j < original.Height; j++)
{
xleft = i - 1;
xright = i + 1;
ytop = j - 1;
ybot = j + 1;
if (xleft < 0)
xleft = xright;
if (xright > original.Width - 1)
xright = xleft;
if (ytop < 0)
ytop = ybot;
if (ybot > original.Height - 1)
ybot = ytop;
color1 = original.GetPixel(xright, j);
color2 = original.GetPixel(xleft, j);
gx = (color1.R - color2.R) / 2;
color1 = original.GetPixel(i, ybot);
color2 = original.GetPixel(i, ytop);
gy = (color1.R - color2.R) / 2;
magnitudes[i, j] = Math.Abs(gx) + Math.Abs(gy);
if (magnitudes[i, j] > maxMag)
maxMag = magnitudes[i, j];
tempAngle = Math.Atan(gy / gx);
tempAngle = tempAngle * 180 / Math.PI;
if ((tempAngle >= 0 && tempAngle < 22.5) || (tempAngle > 157.5 && tempAngle <= 180)
|| (tempAngle <= 0 && tempAngle > -22.5) || (tempAngle < -157.5 && tempAngle >= -180))
tempAngle = 0.0;
else if ((tempAngle > 22.5 && tempAngle < 67.5) || (tempAngle < -22.5 && tempAngle >
-67.5))
tempAngle = 45.0;
else if ((tempAngle > 67.5 && tempAngle < 112.5) || (tempAngle < -67.5 && tempAngle
> -112.5))
tempAngle = 90.0;
else if ((tempAngle > 112.5 && tempAngle < 157.5) || (tempAngle < -112.5 &&
tempAngle > -157.5))
27
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
tempAngle = 135.0;
angles[i, j] = tempAngle;
}
for (int i = 0; i < original.Width; i++)
for (int j = 0; j < original.Height; j++)
{
if ((i - 1 < 0 || i + 1 > original.Width - 1 || j - 1 < 0 || j + 1 > original.Height
- 1))
{
isEdge[i, j] = false;
}
else if (angles[i, j] == 0.0)
{
if (magnitudes[i, j] > magnitudes[i - 1, j] && magnitudes[i, j] > magnitudes[i +
1, j])
isEdge[i, j] = true;
else
isEdge[i, j] = false;
}
else if (angles[i, j] == 90.0)
{
if (magnitudes[i, j] > magnitudes[i, j - 1] && magnitudes[i, j] > magnitudes[i,
j + 1])
isEdge[i, j] = true;
else
isEdge[i, j] = false;
}
else if (angles[i, j] == 135.0)
{
if (magnitudes[i, j] > magnitudes[i - 1, j - 1] && magnitudes[i, j] >
magnitudes[i + 1, j + 1])
isEdge[i, j] = true;
else
isEdge[i, j] = false;
}
else if (angles[i, j] == 45.0)
{
if (magnitudes[i, j] > magnitudes[i + 1, j - 1] && magnitudes[i, j] >
magnitudes[i - 1, j + 1])
isEdge[i, j] = true;
else
isEdge[i, j] = false;
}
}
double lowerThreshold = maxMag * 0.10;
for (int i = 0; i < original.Width; i++)
for (int j = 0; j < original.Height; j++)
{
if (isEdge[i, j] && magnitudes[i, j] > lowerThreshold)
{
if (angles[i, j] == 0.0)
{
if (angles[i, j] == angles[i - 1, j] || angles[i, j] == angles[i + 1, j])
{
if (magnitudes[i - 1, j] > lowerThreshold)
newBitmap.SetPixel(i - 1, j, Color.White);
else
newBitmap.SetPixel(i - 1, j, Color.Black);
if (magnitudes[i + 1, j] > lowerThreshold)
newBitmap.SetPixel(i + 1, j, Color.White);
else
newBitmap.SetPixel(i + 1, j, Color.Black);
}
}
else if (angles[i, j] == 90.0)
{
28
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Araştırma: Sobel Filtresi ile ilgili olarak aşağıda yazılmış olan kodları inceleyiniz. Yazılan bu programın notlarda
geçen anlatımdan farkı nedir? Programlama tarzından çıkarılabilecek bilgiler nelerdir?
//SOBEL FİLTRESİ******************************
private void btnSobelFiltresi_Click(object sender, EventArgs e)
{
Bitmap sobelResim = SobelUygula();
pictureBox5.Image = sobelResim;
btnResmiDonustur.Enabled = true;
}
29
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
unsafe
{
byte* ptrAdres = (byte*)tempData.Scan0; //bağlantı adresini al
int kalan = tempData.Stride - tempData.Width * 3;
for (int i = 0; i < tempData.Height; i++)
{
for (int j = 0; j < tempData.Width; j++)
{
dizi[j, i] = (int)((double)ptrAdres[0] * 0.11 + (double)ptrAdres[1] * 0.59 +
(double)ptrAdres[2] * 0.3); //red green blue değerleriyle gri için matrisi oluştur
ptrAdres += 3; // 3 byte ileri git. bir pixel de 3 byte lık bilgi var
if ((i % 5) == 0)//her on satırda bir göstergeyi güncelle
{
progressBar1.Value = i * pictureBox2.Image.Height + j;
Application.DoEvents();
}
}
ptrAdres += kalan;
}
}
dizi = Filitre_SobelSatir_Sutun(dizi);
int max = 0;
Ödev 1: Kenar bulma algoritması ile bir cismin kenarlarını tespit edin. Bu kapalı alan içinde kalan yüzeyin ağırlık
merkezini bulan algoritmayı geliştirin.
Ödev 2: Aynı yöntemi kullanarak Cismin Alanı kaç piksel kare olduğunu tespit edin.
31
Karabük Üniversitesi, Mühendislik Fakültesi.......................................................................................................www.IbrahimCayiroglu.c om
Ödev 3: Aynı yöntemle cimsin çevre uzunluğunun kaç piksel oldunu bulun
Ödev 4: Yukarıdaki ödevleri piksel uzunluğu ile mm yi ölçekleyerek yani görüntü içerisinde her mm nin kaç piksel
ile ifade edildiğini bularak tüm hesaplamaları mm cinsinden bulun. Bunun için görüntü alanına bir cetvel yada
kumpas koyarak ölçeği oradan çıkarabilirsiniz. Yada Ölçüsü bilinen bir şekil koyarak onunla kıyaslama yaparak
program kendisi otomatik bulsun.
32
Karabük Üniversitesi, Mühendislik Fakültesi............................................................................................... ........www.IbrahimCayiroglu.com
1
Karabük Üniversitesi, Mühendislik Fakültesi............................................................................................... ........www.IbrahimCayiroglu.com
Dikkat. Burada gezici şablonun bir satırlık hareketi gösterilmiştir. Her satır bittiğinde bir alt satıra inilmeli. Bir alt
satıra indiğinde piksellerin yeni değerleri üzerinden işlem yaparsa siyah bölge gittikçe genişler ve her taraf siyah
olur. Bu olayın olmaması için daima piksellerin eski değerleri üzerinden işlem yapılmalıdır.
2
Karabük Üniversitesi, Mühendislik Fakültesi............................................................................................... ........www.IbrahimCayiroglu.com
Programlama
3
Karabük Üniversitesi, Mühendislik Fakültesi............................................................................................... ........www.IbrahimCayiroglu.com
Orijinal siyah beyaz resimle genişleyen resmi çıkardığımızda sınırları bulmuş oluruz. İkinci resim Orijinal siyah
beyaz resme Sobel uygulandığında elde edilen görüntüdür. Genişletme ve Çıkarma yöntemi ile kenarlar daha net
olarak elde edilmiştir.
int x, y, i, j;
int SablonBoyutu = 3;
int ElemanSayisi = SablonBoyutu * SablonBoyutu;
if (KendiRengi.R < 128) //Kendi rengi siyahsa, komşuları tara beyaz bulabilecek
misin?
{
}
4
Karabük Üniversitesi, Mühendislik Fakültesi............................................................................................... ........www.IbrahimCayiroglu.com
}
}
else //Kendi rengi beyaz ise beyaz kal..
{
CikisResmi.SetPixel(x, y, Color.FromArgb(255, 255, 255));
}
}
pictureBox2.Image = CikisResmi;
int x, y, i, j;
int SablonBoyutu = 3;
int ElemanSayisi = SablonBoyutu * SablonBoyutu;
5
Karabük Üniversitesi, Mühendislik Fakültesi............................................................................................... ........www.IbrahimCayiroglu.com
}
}
else //Kendi rengi beyaz ise beyaz kal..
{
CikisResmi.SetPixel(x, y, Color.FromArgb(0, 0, 0));
}
}
pictureBox2.Image = CikisResmi;
}
Bitmap CikisResmi;
int x, y;
int Fark;
for (x =0; x < ResimGenisligi; x++) //Resmi taramaya şablonun yarısı kadar dış kenarlardan
içeride başlayacak ve bitirecek.
{
for (y = 0; y < ResimYuksekligi; y++)
{
Color OrjinalRenk = SiyahBeyazResim.GetPixel(x, y);
Color GenislemisResimRenk = GenislemisResim.GetPixel(x, y);
return CikisResmi;
}
6
Karabük Üniversitesi, Mühendislik Fakültesi............................................................................................... ........www.IbrahimCayiroglu.com
7
Karabük Üniversitesi, Mühendislik Fakültesi............................................................................................... ........www.IbrahimCayiroglu.com
Burada verilen örnekler ilk geçişi göstermektedir. Dikkat edilirse üst sağ köşedeki piksellerde 1 ve 2 rakamları
komşuluk olarak yanyana gelmiştir. İkinci bir geçiş daha yapılacak olursa buradaki piksellerden 2 rakamları 1
rakamına dönüşecektir ve böylece üstteki birbirine komşu pikseller aynı numara ile etiketlenmiş olacaktır. Aynı
numaralı etiketler farklı renklere boyanabilir yada etiketleme yapmak yerine yeni renk kodu atanabilir. Böylece
işlem sonunda bölgeler birbirinden net olarak ayrılmış olacaktır.
8
Karabük Üniversitesi, Mühendislik Fakültesi............................................................................................... ........www.IbrahimCayiroglu.com
c) 200 eşik değeri ile siyah beyaz yapıldı d) Her yaprak alanı ayrı ayrı tespit edildi.
private void BOLGE_BULMA_Click(object sender, EventArgs e)
{
int KomsularinEnKucukEtiketDegeri = 0;
9
Karabük Üniversitesi, Mühendislik Fakültesi............................................................................................... ........www.IbrahimCayiroglu.com
GirisResmi = SiyahBeyazResim;
pictureBox2.Image = SiyahBeyazResim;
int x, y, i, j, EtiketNo = 0;
//Tüm piksellerin Etiket numarasını başlangıçta 0 olarak atayacak. Siyah ve beyaz farketmez.
Zaten ileride beyaz olanlara numara verilecek.
for (x = 0; x < ResimGenisligi; x++)
{
for (y = 0; y < ResimYuksekligi; y++)
{
EtiketNumarasi[x, y] = 0;
}
}
int Esikleme = 0;
try
{
Esikleme = Convert.ToInt16(textBox1.Text);
}
catch
{
Esikleme = 128;
}
for (j = -1; j <= 1; j++) //Çekirdek şablon 3x3 lük bir matris. Dolayısı ile
x,y nin -1 den başlayıp +1 ne kadar yer kaplar.
{
for (i = -1; i <= 1; i++)
{
if (EtiketNumarasi[x + i, y + j] != 0 &&
KomsularinEnKucukEtiketDegeri == 0) //hücrenin etiketi varsa ve daha hiç en küçük atanmadı ise
ilk okuduğu bu değeri en küçük olarak atayacak.
{
10
Karabük Üniversitesi, Mühendislik Fakültesi............................................................................................... ........www.IbrahimCayiroglu.com
if (IlkDeger != SonDeger)
DegisimVar = true;
}
}
} while (DegisimVar == true); // Etiket numarlarında değişik kalmayana kadar dön.
i = 0;
for (x = 1; x < ResimGenisligi - 1; x++)
{
for (y = 1; y < ResimYuksekligi - 1; y++)
{
i++;
DiziEtiket[i] = EtiketNumarasi[x, y];
}
}
//Tekrar eden etiket numaraarını çıkarıyor. Hazır fonksiyon kullanıyor. Tekil numaraları
diziye atıyor.
int[] TekrarsizEtiketNumaralari = DiziEtiket.Distinct().ToArray();
//DİKKAT BURADA RenkDizisi ihtiyaç değil gibi. Renk adedi direk Tekrarsız numaralardan
alınabilir.
int[] RenkDizisi = new int[TekrarsizEtiketNumaralari.Length]; //Tekil numaralar aynı boyutta
renk dizisini oluşturuyor.
int RenkSayisi = RenkDizisi.Length; //kaç tane numara varsa o kadar renk var demektir.
if (GirisResmi.GetPixel(x, y).R < Esikleme) //Eğer bu pikselin rengi siyah ise aynı
pikselin CikisResmi resmide siyah yapılacak.
{
CikisResmi.SetPixel(x, y, Color.Black);
}
else
{
CikisResmi.SetPixel(x, y, Renkler[RenkSiraNo]);
}
}
}
pictureBox3.Image = CikisResmi;
txtKirmizi.Text = RenkSayisi.ToString();
}
Bitmap CikisResmi;
int R = 0, G = 0, B = 0;
R = OkunanRenk.R;
G = OkunanRenk.G;
B = OkunanRenk.B;
int Esikleme = 0;
try
{
Esikleme = Convert.ToInt16(textBox1.Text);
}
catch
{
Esikleme = 128;
}
//Esikleme kısmı
if (Gri > Esikleme)
Gri = 255;
else
Gri = 0;
-------------- 000--------------
Ödev1: Bir bant üzerinde akan ceviz ve fındıkları büyüklüklerinden ayırt edebilen ve fotograf alanı içerisinde kaç
tane ceviz ve kaç tane fındık olduğunu tespit eden bir program yazınız. Bunun için zemini beyaz bir alan haline
getirip üzerindeki ceviz ve fındıkların kenar çizgilerini oluşturabilirsiniz. Oluşan alanın içerisindeki küçük
noktasal gölgeleri yok edebilirsiniz. Daha sonra her bir alanı yukarıdaki algoritmayı kullanarak renklendirip,
alanın içerisindeki aynı renkli piksellerin sayısına bakarak hangisi ceviz, hangisi fındık sayıları ile birlikte
bulmaya çalışın. Bir kağıt üzerine fındık ve ceviz koyup kendi çektiğiniz fotograflar üzerinde bunu yapabilirsiniz.
Kendiniz başka yöntemlerde bulabilirsiniz. Normalde sınıflandırma için özel algoritmalar da vardır. Araştırıp
onlarıda kullanabilirsiniz. Algoritmanızın çalıştığını göstermek için en az 5 fotograf üzerinde denemesini yapın
ve gösterin.
13
Karabük Üniversitesi, Mühendislik Fakültesi............................................................................................... ........www.IbrahimCayiroglu.com
Ödev 2-Resimde ön planı tespit edip arka plandan çıkarma: Bir resim sahnesinde arka plandaki bölgeyi
çıkaracak bir kodlama yapın. Örneğin düz bir duvarın önünde bir fotograf çekilen bir kişinin görüntüsünü arka
plandan ayırın. Arka plana da bir manzara resmi yerleştirin. Her iki resmi birleştirin. Böylece kişi manzara
önünde resim çektirmiş gibi olsun. Bu işlem için öndeki resmin sınırlarını net bir şekilde bulabilecek bir renkte
uygun resim olması gerekir. Kendi bakış açınızla çıkabilecek sorunları nasıl çözersiniz araştırın.
Ödev 3-Tuz Biber Görüntüsünü Düzeltme Algoritması: Tuz-biber görüntüsü olan bir resmi alıp üzerindeki
noktaları aşıındırma ve genişletme şablonlarını kullanarak yok etmeye çalışın. İki ayrı (9 luk kare şablon, 5 lik
Artı şablon) şablonla da deneyin. Hangisinin daha iyi yok ettiğini gösterin.
Bu uygulamayı Medyan filtresini kullanarak da deneyin. Medyan filtresi ile Aşındırma-Genişletme filtrelerinin
Tuz-Biber görüntüsü üzerindeki başarılarını kıyaslayın.
Aynı şablonları bir resim üzerindeki kenarlarda oluşan açıklıkları kapatmak için kullanın. Hangisi daha iyi
kapattığını gözlemleyin. Programı yazarken kişi menüden hangi şablonu kullanacağını belirleyebilsin. Hangi
genişleteceğini yada daraltacağını belirleyebilsin. Birbirine yakın renkleride komşu olarak görmesi için kişi R, G,
B olmak üzere üç kanal için renk aralığı belirleyebilsin. Yani 50<R<120, 0<G<200 ve 150<B<180 aralıkları
ayarlayabilsin.
14
Karabük Üniversitesi, Mühendislik Fakültesi............................................................................................... ........www.IbrahimCayiroglu.com
Ödev 5: Uydu Fotograflarından Çevre ve Alan Bulma: Uzaydan çekilen fotoğraflar üzerinde bir gölün yada
arazinin alanını ve çevresini km yada m cinsinden hesaplayan bir program geliştirin. Çekilen fotoğraf üzerinde
düz bir çizgi çizip bu çizgiyi ölçek olarak kullanın. (örneğin aşağıdaki Van gölü üzerinde çizilen sarı çizgi 50 km
karşlılık gelmektedir. Bu resimde bu çizginin boyu 150 piksel ise her piksel 50.000 m/150 = 300 metreye karşılık
gelir).
Sınıf ortamında denen kareler üzerinde yapılan adımlar aşağıdaki şekilde olmuştur. Siz bu adımları daha otomatik
hale getirin (bir tuşla alan ve çevresini ekrana yazdırabilin) ve adımların daha iyi sonuç vermesi için algoritmaları
geliştirin.
a) Van gölünün hava fotoğrafı Google Earth den alındı. Üzerine ölçek çizgisi çizildi ve resim Gri resme
dönüştürüldü.
15
Karabük Üniversitesi, Mühendislik Fakültesi............................................................................................... ........www.IbrahimCayiroglu.com
c) Resim üzerindeki küçük siyah noktalar Medyan filtresi kullanılarak yok edildi.
d) Gölün alanı beyaz gözükmesi için (arka planı siyah yapmak için) negatifi alındı.
e) Beyaz bölgeleri tespit için alan bulma algoritması uygulandı ve her bir alan farklı renklere boyandı. 25
tane alan buldu. Bu renkli alanların her birinin km2 olarak alanı piksel ölçeklemesi kullanarak
hesaplanacak.
f) Gölün kenarları nı tespit için beyaz bölgeleri genişletme algoritması uygulandı ve orjinalinde çıkarılınca
kenarlar keskin bir şekilde (tek piksel kalınlığında) bulundu. Bu kenar resmi üzerinden gölün çevresi
ölçülecek.
16
Karabük Üniversitesi, Mühendislik Fakültesi............................................................................................... ........www.IbrahimCayiroglu.com
g) Sonuç olarak tek tuşla gölün alanı ve çevresi aşağıdakine benzer şekilde ekranda gösterilsin. Burada
önemli bir konu daha vardır. Resim üzerinde çok sayıda renklendirilmiş alan vardır. Bunlardan hangisinin
Van gölü olduğu nasıl anlaşılacak. Bunu tespit etmek için bir çok mantık geliştirilebilir ama şöyle bir
mantıkta olabilir.
Gölün ağırlık merkezi hesaplanabilir. (Tüm aynı renkleri resmin koordinat köşesine göre x ve y cinsinden
ayrı ayrı hesaplanabilir. Aşağıda formülü verildi). Hesaplanan bu ağırlık merkezlerinden hangisi resmin
ortasına en yakın ise o ağırlık merkezinin ait olduğu alan hesaplanmaya çalışılan alandır. Yani sonuçta
incelenen resim ortadaki gölü içine alan çerçevedir. Dolayısı ile göl ile çerçevenin ağırlık merkezleri
yakın olacaktır.
Araştırma 1 (Uygun eşikleme değerini otomatik tespit): Bir resim üzerinde en uygun eşikleme yapan bir
algoritma geliştirin. Resim türlerine göre uygun eşikleme değişebilir. Eşikleme yapıldıktan sonra resmin bir kısmı
siyah bir kısmı beyaz olacaktır. Resim üzerindeki alanları net bir şekilde ortaya çıkaran uygun eşikleme problemi
nasıl çözülür, bir yöntem bulmaya çalışın. Burada tek renk üzerinde eşikleme yapıldı fakat üç renk üzerinden üç
farklı eşikleme değeride kullanılabilir. Böyle bir mantık daha iyi sonuçlar verebilir mi, bu konuları deneyerek
araştırın ve bir yöntem bulmaya çalışın.
17
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
GÖRÜNTÜ İŞLEME-9.HAFTA
ARİTMETİK OPERATÖRLER
Görüntü aritmetiği iki veya daha fazla görüntüye standart aritmetik işlemlerden birini (toplama, çıkarma, çarpma,
bölme) veya mantıksal bir operatörü uygulayan işlemleridir. İşlem giriş resmi ile çıktı resmi arasında piksel piksel
uygulanır. Bu nedenle, görüntülerin normalde aynı boyutta olması gerekir. Görüntü aritmetiği görüntü işlemenin
en basit şekli ve dolayısı ile hızlı işlemlerdir.
Birçok uygulamada, işlenen görüntüler aynı sahneden farklı zaman noktalarında alınır. Örneğin, aynı sahnenin
ardışık görüntüleri eklenerek rastgele gürültünün azaltılması veya iki ardışık görüntü çıkartılarak hareket algılama
işlemleri yapılabilir. Mantıksal işlemler ise genellikle iki görüntüyü birleştirmek için kullanılır.
GPT
Görüntü İşlemede Aritmetik operatörler nerede kullanılır?
Görüntü işlemede aritmetik operatörler, piksel değerlerini değiştirmek veya hesaplamak için kullanılır. Aritmetik
operatörler, görüntülerdeki pikseller arasında matematiksel işlemler yapmak için kullanılır ve çeşitli
uygulamalarda kullanılırlar. İşte aritmetik operatörlerin bazı kullanım örnekleri:
Görüntü toplama (Addition): İki veya daha fazla görüntüyü toplama işlemiyle birleştirmek için kullanılır. Her
pikselin değeri, aynı koordinatlardaki diğer görüntülerin piksel değerleriyle toplanır.
Görüntü çıkarma (Subtraction): İki görüntü arasındaki farkı hesaplamak için kullanılır. İki görüntünün piksel
değerlerini çıkartarak, farklılıkları vurgulamak veya arka planı çıkarmak için kullanılabilir.
Görüntü çarpma (Multiplication): İki görüntünün piksel değerlerini çarparak yeni bir görüntü oluşturur. Bu işlem,
görüntüleri birbirleriyle karıştırarak renk efektleri oluşturmak veya kontrastı artırmak için kullanılabilir.
Görüntü bölme (Division): Bir görüntüyü diğer bir görüntüye bölmek için kullanılır. Bölme işlemi, görüntüleri
normalleştirme veya bir görüntüyü diğerine göre orantılı hale getirme amaçlarıyla kullanılabilir.
Görüntü ölçeklendirme (Scaling): Bir görüntüyü belirli bir oranda büyütmek veya küçültmek için çarpma veya
bölme işlemleri kullanılabilir. Örneğin, görüntüyü yakınlaştırmak veya uzaklaştırmak için ölçeklendirme işlemi
yapılabilir.
Bu sadece bazı örneklerdir ve aritmetik operatörlerin kullanımı çok çeşitli olabilir. Görüntü işleme
algoritmalarında, piksel düzeyinde matematiksel işlemler yapmak için aritmetik operatörler sıklıkla kullanılır.
Bu operatör giriş olarak aynı boyutlarda iki adet görüntüyü alıp, çıkış olarak aynı boyutta üçüncü bir görünüşü
üretir. Çıkış resmi, giriş resminlerinde aynı konumdaki piksellerin toplamı ile üretilir. İkiden fazla görüntüyü
birleştirme yada her piksele belirli bir sabitin eklenmesi şeklinde uygulamalar da yapılabilir.
İki görüntünün eklenmesi tek bir geçişte doğrudan gerçekleştirilir. Çıktı piksel değerleri şu şekilde oluşturulur.
𝑄(𝑥, 𝑦) = 𝑃1 (𝑥, 𝑦) + 𝑃2 (𝑥, 𝑦)
Tek bir görüntüye sabir bir sayı eklenmek isteniyorsa formülasyon aşağıdaki gibi olacaktır.
𝑄(𝑥, 𝑦) = 𝑃1 (𝑥, 𝑦) + 𝐶
Renkli görüntülerde, çıktı değerini üretmek için her bir kanal (R, G, B) kendi arasında toplanır. Sabit değer ise her
bir kanala eklenir. Sabit değer eklenerek yapılan uygulamar, resmin parlaklığını artıran bir işlemdir.
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Ekleme işleminden sonra, renk değerleri üst limiti aşarsa (255), taşan kısımlar için şu uygulamalar yapılabilir.
a) Taşan değerler 255 sabitlenebilir.
b) Taşan en üst değer 255 olacak şekilde tüm pikseller Normalleştirilebilir.
c) Ekleme işlemi yapılmadan önce orijinal resim belli bir sayı ile ölçeklenebilir (A=0.8 gibi).
𝑄(𝑥, 𝑦) = 𝑃1 (𝑥, 𝑦) ∗ 𝐴 + 𝑃2 (𝑥, 𝑦)
Benzer şekilde her iki resmi de ölçekleyip toplayabiliriz (A=0.5, B=0.5).
𝑄(𝑥, 𝑦) = 𝑃1 (𝑥, 𝑦) ∗ 𝐴 + 𝑃2 (𝑥, 𝑦) ∗ 𝐵
c) Taşan kısımlar 0 dan başlayacak şekilde tekrar başa dönebilir.
d) Eğer bir görüntünün kenar çizgileri ile toplama yapılıyor ise, sadece kenar kısımlarında kenar görüntüsün değeri
diğer alanlarda ise orijinal resmin pikselleri kullanılabilir.
Aşağıdaki birinci resim direk iki resim toplanıp, sınırı aşan değerler 255 de sabitlenmiştir. İkinci resimde ise her iki
resimde 0.5 ölçekle çarpılarak önce karartılıp daha sonra değerler toplanmıştır.
Aşağıdaki iki resim toplanırken nişangahın renkli piksellere gelince renklerin%70 nişangahtan, %30 ana sahneden
alınmıştır.
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Örnek 1
for (x = 0; x < ResimGenisligi; x++) //Resmi taramaya şablonun yarısı kadar dış kenarlardan
içeride başlayacak ve bitirecek.
{
for (y = 0; y < ResimYuksekligi; y++)
{
Renk1 = Resim1.GetPixel(x, y);
Renk2 = Resim2.GetPixel(x, y);
}
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
}
pictureBox3.Image = CikisResmi;
}
for (x = 0; x < ResimGenisligi; x++) //Resmi taramaya şablonun yarısı kadar dış kenarlardan
içeride başlayacak ve bitirecek.
{
for (y = 0; y < ResimYuksekligi; y++)
{
Renk1 = Resim1.GetPixel(x, y);
Renk2 = Resim2.GetPixel(x, y);
int Gri = (R + G + B) / 3;
//Sınırı aşan değerleri 255 ayarlama. Gri resim üzerinde işlem yapıldığı için Sadece
R ye bakıldı.
if (Gri > EnBuyukDeger)
EnBuyukDeger = Gri;
}
}
pictureBox3.Image = CikisResmi;
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
public Bitmap Normalizasyon(Bitmap Resim1, Bitmap Resim2, int EnBuyukDeger, int EnKucukDeger)
{
Bitmap CikisResmi;
if (EnKucukDeger < 0)
AltSinir = 0;
else
AltSinir = EnKucukDeger;
for (x = 0; x < ResimGenisligi; x++) //Resmi taramaya şablonun yarısı kadar dış kenarlardan
içeride başlayacak ve bitirecek.
{
for (y = 0; y < ResimYuksekligi; y++)
{
Renk1 = Resim1.GetPixel(x, y);
Renk2 = Resim2.GetPixel(x, y);
}
}
return CikisResmi;
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
pictureBox2.Image = CikisResmi;
pictureBox2.Image = CikisResmi;
pictureBox2.Image = Image.FromFile(@"..\..\..\Resimler\Araba1.jpg");
int Xkoordinati = 20; int Ykoordinati = 20; int Genislik = 200; int Yukseklik = 150;
pictureBox2.Image = CikisResmi;
termal kamera olayı değildir. Termal kamerada insan gözünün göremediği frekansları (kızıl ötesi bölge)
görebileceğimiz frekansa dönüştürmek gerekir)
b) Aynı uygulamayı şu şekide değiştirin. Karanlık ortamda çıkan en büyük renk değerini 255 gelecek şekilde ve en
küçük renk değerini de 100 gelecek şekilde Normalize ederek resmi yeniden düzenleyin. Buradaki 100 sayısını
Sürgü (Trackbar) ile ayarlanabilir yapın.
Böyle bir görüntüde belli bir değerin üzerindeki beyaz kısımları tamamen beyaz, geri kalanı tamamen siyah
yaparsak başarısız bir ayırma işlemi gerçekleştirmiş oluruz. Aşağıdaki resim 100 değeri ile eşiklenerek elde
edilmiştir.
R = OkunanRenk.R;
if (R > 100)
R = 255;
else
R = 0;
Bu problemi çözmek için sahne dolu iken alınan görüntüden (Orijinal resim), sahne boş iken alınan görüntü (Gölge
resmi) çıkarılırsa ön plandaki cisimlerin görüntü değeri elde edilir. Çıkarma işleminde negatif sayılar elde etmeyi
önlemek yukarıda anlatılan uygun yöntemler denenerek daha iyi sonuçlar elde edilebilir. Aşağıdaki resim çıkarma
işlemine mutlak değer fonksiyonu uygulanarak elde edilmiştir.
R = 255 - OkunanRenk.R;
G = 255 - OkunanRenk.G;
B = 255 - OkunanRenk.B;
CikisResmi.SetPixel(i, j, DonusenRenk);
Elde edilen bu görüntüde arka plandaki gölgeleri 170 değeri ile eşiklersek (ayarlanabilir bir sürgü-scrollbar ile
yapmak daha uygun olur) aşağıdaki sonucu elde ederiz.
R = OkunanRenk.R;
if (R > EsiklemeDeger)
R = 255;
else
R = 0;
Görüntünün zayıf aydınlatılmış alanlarında kontrast (yani ön plan ve arka plan yoğunluk farkı) daha iyi aydınlatılmış
kısma göre daha düşük olduğu için resim üzerindeki homojenlik henüz daha sağlanabilmiş değildir. Daha sonra
gelecek konularda bu problemi biraz daha iyileştirmeye çalışacağız fakat, ışık koşulları homojen olmadığı için tam
olarak %100 bir çözüm imkansızdır.
Araştırma 1: Bu uygulamayı gamma corrected yöntemini kullanarak daha da iyileştirmeye çalışın ve araştırın.
Böyle bir uygulama belli aralıklarla çekilen fotograflar işlenerek foto-kapan olarak kullanılabilir. Yada video
görüntüsü işlendiğinde hereket algılama olarak kullanılabilir. Sahnede çok küçük hareketleri algılamamak için
mutlak değer olarak toplam değer belli bir sayının üzerine çıktığında hareket var kabul edilebilir. Fakat bu
hesaplamada gri resimleri çıkarımı üzerinden değil, siyah-beyaz resimler üzerinden hesaplamak daha doğru olur.
Yani piksel farkı 0 yada 255 olacak şekilde hesaplama yapılırsa, renk derinliği işleme girmeden mekansal değişim
(hareket) algılanmış olur. Bu uygulama sahnede hereketin olduğu bölgeyi de verdiği için için kamera o bölgeye
odaklanıp zoomlama işlemi yaptırılabilir.
C- Piksel Çarpma ve Ölçekleme
Çarpma işleminin iki farklı türünden bahsedilebilir. Birincisi iki tane giriş resmi alınır. Bunlardan birincisinin piksel
değeri, ikinci resmin piksel değerleri ile çarpılması ile çıktı görüntüsü elde edilir. Buna Piksel çarpma denir. Bu işlem
iki görüntü ile yapılırken biri diğeri üzerinde maskeleme yapmak için kullanılabilir. Çarpma işlemi renk değerlerinin
hızla daha yükselmesini sağlamaktadır. Sonuçta piksel toplama işlemine benzer. Piksel toplama işleminde renk
değerleri daha yavaş yükselir. Bu nedenla bu operatörde değerler üst sınırı daha hızlı yaklaşır.
𝑄(𝑖, 𝑗) = 𝑃1 (𝑖, 𝑗) 𝑥 𝑃2 (𝑖, 𝑗)
Diğer bir uygulama ise bir giriş resmi belli bir ölçek değeri ile çarpılarak çıktı resminin oluşturulması sağlanır. Buna
Piksel ölçekleme denir. Bu ölçekleme Geometrik ölçekleme ile karıştırılmamalıdır. Geometrik ölçeklemede piksel
koordinatları değişir (spatial), bunda ise piksel değerleri değişir (spektral). Burada C katsayısı 1 den düşük olursa
resim aydınlığını azaltır. Renkli resimlerde ise her bir R, G, B kanalı ayrı ayrı sabit ile çarpılır.
𝑄(𝑖, 𝑗) = 𝑃1 (𝑖, 𝑗) 𝑥 𝐶
Çarpım katsayısı C birden büyük olursa o zaman üst sınır ya 255 i geçebilir. Bu durumda aşan değerler 255 de
sabitlenebilir. Yada başa sararak aşan değeler 0 dan itibaren yeniden değer verilebilir.. Örneğin 280 ise 280-
255=35 gibi. Çarpım işleminde piksel değerleri üst sınıra hızlıca yaklaşır. Sistem olarak sabit sayı ile toplamaya
benzer.
Bu yöntem resimleri aydınlatmak için kullanılabilir. Çarpım katsayısı 1 den küçük değer atanırsa resmi karartır.
Çarpma işlemi yukarıdaki birinci konu olan Piksel toplamadan daha doğal aydınlatma/karartma sonucu verir.
...
Renk1 = Resim1.GetPixel(x, y);
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
R = Renk1.R * Renk2.R;
G = Renk1.G * Renk2.G;
B = Renk1.B * Renk2.B;
if (R > 255) R = 255;
if (G > 255) G = 255;
if (B > 255) B = 255;
Aşağıdaki resim düşük bir ışıkta çekilmiş fotograftır. Bu resmi 3x sayısı ile ölçeklersek yandaki resim elde edilir.
Burada ölçekleme yaparken en üst limiti aşmamasına dikkat etmeliyiz. Aynı resim 5x ile öçeklenirse ve 255 geçen
değerler başa sarılırsa aşağıdaki 3 resim elde edilir. Burada çarpma işlemi sonunda aşan sayıların ne yapılacağı
kullanılacak uygulamalara uygun olarak belirlenebilir.
0.5x ile ölçekleme Orijinal Resim (1x Ölçekleme) 1.5x ile ölçekleme
R = Convert.ToInt16(Renk1.R * Olcekleme);
G = Convert.ToInt16(Renk1.G * Olcekleme);
B = Convert.ToInt16(Renk1.B * Olcekleme);
//Başa sararken değerler mod alarak hesaplanıyor. Böylece 540 % 255 =30 olmuş olur.
if (R > 255|| G > 255|| B > 255)
{
R = (R % 255);
G = (G % 255);
B = (B % 255);
}
D-Piksel Bölme
İki resim değerleri birbirine bölünerek çıktı görüntüsü elde edilebilir. Sonuçta piksel çıkarma işlemine benzer.
Ortaya çıkan değerler hızla küçüleceği için, çıkarma işleminden daha küçük sayılar elde edilir. Örneğin çıkarma
işleminde 180 değeri ile 30 değerleri 150 sonucunu verirken, Bölme işleminde 180/30=6 değerini verir. Bu nedenla
bu operatörde değerler alt sınırı daha hızlı yaklaşır.
𝑄(𝑖, 𝑗) = 𝑃1 (𝑖, 𝑗) ÷ 𝑃2 (𝑖, 𝑗)
Diğer bir uygulama ise bir giriş resmi belli bir sabit değere bölünerek çıktı resminin oluşturulması sağlanır. Buna
Piksel ölçeklemenin bir başka türünü verecektir. Renkli resimlerde ise her bir R, G, B kanalı ayrı ayrı sabit ile
bölünür.
𝑄(𝑖, 𝑗) = 𝑃1 (𝑖, 𝑗) ÷ 𝐶
Uygulama: Bu konu ile uygulamaları kendiniz yaparak deneyin. Yukarıdaki örneklerde olduğu gibi sınırı geçen
değerler için yada alt sınıra yakın bölgede biriken değerler için belli düzeltme faktörleri uygulayarak (ölçekleme
yada normalizasyon yapılabilir) çıktı resmi daha görünür hale getirilebilir.
Burada a ve b değerleri çıktı resminde oluşan sınırları (-30, 280 gibi sınırların dışına çıkmış olabilir), c ve d ise
çekilmek istenen sınırları (örneğin 0-255 olabilir) gösterir.
Normalizasyondaki esas sorun çok yüksek veya çok düşük bir değere sahip tek bir pikselin değeri, çıktı c veya d
değerini ciddi şekilde etkileyebilmesidir ve bu da çok temsilsiz ölçeklendirmeye yol açabilir. Bu nedenle, daha
sağlam bir yaklaşım önce görüntünün bir histogramını almak ve sonrasında histogramdaki %5 ve %95
değerlerinden c ve d'yi seçmektir. Böylece aşırı uçlardaki değerler ihmal edilmiş olur. Bu durum, ölçeklendirmeyi
çok etkileyen aykırı değerleri önler.
Aykırı değerlerle başa çıkmanın bir başka yolu ise, bir görüntüdeki en popüler yoğunluk seviyesini (yani histogram
pikini) bulmak için yoğunluk histogramını kullanmaktır. Ortaya çıkan histogramda yığılmanın olduğu bölgenin
altından ve üstünden alınan değerler ile c ve d değerleri tespit edilebilir.
Renkli görüntüler ile çalışılıyorsa, doğru renk oranlarını korumak için tüm kanallar aynı ofset ve ölçeklendirme
kullanılarak gerilmelidir (normalize edilmelidir).
Programlama: Normalizasyon
Bu iki resmi 1.8 ve 1.2 katsayıları ile ölçekleyip toplarsak (Blending işlemi) üst değerler sınırı geçecektir. Bu değerler
için üst sınırı geçenleri 255 e sabitlersek birinci görüntüyü elde ederiz. Üst sınırı Normalizasyon yaparak (tüm
pikselleri orantısal olarak kaydırırsak) 255 ayarlarsak aşağıdaki ikinci görüntüyü elde ederiz.
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
for (x = 0; x < ResimGenisligi; x++) //Resmi taramaya şablonun yarısı kadar dış kenarlardan
içeride başlayacak ve bitirecek.
{
for (y = 0; y < ResimYuksekligi; y++)
{
Renk1 = Resim1.GetPixel(x, y);
Renk2 = Resim2.GetPixel(x, y);
//Sınırı aşan değerleri 255 ayarlama. Gri resim üzerinde işlem yapıldığı için Sadece
R ye bakıldı.
if (R > EnBuyukDeger)
EnBuyukDeger = R;
if (R < EnKucukDeger)
EnKucukDeger = R;
}
}
////////////////////////////////////////////////////////////////
public void Normalizasyon(Bitmap Resim1, Bitmap Resim2, int EnBuyukDeger, int EnKucukDeger)
{
Bitmap CikisResmi;
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
if (EnKucukDeger < 0)
AltSinir = 0;
else
AltSinir = EnKucukDeger;
for (x = 0; x < ResimGenisligi; x++) //Resmi taramaya şablonun yarısı kadar dış kenarlardan
içeride başlayacak ve bitirecek.
{
for (y = 0; y < ResimYuksekligi; y++)
{
Renk1 = Resim1.GetPixel(x, y);
Renk2 = Resim2.GetPixel(x, y);
}
}
pictureBox2.Image = CikisResmi;
}
Ödev 1
a) İki tane resmi toplama işlemi yaptırın. Bu resimleri toplarken her resmi farklı ölçeklerle çarparak toplayın.
Böylece ortaya çıkan birleşmiş resimi her iki resmi aynı orantıda göstermeye çalışsın. Örneğin aşağıda birinci resim
koyu bir resim, ikinci daha açık bir resimdir. Bu iki resim toplanırken birinci resim daha büyük bir ölçekle çarpılarak
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
toplanmalı. Ortaya çıkan resim üzerinde tamamen beyazlama olmayacak şekilde ölçekleri ayarlanmalı. Ölçekleri
ayarlamak için yan tarafta sürgüyü kullanarak manuel olarak yapınız.
b) Aynı uygulamayı otomatik ölçeklendirme yaparak yaptırın. (İpucu: Birinci resimdeki tüm renkleri toplasak,
ortalamasını alsak -yani piksel sayısına bölsek, aslında renk düzeyinin ortalamasını bulmuş oluruz. Örneğin birinci
resmin ortalaması (R, G, B hepsi için ortak bir sayı olmalı) 65 çıkmış olsun. İkinci resimde bu ortalama 130 çıkmış
olursa, buradan ne anlarız, birinci resim daha koyu bir resimdir, ikinci resim ise açık bir resimdir. Bu iki resmi
topladığımızda toplamları 255 geçmeli. Birinci resmi 2 le çarpsak diğerini de 1 le çarpsak yaklaşık olarak 260 gibi
bir sayıyı tuttururuz. Buda iki resmi eşdeğer oranda havuza katıldığını gösterir. Buna benzer bir mantık kullanarak
otomatik ölçeklendirme yaptırın.
c) İki resmi kendi orijinal piksel değerleri ile toplayın. Dolayısı ile bazı piksellerin değeri 255 i geçecektir . Bu
durumda ortaya çıkan resimde beyazlamış bölgeler olacaktır. İşte bu beyazlamış olan bölgeleri yok etmek
Normalizasyon işlemi uygulayın.
Geliştirdiğiniz bu üç yöntemden hangisi daha uygun resim toplama işlemi yaptı. Yorumlayın.
Ödev 2: Bant üzerinde akan ürünlerin farklı ışık ortamlarında zeminden ayırma: Bant üzerinden akan ürünleri
görüntü işleme ile tespit etmek istiyoruz. Bu ürünler YSA ya gönderilirken sadece siyah ve beyaz olmasını istiyoruz
(2 renk olacak). Fabrikada üretim hattında ışık ortamı sürekli olarak değişmektedir. Gündüz ve akşam saatleri ile
fabrikanın ışıklarını oluşturduğu farklı gölgelemeler ortaya çıkmaktadır. Bu gölgelemeler çok hızlı olmasa da yavaş
bir şekilde değişmektedir. Böyle bir ortamda bant üzerindeki ürünleri doğru bir şekilde zeminden ayırabilmek için
algoritmayı geliştirin.
Ödev için bu uygulamayı yaparken masa üzerine boş bir kâğıt koyun. Odanın ışıklarını kapatın. Yan taraftan mum
ışığında (telefon ışığında) kâğıdın fotoğrafını üstten çekin. Kâğıt gölgeli bir fotoğraf olacaktır. Bu fotoğraf arka plan
resmi olur. Sonra üzerine bir cisim koyun (Bir kaşık olabilir). Bu cismi arka plandan ayırırken eşikleme yaparak ve
iki resmi birbirinden çıkararak uygulamayı gerçekleştirin. Hangisinde nesneyi daha iyi ayırdınız gösterin.
Ödev 3: Hareket sensör ile cismin merkezini yakalayıp, kamera eksenini (silah eksenini) ne kadar çevireceğini
(yatayda ve dikeyde) hesaplayacak programı yazın).
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Ödev 4: Hareket eden cisimlerde Ağaç ile insanı fark edebilecek bir algoritma geliştirin. Hareket cismin üzerine bir
Artikel ekleyin (+ işareti) bu işaret hareket eden cismi takip etsin. Deney ortamını hazırlayın algoritmalarını yazın..
Ödev 5: Bir fabrika otomasyon sisteminde kamere çevre şartları içinde içinde içinde çalışsın. Çevredeki ışıklar
değiştikçe bant sistemi üzerindeki yakalanan nesnenin görüntüsünün kalitesi değişmesin. Çevredeki ışıklar
değişsin. Her değişimde hızlı bir şekilde cismi daha net bir şekilde ortamdan ayırabilsin. Deney ortamını oluşturun.
Ödev 6: Askeri uygulamalar için dürbünle bakarken Artikel, çekim saatleri, mesafe skalası gibi gerçek görüntüyü
oluşturacak bir uygulama yapın. Video görüntüsü üzerinde bu uygulama nasıl yaparsınız araştırın.
ÖDEV 7: Aşağıdaki gibi bir üzerine daha ayarlanabilir bir yazıyı çapraz ve saydam olarak yazdıran komutları
oluşturun.
Gölgeli bir yazı görüntüsünü daha okunaklı hale getirmek için zemin görüntüsünden çıkarırsak daha iyi sonuç elde
ederiz. Aşağıda bu uygulamanın aşamaları gözükmektedir. Fakat hala koyu bölgede yazılar kaybolmakta, açık
bölgede ise yazıların arası dolmaktadır. Tam iyi bir sonuç elde edilememektedir.
Daha gelişmiş algoritmalar yazarak bu sorunu çözmeye çalışın. Yazı ve zemin görüntüsünü karanlık bir odada
telefonun ışığı ile kendiniz elde edin.
Ödev 11. Hareket algılama-foto kapan: İki resmi bir birinden çıkardığımızda ortaya çıkan resim bize hareket eden
nesneleri gösterir. Fakat bu işlemde küçük gölgeler ve küçük nesnelerde (yaprakların oynaması gibi) hareket ediyor
olarak gözükür. Böyle bir kamera uygulamasında insan ve araba gibi büyük nesnelerin hareket ettiğini algılayan,
yaprak, sinek vs gibi küçük nesneleri hareket ediyor olarak algılamayacak bir algoritma geliştirin. Bulunan
nesnelerin ağırlık merkezine bir (+) işaret kondurun.
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Ödev 12: Gölgeli zeminden cismi ayırma: Masanın üzerine bir kağıt koyun. Kağıdın yan tarafına bir engel (Bardak,
sürahi). Sürahinin arkasından ışık kağıdın üzerini aydınlatsın. (Oda karanlık olacak) Sürahinin gölgesi dalgalı bir
şekilde kağıdın üzerine düşer. Bu gölgenin üzerine Kalem, silgi, Şeker (kağıdı ile), vs cisimler koyalım.
a) İlk olarak tepeden kağıdın sabit bir kamera ile (telefonu sabitleyerek) fotoğraf alalım. Bu fotoğrafın
içinden cisimleri renkli bir şekilde ayıralım. Gölgeli arka plandan cisimleri zor olacaktır.
b) İkinci durumda bu sefer cisimler yokken kağıdın gölgeli görüntüsünü alalım. Bu görüntüden cisimler
varken çekilen fotoğrafı çıkarırsak, cisimleri daha kolay tespit ederiz. Fakat tespit ettiğimiz yer aslında
cismin silüetidir. Tam olarak kendi renginde göremeyiz. Eğer bu sülietleri olduğu görüntüyü arka plandan
ayırırsak (cismin beyaz pikselleri olur) ve aynı koordinatları orijinal resmin (gölgeli kağıdın üzerindeki
cisimlerin görüntüsü) üzerindeki piksellerden okursak artık aradığımız cismin renkli halini zeminden
tamamen ayırarak ortaya çıkartırız. (Resim temsili konmuştur, konuyu tam anlatmaz)
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
GÖRÜNTÜ İŞLEME-10.HAFTA
İçindekiler
GÖRÜNTÜ İŞLEME-10.HAFTA .................................................................................................................................... 1
MANTIKSAL OPERATÖRLER ................................................................................................................................... 1
Mantıksal AND/NAND Operatörleri....................................................................................................................... 2
AND/NAND operatörü nerede kullanılır? .......................................................................................................... 2
C# Kendi Fonksiyonları ile AND operatörünü kullanma ........................................................................................ 6
Uygulama 1-İki görüntünün kesişimini bulma ................................................................................................... 7
Uygulama 2-Görüntülerden birini maske olarak kullanma ............................................................................... 7
BİT DİLİMLEME................................................................................................................................................... 7
Sabit Sayı ile AND leme .................................................................................................................................... 13
Mantıksal OR/NOR Operatörleri.......................................................................................................................... 16
OR/NOR operatörü nerede kullanılır? ............................................................................................................. 16
OR Uygulamaları .............................................................................................................................................. 17
OR ile Bölge Genişletme .................................................................................................................................. 18
Mantıksal XOR/XNOR Operatörleri ..................................................................................................................... 20
XoR ile Kenar Tespiti Yapan Algoritma ............................................................................................................ 20
XoR ile İki Resimde Farklı Bölgeleri Tespit Etme .............................................................................................. 21
XoR ile Görüntüye Efekt Uygulama ................................................................................................................. 22
Mantıksal NOT Operatörü (Invert-Tersini alma) ................................................................................................. 23
NOT operatörü ile Kenar Tespiti ...................................................................................................................... 24
Bitshift (Bit kaydırma) Operatörü ........................................................................................................................ 25
Bit kaydırma ile Örnek Overlap (Örtüşme) yapan kod. ................................................................................... 27
MANTIKSAL OPERATÖRLER
Mantıksal operatörler, resmin gerçek değerlerine dokunmadan, boolean ifadeler (true yada false) kullanılarak yeni
bilgiler veya görüntüler çıkarmak için kullanılır. Örneğin “Ağaç hem yeşil hemde büyük ise” ifadesi A AND B
şeklinde ifade edilebilir. Bu durumda her iki kavramda doğru (true) ise sonuç True olacaktır ve ona göre işlem
yapılacaktır. Bu şekilde girilen iki tane görüntü üzerinde yada tek bir görüntü üzerinde, piksel değerlerine
mantıksal operatörlerin doğruluk tablosu kuralları uygulanarak görüntüler üzerinde mantıksal işlemler
gerçekleştirebiliriz. Normalde, aynı boyutta iki görüntüden çıktı görüntüsünü üretmek için, giriş görüntüsülerine
ait birbirine karşılık gelen pikseller karşılaştırılır. Tek bir giriş görüntüsünü sabit bir mantıksal değerle mantıksal
olarak birleştirmek de mümkündür. Bu durumda giriş görüntüsündeki her piksel karşılık gelen çıkış pikselini
üretmek için aynı sabit ile karşılaştırılır.
Mantıksal işlemler, tamsayı piksel değerlerine sahip görüntüler üzerinde, bu tamsayıların ikili gösterimleri (binary)
yapılarak bunlar üzerinde bitsel bir şekilde işlem yapılarak, çıkış piksel değerine bitsel sonuçlar üretilip buradan
tam sayı değerine ulaşılabilir. Örneğin, 47 ve 255 tam sayılarını 8 bitlik tam sayıları kullanarak birlikte XOR yapmak
istediğimizi varsayalım. Bunları ikili biçimde göserirsek 45 sayısı 00101111 ve 255 sayısı 11111111'dir. Bunları
bitsel olarak birlikte XORing yaparak, ikili olarak 11010000 değerine ulaşılır. Bunun karşılığı ise tam sayı olarak 208
dir.
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Mantıksal işlemler illa böyle bitsel (1/0) olarak uygulanması gerekmez. Örneğin, bazı uygulamalarda sıfır değerleri
false kabul edilirken, sıfır haricindeki herhangi bir değer true olarak kabul edilebilir. Çıktı görüntüsünü elde etmek
için ise 1-bit mantıksal işlemleri uygulanır. Çıktı görüntüsü basit bir ikili (binary) görüntünün kendisi olabilir ya da
belki de ikili (binar) çıktı görüntüsü (sadece siyah ve beyaz görüntü) giriş görüntülerinden hehangi biriyle
çarpılarak gri seviye bir görüntü elde edilebilir..
txtDeger1.Text = binarySayi;
txtDeger2.Text = intSayi2.ToString();
Dikkat edilirse iki tablo birbirinin tam zıttıdır. Bu Operatörlerde Birinci resmi alıp, ikinci resimle AND veya NAND
işlemine tabi tutularak çıktı resmi oluşturulur. Yada sadece tek bir Girdi resmi alınır ve belli bir sabit sayı ile AND
yada NAND işlemine tabi tutulabilir. Tablolara dikkat edilirse bu iki operatör birbirinin tam tersidir.
AND ve NAND operatörü giriş olarak iki adet ikili (binary-siyah/beyaz resim) veya tamsayı ile ifade edilen gri seviye
görüntüyü alır ve piksel değerleri üzerinde işlem yaparak ilk görüntünün değerlerini ikinci görüntü ile işlem
yaparak üçüncü bir görüntü oluşturulur. Bu operatörün farklı bir uygulaması olarak tek bir giriş görüntüsü alınıp
her pikseli sabit bir değer ile işleme tutarak çıktı görüntüsü oluşturulabilir.
İşlem tek bir geçişte doğrudan gerçekleştirilir. Üzerinde çalışılan tüm giriş pikseli değerlerinin aynı sayıda bite sahip
olması önemlidir. Giriş görüntülerindeki piksel değerlerinin basit 1 bitlik sayılar olmadığı durumlarda, AND işlemi
normalde (ancak her zaman değil) piksel değerlerindeki her bir bit üzerinde ayrı ayrı, bitsel şekilde gerçekleştirilir.
Piksel birleştirme: İki görüntü arasında piksel bazında birleştirme yapmak için AND operatörü kullanılabilir. Bu
işlemde, iki görüntünün aynı konumdaki pikselleri AND operatörü ile birleştirilir ve sonuç görüntüsünde yalnızca
ortak olan piksellerin değeri korunur.
Maskeleme: Bir görüntüyü başka bir görüntüyle maskelemek için AND operatörü kullanılabilir. Maskeleme işlemi,
bir maske görüntüsünün belirli bir değeri olan pikselleri korurken, diğer pikselleri göz ardı etme işlemidir. AND
operatörü, görüntüyü maskeleme işleminde kullanılan maske görüntüsüyle birleştirerek istenilen piksellerin
sınırlanmasını sağlar.
Sınırlama: Görüntüdeki pikselleri belirli bir değer aralığıyla sınırlamak için AND operatörü kullanılabilir. Örneğin,
bir görüntüdeki piksellerin belirli bir aralıkta (örneğin, minimum ve maksimum değerler arasında) olmasını
istiyorsak, bu sınırlama işlemi için AND operatörü kullanılabilir. AND operatörü, piksellerin değerlerini sınırlama
aralığıyla birleştirerek istenen sınırlamayı uygular.
Bu örnekler, görüntü işleme uygulamalarında AND operatörünün yaygın olarak kullanıldığı bazı senaryoları
göstermektedir. Ancak, bu sadece bazı örneklerdir ve AND operatörü, diğer görüntü işleme işlemlerinde de farklı
şekillerde kullanılabilir. Diğer mantıksal işleçlerde olduğu gibi, AND ve NAND genellikle daha karmaşık görüntü
işleme görevlerinin alt bileşenleri olarak kullanılır.
for (x = 0; x < ResimGenisligi; x++) //Resmi taramaya şablonun yarısı kadar dış kenarlardan
içeride başlayacak ve bitirecek.
{
for (y = 0; y < ResimYuksekligi; y++)
{
Renk1 = Resim1.GetPixel(x, y);
Renk2 = Resim2.GetPixel(x, y);
////AND İŞLEMİ
//if (Bit1 == "0" && Bit2 == "0") StringIkiliSayi = StringIkiliSayi + "0";
//else if (Bit1 == "1" && Bit2 == "1") StringIkiliSayi = StringIkiliSayi + "1";
//else StringIkiliSayi = StringIkiliSayi + "0";
//NAND İŞLEMİ
if (Bit1 == "0" && Bit2 == "0") StringIkiliSayi = StringIkiliSayi + "1";
else if (Bit1 == "1" && Bit2 == "1") StringIkiliSayi = StringIkiliSayi + "0";
else StringIkiliSayi = StringIkiliSayi + "1";
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
}
R = Convert.ToInt32(StringIkiliSayi, 2); //İkili sayıyı tam sayıya dönüştürüyor.
}
}
pictureBox3.Image = CikisResmi;
for (x = 0; x < ResimGenisligi; x++) //Resmi taramaya şablonun yarısı kadar dış kenarlardan
içeride başlayacak ve bitirecek.
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
{
for (y = 0; y < ResimYuksekligi; y++)
{
Renk1 = Resim1.GetPixel(x, y);
Renk2 = Resim2.GetPixel(x, y);
string Bit1R = null, Bit1G = null, Bit1B = null, Bit2R = null, Bit2G = null, Bit2B =
null;
string StringIkiliSayiR = null, StringIkiliSayiG = null, StringIkiliSayiB = null;
//AND İŞLEMİ
if (Bit1R == "0" && Bit2R == "0") StringIkiliSayiR = StringIkiliSayiR + "0";
else if (Bit1R == "1" && Bit2R == "1") StringIkiliSayiR = StringIkiliSayiR + "1";
else StringIkiliSayiR = StringIkiliSayiR + "0";
//AND İŞLEMİ
if (Bit1G == "0" && Bit2G == "0") StringIkiliSayiG = StringIkiliSayiG + "0";
else if (Bit1G == "1" && Bit2G == "1") StringIkiliSayiG = StringIkiliSayiG + "1";
else StringIkiliSayiG = StringIkiliSayiG + "0";
//AND İŞLEMİ
if (Bit1B == "0" && Bit2B == "0") StringIkiliSayiB = StringIkiliSayiB + "0";
else if (Bit1B == "1" && Bit2B == "1") StringIkiliSayiB = StringIkiliSayiB + "1";
else StringIkiliSayiB = StringIkiliSayiB + "0";
}
R = Convert.ToInt32(StringIkiliSayiR, 2); //İkili sayıyı tam sayıya dönüştürüyor.
G = Convert.ToInt32(StringIkiliSayiG, 2); //İkili sayıyı tam sayıya dönüştürüyor.
B = Convert.ToInt32(StringIkiliSayiB, 2); //İkili sayıyı tam sayıya dönüştürüyor.
}
}
pictureBox3.Image = CikisResmi;
}
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Çıktısı: İki resimdeki yüksek değerli (255) ortak bölgeyi göstermiş oldu. Birinde yüksek diğerinde düşükse onu yok
etti. Her ikisi de düşük olunca zaten yok oldu. Zaten AND operatörünü inceleyecek olursak tablo ile aynı mantığı
burada verdi. Resimler iki renkli olduğu için bu yorumu yapmak kolay oldu, fakat renkli resimlerde bu kadar
değişimi görmek kolay olmayacaktır .
SonucGoruntusu.SetPixel(x, y, sonucRenk);
}
}
BİT DİLİMLEME
AND operatörü, 8 bitlik bir görüntüde “bit dilimleme” adı verilen işlemi gerçekleştirmek için de kullanılabilir. Belirli
bir bitin görüntü üzerindeki etkisini belirlemek için, ilgili bitin 1'e ve geri kalan 7 bitin 0'a ayarlanır. sabit bir sayı
ile bitsel bir şekilde AND işlemi uygulanır.
Örneğin, görüntünün 8. Bitini (en önemli bite karşılık gelir) işlemi uygularsak ve AND işlemine tabi tuttuktan sonra
128 değeri ile eşiklersek arşağıdaki ikinci görüntüyü elde ederiz.
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Aşağıdaki resimler sırasıyla görüntünün 7., 6., 4., 1. bit düzlemlerine uygulanan işlemlere karşılık gelir. Görüntü
bilgisinin daha çok yüksek değerli bitlerde olduğu görülecektir. Daha az anlamlı bitler daha ince detayları yada
paraziti içerir.
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
2. bit 5x öçekleme
4 bit 20x
5 bit 50x
6 bit 100x
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
7 200x
Color Renk1;
int x, y;
int R = 0, G = 0, B = 0;
for (x = 0; x < ResimGenisligi; x++) //Resmi taramaya şablonun yarısı kadar dış kenarlardan
içeride başlayacak ve bitirecek.
{
for (y = 0; y < ResimYuksekligi; y++)
{
Renk1 = Resim1.GetPixel(x, y);
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
}
else
{
StringIkiliSayiR = StringIkiliSayiR + "0";
StringIkiliSayiG = StringIkiliSayiG + "0";
StringIkiliSayiB = StringIkiliSayiB + "0";
}
}
R = Convert.ToInt32(StringIkiliSayiR, 2); //İkili sayıyı tam sayıya dönüştürüyor.
G = Convert.ToInt32(StringIkiliSayiG, 2); //İkili sayıyı tam sayıya dönüştürüyor.
B = Convert.ToInt32(StringIkiliSayiB, 2); //İkili sayıyı tam sayıya dönüştürüyor.
R = R * Olcek;
G = G * Olcek;
B = B * Olcek;
}
}
pictureBox3.Image = CikisResmi;
}
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Aşağıdaki resmi çeşitli sabit sayılar ile AND işlemine tabi tutarsak şu sonuçları elde ederiz. Sayı küçük iken görüntü
koyu olduğu için görebilmek için ölçeklemek gerekmiştir.
1 sayısı ile AND leme ve 1x Ölçekleme 1 sayısı ile AND leme ve 255x Ölçekleme
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
15 sayısı ile AND leme ve 10x Ölçekleme 100 sayısı ile AND leme ve 1x Ölçekleme
230 sayısı ile AND leme ve 1x Ölçekleme 250 sayısı ile AND leme ve 1x Ölçekleme
Benzer şekilde 0 sayısı ile AND leme yaparsak tamamen siyah resim, 255 sayısı ile AND leme yaparsak tamamen
Orijinal resmi elde ederiz.
Color Renk1;
int x, y;
int R = 0, G = 0, B = 0;
for (x = 0; x < ResimGenisligi; x++) //Resmi taramaya şablonun yarısı kadar dış kenarlardan
içeride başlayacak ve bitirecek.
{
for (y = 0; y < ResimYuksekligi; y++)
{
Renk1 = Resim1.GetPixel(x, y);
//AND İŞLEMİ
if (Bit1 == "0" && Bit2 == "0") StringIkiliSayi = StringIkiliSayi + "0";
else if (Bit1 == "1" && Bit2 == "1") StringIkiliSayi = StringIkiliSayi + "1";
else StringIkiliSayi = StringIkiliSayi + "0";
}
R = Convert.ToInt32(StringIkiliSayi, 2); //İkili sayıyı tam sayıya dönüştürüyor.
}
}
pictureBox2.Image = CikisResmi;
0
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
50 100
150 200
OR Uygulamaları
if (neighborPixel.GetBrightness() > 0)
{
isDilated = true;
break;
}
}
if (isDilated)
break;
}
dilatedImage.SetPixel(x, y, Color.Black);
}
}
Bu kod, "image.jpg" adlı bir görüntüyü yükler. Ardından, dilatedImage adlı yeni bir görüntü oluşturulur ve pikselleri
dolaşarak her pikselin etrafındaki yapılandırma elemanına (structuring element) bakarak bölge genişletme işlemi
yapar. Bölge genişletme, pikselin etrafındaki yapılandırma elemanında en az bir beyaz (parlaklık değeri 0'dan
büyük) piksel varsa, pikseli beyaz yapar; aksi takdirde, pikseli siyah yapar. Bu işlem, görüntü üzerinde beyaz
bölgeleri genişletir ve siyah bölgeleri daraltır. Sonuç olarak, "dilated_image.jpg" adıyla genişletilmiş görüntü
kaydedilir.
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
if (isEdgePixel)
edgeImage.SetPixel(x, y, Color.White);
else
edgeImage.SetPixel(x, y, Color.Black);
}
}
Bu kod, "image.jpg" adlı bir görüntüyü yükler. Ardından, edgeImage adlı yeni bir görüntü oluşturulur ve pikselleri
dolaşarak her pikselin etrafındaki komşu pikselleri alır. Daha sonra, piksellerin R (kırmızı) bileşenlerini XOR
operatörü ile karşılaştırarak kenar piksellerini belirler. Eğer XOR işlemi sonucu elde edilen değer 128'den büyük
ise piksel kenar pikseli olarak kabul edilir. Kenar pikselleri beyaz yapılır, diğer pikseller siyah yapılır. Sonuç olarak,
"edge_image.jpg" adıyla kenar tespiti yapılan görüntü kaydedilir.
Bu kod örneği, basit bir kenar tespiti algoritmasıdır ve çıktıda yalnızca yatay ve dikey kenarlar belirginleştirilir.
Daha gelişmiş kenar tespiti algoritmaları, farklı filtreler veya yöntemler kullanarak daha hassas sonuçlar elde
edebilir.
Bu kod, "image1.jpg" ve "image2.jpg" adlı iki görüntüyü yükler. Ardından, görüntülerin boyutlarını kontrol eder
ve eşit olduklarını doğrular. Sonuç olarak, diffImage adlı yeni bir görüntü oluşturulur ve pikselleri dolaşarak her iki
görüntünün piksellerini XOR operatörü ile karşılaştırır. XOR operatörü, her iki pikselin R, G ve B bileşenlerini XOR
işlemine tabi tutar. Eğer XOR işlemi sonucu elde edilen değer 128'den büyük ise pikseller farklı olduğu kabul edilir.
Farklı pikseller beyaz yapılır, diğer pikseller siyah yapılır. Sonuç olarak, "diff_image.jpg" adıyla farklılık analizi
yapılan görüntü kaydedilir.
Bu kod, "image.jpg" adlı bir görüntüyü yükler. Ardından, bir renk efekti oluşturmak için effectColor adlı bir renk
değeri belirler. Sonuç olarak, effectImage adlı yeni bir görüntü oluşturulur ve pikselleri dolaşarak her pikselin R, G
ve B değerlerini XOR operatörü ile effectColor değeriyle birleştirir. Bu işlem, pikselin renk değerleri ile belirtilen
efekt rengi arasında XOR işlemi yaparak yeni bir renk oluşturur. Sonuç olarak, "effect_image.jpg" adıyla efekt
uygulanmış görüntü kaydedilir.
Bu sadece birkaç örnektir ve NOT operatörü, görüntü işlemede farklı amaçlar için kullanılabilir. Uygulama
senaryosuna ve ihtiyaçlara bağlı olarak farklı kullanımlar da mümkündür.
// Görüntüyü yükle
Bitmap image = new Bitmap(pictureBox1.Image);
pictureBox2.Image = edgeImage;
}
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Bu kod, "image.jpg" adlı bir görüntüyü yükler. Ardından, edgeImage adlı yeni bir görüntü oluşturulur ve pikselleri
dolaşarak her pikselin etrafındaki piksellerle parlaklık farkını hesaplar. Parlaklık farkı, pikselin merkezindeki
pikselin parlaklık değeri ile sağdaki veya altındaki pikselin parlaklık değeri arasındaki farktır. Bu fark, belirlenen
eşik değeri (threshold) ile karşılaştırılır ve eşik değerinden büyükse piksel kenar pikseli olarak kabul edilir ve siyah
(Color.Black), değilse beyaz (Color.White) olarak atanır. Bu işlem, kenar tespiti yaparak görüntüdeki kenarları
belirginleştirir. Sonuç olarak, "edge_image.jpg" adıyla kenar tespit edilmiş görüntü kaydedilir. Bu örnekte, eşik
değeri olarak 30 kullanıldı. Siz istediğiniz farklı bir eşik değeriyle (threshold) deneme yaparak kenar tespit
edebilirsiniz
Mantıksal operatörlerden biri olan bit kaydırma (bit shifting) operatörleri, görüntü işleme alanında çeşitli
amaçlarla kullanılabilir. İşte bit kaydırma operatörlerinin bazı kullanım alanları:
Piksel İşleme: Görüntü işleme uygulamalarında, piksel değerlerini manipüle etmek için bit kaydırma operatörleri
kullanılabilir. Örneğin, bir görüntünün parlaklık değerlerini artırmak veya azaltmak için piksel değerlerini sola veya
sağa kaydırarak işlemler yapılabilir.
Maskeleme (Masking): Maskeleme işlemlerinde, belirli bir desenin veya maskeyi görüntü üzerinde uygulamak için
bit kaydırma operatörleri kullanılabilir. Maskeleme, belirli bir desenin belirli bölgeleri seçmek veya gizlemek için
kullanılır.
Kenar Tespiti: Kenar tespiti işlemlerinde, görüntünün kenarlarını belirlemek için bit kaydırma operatörleri
kullanılabilir. Özellikle Canny kenar tespiti gibi algoritmalarda, kenarları belirlemek için bit kaydırma operatörleri
kullanılan filtreler bulunur.
Örtüşme (Overlap): Bazı görüntü işleme işlemlerinde, iki veya daha fazla görüntüyü birleştirirken bit kaydırma
operatörleri kullanılabilir. Örneğin, iki görüntünün piksellerini birleştirmek veya üst üste bindirmek için bit
kaydırma operatörleri kullanılabilir.
İşaretçi Operasyonları: Görüntü işleme uygulamalarında, bellek manipülasyonu için işaretçi operasyonları
kullanılır. Bit kaydırma operatörleri, bellek adreslerini hesaplarken veya veri bloklarını işaretçi aracılığıyla taşırken
kullanılabilir.
Bu sadece bazı örneklerdir ve bit kaydırma operatörleri daha geniş bir şekilde görüntü işleme alanında
kullanılabilir. Uygulamanıza ve kullanım senaryonuza bağlı olarak, bit kaydırma operatörlerini farklı şekillerde
kullanabilirsiniz.
İşlem, tek bir geçişte doğrudan gerçekleştirilir. Bir sayının ikili gösterimi bir yönde kaydırılırsa, karşı tarafta boş bir
konum elde ederiz. Bu boş pozisyonun nasıl doldurulacağına dair genellikle üç olasılık vardır: boş bitleri 0 veya 1
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
ile doldurabiliriz veya diğer taraftaki sayının ikili gösteriminden kaydırılan bitleri sarabiliriz. Son olasılık, ikili sayıyı
döndürmeye eşdeğerdir.
Kullanılan tekniğin seçimi operatörün uygulamasına ve uygulamaya bağlıdır. Çoğu durumda, hızlı bir çarpma veya
bölme gerçekleştirmek için bit kaydırma kullanılır. Bu uygulama için doğru sonuçları elde etmek için boş bitleri 0
ile doldurmamız gerekir. Sadece negatif bir sayının 2'ye bölünmesi durumunda sol bitleri 1 ile doldurmamız
gerekir, çünkü negatif bir sayı, pozitif sayının ikiye tümleyeni olarak temsil edilir, yani işaret biti 1'dir. Bu şekilde
bit kaydırma uygulamanın sonucu aşağıdaki formülde gösterilmektedir:
Çarpma ve bölme için bit kaydırma kullanımına örnekler. Alttaki örneğin, bir baytın -128 ile +127 arasında bir sayıyı
temsil ettiği bir imzalı bayt kuralı kullandığını unutmayın.
// Görüntüyü yükle
Bitmap image = new Bitmap(pictureBox1.Image);
pictureBox2.Image = shiftedImage;
return shiftedImage;
}
// Pikselleri topla
int red = pixel1.R + pixel2.R;
int green = pixel1.G + pixel2.G;
int blue = pixel1.B + pixel2.B;
return overlappedImage;
}
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Ödev 5: Resmi anahtar resim ve anahtar sayı ile şifreleyerek gönderme: Bir resmin internet üzerinden gizlenip
gönderilmesi için örnek bir algoritma geliştirin. Resmi başka bir anahtar resimle bit işlemlerine tabi tutun. Resmi
alan kişinin elinde anahtar resim bulunsun. O anahtar resmi kullanarak gizlenen resmi tekrar orijinal haline
dönüştürebilsin.
Gizlenecek Resim
Anahtar resim
GÖRÜNTÜ İŞLEME-11.HAFTA
İçindekiler
GÖRÜNTÜ İŞLEME-11.HAFTA .................................................................................................................................... 1
HOUGH DÖNÜŞÜM ALGORİTMASI (Doğru, Daire Elipslerin vb tespiti) .................................................................... 1
KARTEZYEN KOORDİNATLARDA BİR DOĞRUNUN TESPİTİ ..................................................................................... 2
Sayısal Örnek: .................................................................................................................................................... 3
DOĞRUNUN DENKLEMİNİ POLAR KOORDİNATLARDA OLUŞTURMA .................................................................... 4
Doğrunun Tespiti Programı ............................................................................................................................. 11
HOUGH TRANSFORM: CIRCLE DETECTİON .......................................................................................................... 21
Usıng Gradient Informatıon............................................................................................................................. 24
Circle Detection: R Is Not Known..................................................................................................................... 25
Referanslar....................................................................................................................................................... 26
Aşağıdaki bir resim üzerinde bisikletin tekerini oluşturan daireyi oluşturan formülasyonu bulmak istiyoruz. Yani
noktalardan oluşan bir resmin matematiğini elde etmek istiyoruz. Bunu başarabilirsek artık o bilgiyi bir çok yerde
kullanabiliriz. Artık dairenin alanını, çapını, çevresini bulabiliriz. Üzerinde eksik noktalar varsa onları tamamlayıp
yeniden çizebiliriz gibi onlarca amaç için kullanabiliriz.
Klasik Hough dönüşüm (Classical Hough transform) algoritması en yaygın olarak parametrik ifade edilebilen
doğru, daire ve elips gibi düzenli eğrileri tespit için kullanılır. Daha karmaşık bir hesaplama tekniği olan
Genelleştirilmiş Hough Algoritması (Generalized Hough algorithm) burada ele alınmayacaktır. Bu algoritmanın
en büyük avantajı resim üzerindeki boşluk ve gürültülere karşı toleranslı olmasıdır.
Bir resim içerisinde yerel olarak birbirinden bağımsız nokta (point) ve çizgiler (edge) bulunur. Bunlar içinden
hangileri bir cismin kenarına (boundary) aittir bunun belirlenmesi bu algoritmada ana hedefimizdir.
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Burada sınırları tespit edilen şeklin matematiksel modelinin (formülünün) çıkarılması esas amaçtır. Yani bitmap
bir resmi (piksellerden oluşan bir resmi), vektörel (matematiksel formülle saklanan) bir resme dönüştürmek
yapılmak istenen işlemdir. Bunun için hedeflenen cismin şekli önceden biliniyorsa bilginin çıkarılması daha
kolaydır. Yani önceden resimde daire yada line olduğu biliniyorsa buna uygun arama yapmak işi kolaylaştırır.
Eğer cismin ne olduğu bilinmiyorsa o zaman kenarları oluşturan parçalar bir seri olarak bulunup, ortaya çıkan
eğri gösterilebilir.
Aşağıdaki resmi incelediğimizde 4 noktanın hangi çizgilere ait olduğunu belirlemeye çalışsak, çok sayıda çizgi
olasılığı ortaya çıkacaktır.
Herhangi bir noktanın muhtemel bir çizgiye ait olması durumunda bu çizgiyi iki şekilde resim üzerinde
gösterebiliriz. (x,y) koordinatı çizgi üzerinde herhangi bir noktayı gösteriyorsa parametrik olarak kartezyen ve
Polar koordinatlar olarak gösterebiliriz.
Bu noktaların bulunduğu konumlar resim üzerinde (uzayında) aşağıdaki gibi gösterilebilir. Her bir nokta sonsuza
giden bir çizginin üzerindeki bir konumu temsil edecektir. Buradaki x ve y koodinatları değiştirilerek çizgi sonsuza
kadar çizilebilir.
Bu sefer denklemimizi x-y ortamından (resim uzayından) parametrelerin olduğu c-m ortamına (parametre
uzayına) dönüştürelim. Bu durumda denklemimiz y=mx + c iken c=-mx + y şekline dönüşmüş olacaktır.
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Resim üzerindeki iki noktayı alalım. Bu noktalara ait denklemleri x,y uzayından m,c uzayına dönüştürelim. Eğer A
ve B noktası ayrık uzayda (resim uzayında) (spatial domain) iki tane birbirine bağlı nokta ise bu noktalara ait
oluşturulan yeni m,c uzayındaki doğruların denklemi m,c uzayında (parametre uzayı yada Hough uzayı denir)
birbirini kesecektir.
Benzer şekilde çok sayıda sıralanmış noktalar (m,c) uzayında herbiri bir çizgiye karşılık gelir ve bunların (c=-mx +
y) denklemi içindeki m ve c değerleri aynı olacağından bu nokta üzerinde kesişeceklerdir. Farklı bir yerde
bulunan bir noktaya ait çizgi ise bu ortak noktadan geçmeyecektir.
(m,c) uzayında kesişen noktaların sayısı iki boyutlu bir dizi içinde tutulursa ortaya çıkan en yüksek değerli dizi
elemanına ait m ve c değerleri resim uzayında (x,y) bir çizginin fonksiyonundaki m ve c katsayıları olacaktır.
Böylece aranan doğrunun denklemi y=mx + c şeklinde bulunmuş olacaktır. Dizi üzerindeki elemanların
büyüklükleri belli bir eşik değer kullanılırsa az sayıda kesişimi gösteren değerler elenebilir. Böylece resim
uzayında çok kısa çizgileri ele alınmamış olur.
Sayısal Örnek:
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Cevap (GPT):
Verilen denklemlerde θ ve ρ'nin çözüm kümesini bulmak için denklemleri birleştirebiliriz:
x1 cos(θ) + y1 sin(θ) = x2 cos(θ) + y2 sin(θ)
Burada θ'yi yalnız bırakıp denklemi çözebiliriz:
x1 cos(θ) - x2 cos(θ) = y2 sin(θ) - y1 sin(θ)
( x1 - x2 ) cos(θ) = ( y2 - y1 ) sin(θ)
sin(θ) / cos(θ) = ( x1 - x2 ) /( y2 - y1 )
tan(θ) = ( x1 - x2 ) /( y2 - y1 )
θ = atan( ( x1 - x2 ) /( y2 - y1 ))
Burada atan, arktanjant fonksiyonunu temsil eder. θ'nin değerini bu şekilde bulabiliriz.
Elde edilen θ değerini herhangi bir denklemde kullanarak ρ'yı bulabiliriz. Örneğin, ilk denklemi kullanarak ρ'yı
bulmak için:
ρ = x1 cos(θ)+y1 sin(θ)
Bu şekilde θ ve ρ'nin çözüm kümesini bulabilirsiniz.
=>
Üstteki formül programda x ekseni boyunca tarama yaparak çizilir. Fakat teta sıfır olursa hata verir. Bu durumda
yani dikey çizgilerde formül değiştirilip tarama ekseni y boyunca olmalıdır. Bu durumda şu formülü kullanabiliriz.
=>
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
using System;
using System.Collections;
using System.Drawing;
using System.Windows.Forms;
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
namespace Uygulama1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
CizimAlani1 = pictureBox1.CreateGraphics();
CizimAlani2 = pictureBox2.CreateGraphics();
R = OkunanRenk.R;
CikisResmi.SetPixel(x, y, DonusenRenk);
}
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
pictureBox1.Image = CikisResmi;
DiziKesisim_Teta.Clear();
DiziKesisim_Ro.Clear();
DiziKesisim_AynisiBulundu.Clear();
DiziRafine_Teta.Clear();
DiziRafine_Ro.Clear();
DiziRafine_TekrarSayisi.Clear();
Dizi_Teta.Clear();
Dizi_Ro.Clear();
//B---------------------Grafik Çizdirme
if (ckbSinGrafiginiCizdir.Checked==true)
{
DizidekiNoktalarinSinGrafiginiCiz(); //Sinüs Grafiği--Çalışırsa hesaplamayı
yavaşlatır
}
//C---------------------
KesisimNoktalariniDiziyeAt(); //(teta, ro)
//D---------------------Grafik Çizdirme
if (ckbKesisimNoktalariniCizdir.Checked==true)
{
DizidekiKesisimNoktalariniGrafikteGoster(); //Kesişim noktalarını Grafikte çiz--
-DİREK HESAPLAMADA BURAYI KAPAT--HIZI YAVAŞLATIR
}
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
//E---------------------
KesisimDizisindenTekrarliOlanlariCikarTekrarSayisiniKaydet(); //Tekrarlı noktaları
çıkar
//F---------------------
BelliBirTekrarSayisiUzerindekiNoktalari_TetaRoDizisineAt();
//G---------------------Grafik Çizdirme
if (ckbBelliBirSayininUzerindekiKesisimleriGoster.Checked==true)
{
Belli_Bir_Sayinin_Uzerindeki_Kesisim_Noktalarini_Grafikte_Goster(); //TetaRo
dizisindeki noktalari gösteriyor.
BirbirineYakinNoktalarin_OrtalamaDegerleriniHesapla_BuDegerlerIleDiziyiYenile();
Ortalama_DiziTetaRo_Noktalarini_Grafikte_Goster();
R = OkunanRenk.R;
//ÖTELEME
int OrijinOtelemeX = 300;
int OrijinOtelemeY = 300;
//******************************
double x = 0, y = 0, TetaRadyan = 0, Ro = 0;
listBox1.Items.Clear();
double x1, y1, x2, y2;
double TetaRadyan = 0;
double TetaDerece = 0;
double Ro = 0;
Ro = x1 * Math.Cos(TetaRadyan) + y1 * Math.Sin(TetaRadyan);
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
if (ckbRoYuvarlatmaToleransi.Checked == true)
{
Ro = Math.Round(Ro, YuvarlatmToleransi_Ro);
}
DiziKesisim_Teta.Add(TetaDerece);
DiziKesisim_Ro.Add(Ro);
DiziKesisim_AynisiBulundu.Add(false);
CizimAlani2.FillEllipse(FircaKirmizi, Convert.ToInt16((Teta +
OrijinOtelemeX) * OlcekX), Convert.ToInt16((Ro + OrijinOtelemeY) * OlcekY), NoktaBuyuklugu,
NoktaBuyuklugu);
}
catch { }
}
}
DiziRafine_Teta.Add(Teta1);
DiziRafine_Ro.Add(Ro1);
k++;
}
DiziRafine_TekrarSayisi.Add(k); //Aynı noktadan kaç tane bulduysa onun
tekrar sayısı oluyor.
}
}
}
Dizi_Teta.Add(Teta);
Dizi_Ro.Add(Ro);
}
}
listBox1.Items.Add(CizgideBulunmasiGerekenMinimumNoktaSayisi + " nokta üzeri Bulunan
Cizgi Sayisi=" + Dizi_Teta.Count);
}
Karabük Üniversitesi, Mühendislik Fakültesi.........................................................................................................www.ibrahimcayiroglu.com
}
}
public void
BirbirineYakinNoktalarin_OrtalamaDegerleriniHesapla_BuDegerlerIleDiziyiYenile()
{
double Teta1 = 0, Ro1 = 0;
double Teta2 = 0, Ro2 = 0;
double FarkTeta=0, FarkRo=0;
double OrtalamaTeta = 0, OrtalamaRo = 0;
if (ToleransTeta >= 1 && ToleransRo >= 1) //Tolerans verildi ise (1 den büyükse)
diziyi ortalama değerler ile yenileyecek..
{
for (int i = 0; i < Dizi_Teta.Count - 1; i++)
{
for (int j = i + 1; j < Dizi_Teta.Count; j++)
{
Teta1 = Convert.ToDouble(Dizi_Teta[i]);
Ro1 = Convert.ToDouble(Dizi_Ro[i]);
Teta2 = Convert.ToDouble(Dizi_Teta[j]);
Ro2 = Convert.ToDouble(Dizi_Ro[j]);
Dizi_Teta[i] = OrtalamaTeta;
Dizi_Teta[j] = OrtalamaTeta;
Dizi_Ro[i] = OrtalamaRo;
Dizi_Ro[j] = OrtalamaRo;
}
}
}
}
}
}
else //Yatay çizgileri çizerken x ekseninde for döndürecek.
{
//Her Teta-Ro çifti için bir çizgi oluşturacak.Bu çizgileri nokta kullanarak
çizecek.
for (x = 0; x < 400; x++)
{
}
}
}
}
}
Referanslar
https://www.youtube.com/watch?v=XRBc_xkZREg
https://www.youtube.com/watch?v=uDB2qGqnQ1g
https://www.youtube.com/watch?v=t1GXMvK9m84
https://www.youtube.com/watch?v=4zHbI-fFIlI