Post on 27-Jul-2015
T.C.
BILECIK SEYH EDEBALI ÜNIVERSITESI
MÜHENDISLIK FAKÜLTESI
BILGISAYAR MÜHENDISLIGI
Özellik Çıkartımı Ile Karakter Tanıma
ÖGRENCININ ADI SOYADI:Mustafa KÖSTEK
PROJE 2 ÇALISMASI
15 Ocak 2015
BILECIK
T.C.
BILECIK SEYH EDEBALI ÜNIVERSITESI
MÜHENDISLIK FAKÜLTESI
BILGISAYAR MÜHENDISLIGI
Özellik Çıkartımı Ile Karakter Tanıma
ÖGRENCININ ADI SOYADI:Mustafa KÖSTEK
PROJE 2 ÇALISMASI
15 Ocak 2015
BILECIK
ÖZET
Projenin Amacı
Görüntü isleme,makine ögrenmesi algoritmalarıyla ne derece basarılı oldugunun yanı sıra
özellik çıkartma algoritmamızında geçerliliginin ölçümünü yorumlayacagız.Karakter ta-
nıma için segmentli geometrik tabanlı özellik çıkartma algoritması kullanılmıstır. [1]
Projenin Kapsamı
Öncelikle matlab ile görüntülerin özellik vektörleri çıkartılacak sonra ise excel ile özel-
lik vektörüne bir alan daha ekleyerek hangi sınıfa ait oldugu bilgisi eklenecektir.Her ka-
rakterin özellik vektörleri matris haline getirilip alan bilgisi eklendikten sonra weka ile
islenerek hangi yöntemin daha yüksek basarı gösterdigi tespit edilecektir.
Sonuçlar
Sonuç olarak hangi sınıflandırma yönteminin karakter tanımada daha yüksek basarı sag-
ladıgı tespit edildi.
2
ABSTRACT
Project Objective
Image processing, machine learning algorithms, as well as how successful that will de-
termine the validity of feature extraction algorithm.The segment is used for character
recognition algorithm based on geometric feature extraction.
Scope of Project
First, if the feature vectors images with MATLAB will be removed after the information
that belongs to which class feature vectors by adding a field to excel will be added.After
you add the feature vectors brought into the information matrix for each character which
method of treatment will be determined by weka showed higher achievement.In this re-
gard, using the chain algorithm performed exactly as in other studies carried out over the
mapping studies are available.
Results
Finally, in recognition of character classification method which has been found to provide
higher performance.
3
TESEKKÜR
Bu projenin basından sonuna kadar hazırlanmasında emegi bulunan ve beni bu konuya
yönlendiren saygıdeger hocam ve danısmanım Sayın Emre Dandıl’a tüm katkılarından ve
hiç eksiltmedigi desteginden dolayı tesekkür ederim.
Mustafa KÖSTEK
15 Ocak 2015
4
Içindekiler
ÖZET 2
ABSTRACT 3
TESEKKÜR 4
SIMGE LISTESI 7
SEKIL LISTESI 8
TABLO LISTESI 9
1 Giris 10
1.1 OCR nedir? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.1.1 Optik Karakter Tanıma (OCR) Neleri Kapsar? . . . . . . . . . . . 10
1.1.2 Optik Karakter Tanıma (OCR) Nasıl Çalısır? . . . . . . . . . . . 10
1.1.3 Optik Karakter Tanıma (OCR) Sistemlerini Kimler Kullanır? . . 11
1.2 Projenin Amacı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2 Karakter tanıma 13
2.1 Ikili görüntüye dönüstürme isleme . . . . . . . . . . . . . . . . . . . . . 13
2.2 Görüntü esikleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3 Görüntü kesitleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.4 Iskeletleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.5 Alt bölgeleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.6 Baslangıçlar,kesisimler ve minör baslangıç bölgeleri . . . . . . . . . . . . 14
2.6.1 Baslangıçları . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.6.2 Kesisimler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.6.3 Minör baslangıçları . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.6.4 Karakter çapraz geçisleri . . . . . . . . . . . . . . . . . . . . . . 16
2.7 Digerlerinden ayıran çizgi sekmanları . . . . . . . . . . . . . . . . . . . 17
2.8 Özellik çıkartımı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5
2.9 Fonksiyon ve altfonksiyonlar . . . . . . . . . . . . . . . . . . . . . . . . 21
2.10 Örnekler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.11 Sınıflandırma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.11.1 Görüntüler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.11.2 Weka’da ne yapılacak? . . . . . . . . . . . . . . . . . . . . . . . 28
2.11.3 Verilerin arff formatına uydurulması . . . . . . . . . . . . . . . . 28
3 Deneysel Çalısmalar 29
3.1 Verilerin analizinin gerçeklenmesi . . . . . . . . . . . . . . . . . . . . . 29
3.2 Alanların minimizasyonu . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.3 Bayes Agları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.4 j48 agaç . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.5 Çok katmanlı algılayıcılar . . . . . . . . . . . . . . . . . . . . . . . . . . 34
SONUÇLAR 36
4 DENEYSEL SONUÇLAR 36
KAYNAKLAR 37
EKLER 38
4.1 feature extractor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.2 Line Classifier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.3 Line segmenter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.4 find neighbours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.5 find direction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.6 ismymember . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.7 starter intersection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.8 Isnotintersection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.9 isnotempty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
ÖZGEÇMIS 66
6
Sekil Listesi
1 8 bitlik derinlige sahip görüntünün esikleme sonra görüntü fonksiyonu . . 13
2 Orjinal görüntü ve iskeletleme (2) nolu ifade uygulandıktan sonra . . . . . 14
3 Sırasıyla görüntüde soldan saga baslangıç,kesisim ve minör baslangıçları . 16
4 Yön kurallarını uygulamadan önce. . . . . . . . . . . . . . . . . . . . . . 18
5 Özellik çıkartımı algoritmasındaki altfonksiyonlar . . . . . . . . . . . . . 21
6 50x50 lik görüntüler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
7 Sekildeki kalibrasyonlar olusturuldu . . . . . . . . . . . . . . . . . . . . 27
8 Dörrt degerlerinden olusan kalibrasyonlar . . . . . . . . . . . . . . . . . 27
9 Matlabtaki görüntü özelikleri . . . . . . . . . . . . . . . . . . . . . . . . 28
10 Hesap tablosunda csv verisine uyarlama . . . . . . . . . . . . . . . . . . 28
11 Arff dosya formatı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
12 Arff uzantılı dosya seçme . . . . . . . . . . . . . . . . . . . . . . . . . . 29
13 Sınıflandırma yöntemi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
14 Bayes aglarıyla cross edilmis 1650x85 verinin karmasıklık matrisi . . . . 30
15 Alan seçme algoritması arayüzü . . . . . . . . . . . . . . . . . . . . . . 30
16 Hangi alan sınıflandırmayı ne kadar etkiliyor? . . . . . . . . . . . . . . . 31
17 Filtreleme tipi seçme . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
18 Görüldügü gibi gözle görülür bir azalma söz konusu . . . . . . . . . . . . 32
19 Bayes sınıflandırıcısı . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
20 Dikey olarak belirli alan kısıtları . . . . . . . . . . . . . . . . . . . . . . 32
21 Bayes Karmasıklıgı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
22 Agaçın veri kümemize ait genellemesi . . . . . . . . . . . . . . . . . . . 33
23 Agaç algoritmasının karmasıklık matrisi . . . . . . . . . . . . . . . . . . 34
24 Katmanlar ve döngü sayıları gösterilmis . . . . . . . . . . . . . . . . . . 34
25 ÇKA’nın karmasıklık matrisi . . . . . . . . . . . . . . . . . . . . . . . . 34
26 Radyal tabanlı sinir agıyla . . . . . . . . . . . . . . . . . . . . . . . . . . 35
8
Tablo Listesi
1 Temsili bir örnek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2 Çaprazlık iliskileri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3 Binari olarak gösterilmis basit bir a . . . . . . . . . . . . . . . . . . . . . 22
4 Görüntünün öznitelik olarak bit dogrultularının kodlanması . . . . . . . . 23
5 Soldan saga lokalde çizgi tipi tayini . . . . . . . . . . . . . . . . . . . . 23
6 Öznitelik vektörleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
7 Binari gösterimli bir k . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
8 Yön tayini yapılmıs bir k . . . . . . . . . . . . . . . . . . . . . . . . . . 24
9 Öznitelik vektörleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
10 ikili gösterilmis bir g . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
11 Homojen bölünmüs bir g harfi ve piksel dogrultuları belirtilmis . . . . . . 25
12 Öznitelik vektörleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
13 Veri kümemizin çapraz geçerleme neticesinde sınıflandırma oranları . . . 36
9
1 Giris
1.1 OCR nedir?
Optik Karakter Tanıma (OCR), elektronik görüntüler üzerindeki karakterlerin ya da metin
bilgilerinin okunarak ASCII koda dönüstürülmesi islemidir. OCR metodolojileri kullanı-
larak makineler tarafından yazılmıs karakterler, elyazısı karakterler ve isaretler kolaylıkla
okunup ASCII koda dönüstürülebilirler. OCR, makineler tarafından yazılmıs karakterle-
rin okunup tanınmasında kullanılan teknolojidir. ICR (Intelligent Character Recognition)
ise elyazısı karakterlerin okunup tanınmasında kullanılan teknolojidir.
1.1.1 Optik Karakter Tanıma (OCR) Neleri Kapsar?
OCR iki sınıfa ayrılır:
Otomatik Karakter Tanıma (ADC-Automatic Character Recognition ) ve metin tanıma
(TR-Text Recognition). ADC ile her karakter dogru olarak tanınır ve karsılıgında bir AS-
CII kod atanır. Örnegin; OCR ile bir çek üzerindeki resmi olmayan miktar alanı tanınıp,
MICR teknolojisi ile kodlanarak bir bankacılık sisteminde islenebilir. Para alanı ise ge-
nelde elyazısı ile doldurulur ve bu karakterler sınırlı bir dogrulukla tanınabilirler. Bir ADC
uygulamasında, basarılı bir tanımanın göstergesi %99.98 tanıma dogruluk derecesine ula-
sılmasıdır. ADC sürecinin baslangıcında bu deger genellikle daha düsüktür ve ardından
yapılan görüntü isleme algoritmalarıyla yükseltilir.
Bazı durumlarda, full text search islemi gerçeklestirmek için, verilen bir sayfa üzerindeki
metnin TR OCR ile tanınması gereklidir. Burada OCR makine yazısı olan alfanümerik
karakterlerin tanınmasında kullanılır. TR ile ise sözlükler de kullanılarak cümlelerin içe-
rikleri de karakter tanımaya etkide bulunur.
1.1.2 Optik Karakter Tanıma (OCR) Nasıl Çalısır?
Karakterlerin tanınmasında birkaç OCR metodolojisi kullanılır. Bunlar arasında topolojik
tabanlı olan, yapay sinir aglarına dayanan, matris esleme ile gerçeklesen, öznitelik ana-
lizi ile çalısan ve egrileri izleyerek karakter tanıma islemini gerçeklestiren metodolojiler
yer almaktadır. Karakterlerin daha büyük dogrulukla tanınması için, okunan verilere ön
10
isleme ve son isleme algoritmaları uygulanmaktadır. Bu algoritmalar, formların belirlen-
mesinde, formlar üzerindeki belirli alanların silinmesinde, form ve karakterlerin düzeltil-
mesinde (deskew) ve görüntünün iyilestirilmesinde kullanılırlar. Karakterlerin büyük dog-
rulukla okunmasında, sisteme sunulan elektronik görüntünün mümkün oldugunca keskin
(sharp), temiz ve düzgün olması oldukça büyük önem tasımaktadır. Buna ragmen, günlük
yasamda kullanılan dokümanlar ve formlar genellikle kirli, yıpranmıs ve katlanmıstırlar.
Tanıma isleminden önce uygulanacak ön isleme algoritmaları ile formun elektronik gö-
rüntüsü temizlenir ve karakterler mümkün oldugunca iyilestirilir.
Karakterlerin tanınması sırasında, kullanıcı tarafından kabul edilmeyen ya da dogruluk
kriterini yakalayamayan karakterler reddedilmelidir (tanınmıyor olarak degerlendirilme-
lidir). Örnegin dogruluk kriteri olarak % 99.98 kabul edilirse, dogru olmadıgı kabul edilen
birçok karakter reddedilecektir. Eger dogruluk kriteri daha asagı sınırlara çekilirse, tanı-
nan karakter sayısı artacaktır. Buna ragmen % 99 oranındaki dogruluk kriterleri sıklıkla
kullanılmaktadır.
Içinde OCR tarafından okunamayan karakterler de bulunan reddedilen karakterler dogru-
lukla belirlenebilmelidir. Bu islem genelde karakterin ekrana getirilerek el ile girisi yapıl-
ması süreci ile gerçeklestirilir.
Dogrulugu iyilestirmenin en son basamagı ise OCR ya da el ile girisi yapılmıs tüm karak-
terlerin islenmesi, dogrulugunun istenilen kriteri yakaladıgının sınanması ya da kullanıcı
gereksinimini karsılayıp karsılamadıgının belirlenmesidir. Son isleme islemleri ile sözü
edilen son basamak gerçeklestirilebilir. Ticari olarak var olan algoritmalar ile bu adım
kolaylıkla uygulanabilir. Verinin arıtılması adı da verilen bu islemler, karakter tanımadaki
dogrulugu büyük oranda arttırmaktadır.
1.1.3 Optik Karakter Tanıma (OCR) Sistemlerini Kimler Kullanır?
Günümüzde, doküman isleme islemleri ile ilgilenen kisiler, operasyon maliyetlerini dü-
sürmek ve verimlilik oranlarını arttırmak isteyen her kullanıcı OCR ya da ICR teknoloji-
lerini göz önüne alırlar.
OCR teknolojisi sıklıkla su alanlarda kullanılır :
Masaüstü Yayıncılık
Mahkemelerle Ilgili Alanlar
11
Vergilendirme ve Tahsilat
Personel Kayıt Yönetimi
Nüfus Sayımı Formlarının Islenmesi
Çek Isleme
Ödeme Isleme
Emekli Fonu Isleme
Siparis Isleme
Tıbbi Istekler
Günümüz ekonomisinde, elektronik doküman yönetimi sistemlerinin, hem is dünyasında
hem de devletin yönetim mekanizmalarında, görüntüleme ve OCR teknolojilerini birlikte
kullandıklarını görebiliriz. Içinde yasadıgımız çalkantılı, dinamik ve maliyetlerin önem
tasıdıgı günümüz çalısma ortamlarında, OCR ile tanıma islemleri görüntüleme teknolojisi
ile birlestirilerek 21. yüzyıla geçiste kullanılan önemli bir basamaktır.
1.2 Projenin Amacı
Özellik çıkartım yöntemleri görüntü islemenin temelini olusturan bir alandır.Bu sayede
biz uzun uzadıya bit eslemesi yapmaya gerek kalmadan belirli büyüklükteki parçalara
ayırıp parçalardaki bitlerin ne sekilde dagıldıgını o bölgeyi karakterize eden deger kü-
melerinde tutarak vektörel degerler elde edip bilgisayarın islem yapması kolaylastıracak-
tır.Bizde görüntü isleme yöntemi olarak bu yöntemden yararlanıp vektörleri makineye
ögretip test ederek yöntem basarılarını ölçecegiz[1].
12
2 Karakter tanıma
2.1 Ikili görüntüye dönüstürme isleme
Görüntü isleme yöntemleri kullanılarak çesitli islemler neticesinde [2] belirli katsayılar
elde edecegiz.Ama öncelikle 8 bit derinligine sahip görüntümüzü gri sonra ise ikili for-
mata (1)’nolu fonksiyonla gerçeklestiriyoruz.
im2bw (1)
2.2 Görüntü esikleme
Görüntü esikleme yaparak görüntüdeki gürültü(noise) etkilerinden çikartmamizi saglar
esikleme yapilan bir görüntünün fonksiyonu asagıdaki gibi olmalıdır[3].Uygulama alan-
ları biyomedikal,cografi vb.Örnek olarak Sekil 1 gösterilmistir.
Sekil 1: 8 bitlik derinlige sahip görüntünün esikleme sonra görüntü fonksiyonu
2.3 Görüntü kesitleme
Girilen karakterlerin sagdan soldan asagıdan ve yukarıdan çerçeveleyerek görüntünün is-
lem yapılmayacak bitlerini bir nevi süzgeçliyoruz.Bu sayede islemlerimize dahil olmaya-
cak verilerden kurtulup görüntü indirgenmesini gerçeklestirdik.
2.4 Iskeletleme
• Biyolojinin canlıların sekil ve yapıları ile ilgilenen dalına morfoloji (biçim bilim)
adı verilmektedir.
13
• Matematiksel morfoloji ise temel küme islemlerine dayanan, imgedeki sinirlar (bor-
ders), iskelet (skeleton) gibi yapıların tanımlanması ve çıkartılması, gürültü gide-
rimi, bölütleme gibi uygulamalar için gerekli bir araçtır[4].
• imge islemede genellikle, morfolojik süzgeçleme, inceltme (thinning), budama (pru-
ning) gibi ön/son islem olarak da sıkça kullanılırlar.
• Gri tonlu imgeler üzerinde de yapılabilecegi gibi, genellikle ikili imgeler üzerinde
yapılan islemlerdir örnek olarak sekil 2 ’de gösterilmistir.
image = bwmorph(image,′ skel′, inf); (2)
Sekil 2: Orjinal görüntü ve iskeletleme (2) nolu ifade uygulandıktan sonra
2.5 Alt bölgeleme
Bu asamada ise artık ilgili resim çerçevelerini belirli büyüklükler halinde parçalara ayı-
rarak her resim için esit alana bölerek o alana ait öznitelik çıkartımı yapılacaktır.Bizim
algoritmamızda 3x3 sekilde yani 9’a bölünmüstür.
2.6 Baslangıçlar,kesisimler ve minör baslangıç bölgeleri
Belli bir bölgede farklı çizgi parçaları ayıklamak için, bu bölgede tüm iskeletten elde
edilir.Bu amaçla,karakter iskeletinde bazı baslangıç pikselleri,kavsaklar ve minör baslan-
gıçları olarak tanımlanır.
14
2.6.1 Baslangıçları
Karakter iskeletinde bir komsusu olan piksel bulunur.Karaktere girmeden önce, belirli bir
bölgedeki tüm baslangıçlarda bulunan ve bir liste halinde tutulur.
2.6.2 Kesisimler
Kesisimlerin tanımlaması bazan daha da karmasıktır.Bir kesisim olması için bir piksel
için gereklidir fakat bir kriterde birden fazla komsuya sahip olması istenilen durum de-
gildir.Dogru komsular denilen yeni bir özellik, her piksel için tanımlanır.Belirli piksel
için de komsu sayısına dayanarak, bir kesisme ya da kesisme olmayan olarak sınıflandı-
rılır.Bunun için dogrudan piksel ve çapraz piksel olmak üzere komsu pikseller iki kate-
goriye ayrılır.Dogrudan pikselin yatay ve dikey yönde kesisim pikselinin bölgede tüm bu
piksellerle baglantısı vardır.Çapraz piksel ilgili piksele bir çapraz yönde oldugu bölgede
olan pikseldir.Simdi göz önünde bulunan pikselde dogru komsularının sayısını bulmak
için, o karakter iskeletindeki sahip komsularının sayısına baglı olarak sınıflandırılacaktır.
Ele alınan piksellerde su sekilde sınıflandırılır
• 3 komsu: Direkt piksellerin hepsi bir çapraz piksele herhangi birisine bitisik degilse,
o zaman, söz konusu pikselin komsu piksellerinin eger hiçbirinin kesistigi ardından
birbirine komsu olan baska piksel varsa, bir kesisme olamaz.
• 4 komsular: Her direk pikselin bir komsu çapraz piksel veya tersi varsa, ardından
söz konusu pikselin bir kesistigi olarak kabul edilemez.
• 5 veya komsular: Göz önüne alındıgında pikselin bes veya daha fazla komsuları
varsa, o daima bir kesisme olarak kabul edilir.
Tüm kesismeler görüntüde tanımlandıktan sonra, daha sonra bir liste halinde doldurulur.
2.6.3 Minör baslangıçları
Minör baslangıçlar karakter iskelet birlikte çapraz geçisi süresince birlikte bulunur.Göz
önüne alındıgında pikselin ikiden fazla komsuları ne zaman olusturulur.Olusabilir iki ko-
sul vardır
15
• Kesisme:Geçerli bir kesisme oldugunu ne zaman anlarız.Mevcut hat segment sona
erecek ve tüm ziyaret edilmemis komsuları minör baslangıçlar listesinde dolduru-
lacaktır.
• Göz önüne alındıgında pikselin ikiden fazla komsuları ama yine de onun olmayan
bir kesisme ile gereken durumlar olusabilir.Bu gibi durumlarda, çapraz geçisi mev-
cut yönü önceki pikselin konumu kullanarak bulunur.Bölgesinde yer gezilmemis
piksellerinin hiçbir bu yönde ise, o zaman bir sonraki piksel olarak düsünülmüs ve
bütün diger pikselleri, minör baslangıçlar listesinde doldurulur.Piksellerin hiçbiri
çapraz geçisi geçerli yönünde degilse, o zaman geçerli segment bitirilir ve bölge-
sinde yer alan bütün pikselleri minör baslangıçlar listesinde doldurulur.Genel olarak
gösterimi sekil 3’daki gibidir.
Sekil 3: Sırasıyla görüntüde soldan saga baslangıç,kesisim ve minör baslangıçları
2.6.4 Karakter çapraz geçisleri
Bölgeleme resmin üzerine yapıldıktan sonra karakter çapraz geçisi baslar.Her bir bölge
ayrı ayrı hat kesimleri çıkarma islemine tabi tutulmaktadır.Bu amaçla, ilk olarak bölgede
baslangıçlar ve kesismeler bir listede doldurulur sonra bölgeye dahil edilir.Minor bas-
langıçlar çapraz geçisi süresince birlikte bulunur.Algoritma baslangıçlar listesini dikkate
alarak baslar.Tüm baslangıçlar islenir sonra, bu sekilde elde edilen minör baslangıçlar is-
lenir.Bu islem sırasında elde edilen tüm hattı segmentlerinin her biri çizgi parçası piksel
pozisyonları ile saklanır.Görüntüdeki bütün pikselleri dolasıldıktan sonra, algoritma du-
rur. Bir örnek Asagıdaki Tablo 1 algoritma daha önce açıklananları örneklemektir. Tek
tek hat kesimleri belirledik hangi bir karakteri iskeleti olacak sekilde düsünün.Sol üst kö-
sedeki piksel (1,1) olarak numaralandırılmıs ve numaralandırma matrisler için standart
16
1 0 0 0 10 1 0 1 00 0 1 0 00 1 0 1 01 0 0 0 1
Tablo 1: Temsili bir örnek
kuralı vs. varsayılır.Bu görüntüdeki Baslangıçlar listesi [(1,1), (1,5), (5,1), (5,5)] olacak-
tır.Kesisme sadece piksel (3,3) ihtiva edecektir.Simdi algoritma ilk baslangıç örnegin (1,1)
isleyerek baslar.Bir sonraki piksel (2,2) ve, bundan sonra da, (3,3) ’dir.Piksel (3,3) bir ke-
sisim oldugunu, bu nedenle algoritma o andaki bölümünü durur ve minör baslatıcı tüm
komsularını tanımlar.Yani minör baslatıcı listesi [, (2,4) (4,2) (4,4)] ihtiva edecektir.simdi
olusan çizgi segmenti [, (2,2) (1,1) (3,3)] içerecektir.Simdi bir sonraki baslangıç örne-
gin (1,5) olarak kabul edilir.Sonraki piksel (2,4) ’dir. Algoritma akımı durdurur, böylece
piksel (2,4) küçük bir baslangıç oldugunu herhangi olup olmadıgını burada bölümlü ve
minör baslatıcı gibi, (2,4), tüm gezilmemis komsularını tanımlar. O ziyaret edilen andan
baslayarak aynı zamanda (2,4), minör baslatıcı listeden kaldırılır.Simdi bir sonraki bas-
langıç (5,1) olarak kabul edilir ve bu sekilde olusturulan bir sonraki çizgi parçası [(5,1),
(4,2)] olacaktır.Pixel (4,2) baslayanlar listeden kaldırılacaktır.Benzer bir sekilde, bir son-
raki çizgi parçası [(5,5), (4,4)] olabilir.Yani sonuçta, toplam 4 hat bölümü olacak.
2.7 Digerlerinden ayıran çizgi sekmanları
Çizgi parçası görüntüden ekstre edildikten sonra, bunlar su dogru tiplerinin herhangi bi-
rine sınıflandırılabilmesi gerekir.
• Yatay çizgi
• Dikey çizgi
• Sag çapraz çizgi
• Sol çapraz çizgi
Bunun için, bir yön vektörü her hat türünü belirlemede yardımcı olacak her satır segmen-
tinde elde edilir.Bunun için, alısılmıs bir söz konusu 3x3’lük bir matris merkezi piksel
17
4 5 63 C 72 1 8
Tablo 2: Çaprazlık iliskileri
göre Tablo 2’daki gibi isimlendirme kuralı olursa bir komsu piksel konumunu tanımlana-
bilir.
Verilen, matris içinde "C" merkez pikseli temsil eder.Komsu pikseller merkez pikselin al-
tındaki pikselden baslayarak saat yönünde numaralandırılır.Bir çizgi diliminden yön vek-
törü ayıklamak için, algoritma onlar çizgi segmentini olusturan sırayla çizgi segmentlerde
tüm pikselleri dolasır.Örnegin, çizgi parçası [(1,1), (2,2), (3,3), (4,4)] düsünün.Birinci
piksel (1,1) geçerli orta piksel olarak kabul edilir.Bu merkezi bir piksel ile ilgili olarak,
(2,2),83 bir konumda bulunmaktadır.Yön vektörünün ilk giris 8 olacak.Daha sonra, piksel
(2,2), merkezi bir piksel olarak kabul edilir. Artık (3,3), bu piksel göre 8 konumunda aynı
zamanda.Yani yön vektörünün ikinci girisi de 8 olacaktır.Bu sekilde gidis, verilen çizgi
segmenti için yön vektörü (8,8,8) olacaktır.Kurallar yukarıda set tüm çizgi parçaları ta-
nımlamasına ragmen, bir sakıncası ’V’ ye de döndürülmüs varyasyon seklinde kesimleri
tek bir satır segmenti olarak algılanabilir olmasıdır.Iki tamamen farklı çizgi parçaları olu-
suyor olsa da örnegin, ’A’ verilen karakteri sekil 4 gibi belirgin bölüm tek satır segmenti
olarak algılanır.
Sekil 4: Yön kurallarını uygulamadan önce.
Bu tür hataları önlemek için, kurallar yeni bir dizi yön vektörü çıkarımı yapıldıktan sonra,
kurallar yeni bir dizi içine yeni çizgi parçalarını bulmak için her yön vektörü uygulanıp
tespit edilerek semada verilen segmenti uygulanır.Yönü vektör yeni hat kesimlerini bul-
mak için asagıdaki kurallara tabi tutulur.
• Önceki yön 6 veya 2 oldu VE sonraki yönü 8 veya 4 ya da.
18
• Önceki yön 8 veya 4 VE sonraki yönü 6 veya 2 ya da.
• Bir çizgi parçası dogrultusu yönü ya da en fazla üç tip degistirildi.
Resimde isaretlenmis çizgi segmenti yön kuralları son açıklanan uygulamadan önce elde
edilmistir.Bu çizgi parçası aslında iki farklı çizgi parçası olusturmasına ragmen, biri al-
gılanacaktır.Ama kurallar uygulandıktan sonra burada açıklanan yönünü,iki hat türü ayırt
edecektir.Yeni bir çizgi parçası tespit edilirse, o zaman vektörü bu noktada, iki farklı vek-
törlere, ayrılır.Simdi asagıdaki kurallar her yön vektörü sınıflandırmak için tanımlanmıs-
tır.
• Olusan maksimum yönü tip 2 veya 6 ise, çizgi tipi dogru sag çaprazdır
• Olusan maksimum yön tipi 4 ya da 8 ise, çizgi tipi sol çapraz bırakılır
• Olusan maksimum yönü tip 1 veya 5 ise, ince çizgi tipi dikey
• olusumlu yön tipi 3 veya 7 ise, çizgi tipi yatay oldugu kansına varılır
Iki çizgi türü aynı sayıda olusursa bu iki segmentin çizgi tipi olarak kabul edilir ve arasın-
dan,o yön türü birinci olarak saptanır.
2.8 Özellik çıkartımı
Her segmentin çizgi tipi belirlendikten sonra, özellik vektörü bu bilgilere dayanarak olus-
turulmustur. Her bölge kendisine karsılık gelen bir özellik vektörü tutar.Kullanılan algo-
ritma 9 tane deger üretmektedir her bir bölge için..
Bunlar
• Yatay çizgilerin sayısı
• Tüm yatay çizgilerin normalize uzunlugu
• Dikey çizgilerin sayısı
• Tüm dikey çizgilerin normalize uzunlugu
• Sag çapraz çizgiler sayısı
19
• Tüm sag çapraz çizgiler normalize uzunlugu
• Sol çapraz çizgiler sayısı
• Tüm sol çapraz çizgiler normalize uzunlukları
• iskelet normalize Alanı.
• Herhangi bir özel hat türü sayısı
asagıdaki yöntemi degeriyle standardize edilir.
deger = 1− ((cizgiSayisi/10) ∗ 2)
Herhangi bir özel hat türü normallestirilmis uzunlugu asagıdaki yöntem kullanılarak bu-
lunur.
uzunluk = (tumPikseldekiCizgiler)/(bolgedekiP ikseller)
Özellik vektörü burada açıklanan her bölge için özel çıkartımla elde edilir.N bölgeleri
varsa yani, her bölge için özellik vektörü olarak 9N unsurlar olacaktır.Önerilen sistem,
orijinal görüntü ilk olarak görüntü matrisi bölünmesi ile 9 bölgeye zonlanır.Özellikleri,
daha sonra her bir bölge için çıkartım eldelenmistir.Yine orijinal görüntü yatay dogrultuda
bölünmesi ile 3 bölgeye ayrılmıstır.Sonra özellikleri gibi her bölge için çıkarıldı.Bölgeli
özelligi çıkarımı yapıldıktan sonra, bazı özellikler yani bölgesel özelliklerine göre, tüm
görüntü için ekstre edilmistir.9 bölgeden 9 özellikten 81 özellik yapar ek olarakta 3 tane
özelik çıkartılır bu üç özelik sırasıyla:
• Euler Sayısı: Bu resimde deliklerin nesneleri sayısı farkı ve sayı olarak tanımla-
nır.Örnegin B’de iki delik bir nesne var nesneSayisi−deliksayisi’dan -1 aynı sey
A için ise 1− 1 = 0 olarak elde edilecektir.
• Bölgesel Alanı: görüntüdeki piksellerin toplam sayısına iskelette piksel sayısına
oranı olarak tanımlanmaktadır.
• Eksantriklik: Bu resmin iskeletini uygun en küçük dıs merkezli elips olarak tanım-
lanır.
20
2.9 Fonksiyon ve altfonksiyonlar
Programın anlasılabilirligi ve kod kısımlarının tekrar tekrar yazılmasınında önüne ge-
çilebilmesi için islevler seklinde olusturulmustur. sekil 5’de fonksiyonlar hiyerarsik bir
sekilde gösterilmistir.
Sekil 5: Özellik çıkartımı algoritmasındaki altfonksiyonlar
Bu fonksiyonlar özetle yazacak olursak:
feature extractor Ana fonksiyonumuz parametre olarak görüntü çıktı olarak 85 uzunluklu vektör çıktı
verir.
discourser Görüntüde gereksiz pikselleri karaktere çerçevelemeye yarayan fonksiyon
line classifier Çizgi sınıflandırıcı parametre olarak 9 parçaya ayrılmıs görüntüyü parça parça alır
geriye 9 deger döndürür
prep image görüntüdeki gürültüleri gidermeye yöneliktir
line segmenter Çizgilerin komsuluklarına,kesisimlerine ve minör durumları silme ekleme islemleri
yapılır
finddirection Aldıgı iki degere göre yönünü belirleyen fonksiyondur
isnotempty Parametre olarak aldıgı matris bossa sıfır degilse bir degeri cevaplar
del pixel Piksel silme metodu
21
isnotmember Üyesi degil mi?
findneighbours Piksellerin komsuluklarını arayan fonksiyondur
ismymember üyesi mi?
starter intersection Kesisim bölgesi baslangıcı mı?
2.10 Örnekler
Buraya kadar sürekli olarak teoriden bahsedildi,simdi birkaç örnekle kavrayalım[5].Öncelikle
görüntü gray seviye,esiklenir ve lojik 1 ve 0’a dönüstürülür.Tablo 3 görüldügü gibi.
11 1
1 11 1
1 1 1 1 1 1 1 11 1 1
1 11
Tablo 3: Binari olarak gösterilmis basit bir a
Iste en önemli kısım geliyor burada:
1. Satırlar homojen olarak 3*3’lük matris gibi 9 parçaya homojen olarak ayrılıyor.
2. Pikseller sol asagıdan baslanarak önündeki yada ziyaret edecegi piksele göre dog-
rultu alıyor. Bunlar;
Yatayı,
Dikeyi,
Sag çapraz,
Sol çapraz
kesisim olarak ifade edilir.Bu asama sonucunda esit bölünmüs parsellerde nite-
liklerin sayısına bakılır en çok olan bölgenin mümessili seçilir.Ya da bölge görün-
tüden bagımsız düsünülerek bölgesel piksel dagılına göre yorumlanır.Tablo 5 örnek
olarak gösterilebilir.Ikili a’nın niteliksel gösterimi Tablo 4 gibidir.
22
43 4
3 42 25 1 1 1 1 5
3 43 4
4
Tablo 4: Görüntünün öznitelik olarak bit dogrultularının kodlanması
1 . . . . . .1 4 3
1 3 31 2 3
1 4 31 3 3
1 3 31 2 3
Tablo 5: Soldan saga lokalde çizgi tipi tayini
Bu asamadan sonra ise artık 9’luk vektörlere sıra geldi niceliklere adet 1−(2∗cizgiT ipiAdet)/10
,ile uzunluk ise cizgiT ipUzunluk/BolgedekiToplamCizgiAlani ile dokuzuncu degerse
bolgedekiToplamCizgiAlani/bolgedekiToplamAlan olarak ifade edilmistir.
y.adet y.uzun d.adet d.uzun sa.adet sa.yatıkuzun soyatadet soyatuzun alanoranı1 0 1 0 0.8 0.5 1 0 0.1671 0 1 0 1 0 0.8 0.67 0.25-1 -1 -1 -1 -1 -1 -1 -1 -11 0 1 0 0.8 0.25 1 0 0.33
0.8 0.8 1 0 1 0 1 0 0.416-1 -1 -1 -1 -1 -1 -1 -1 -1-1 -1 -1 -1 -1 -1 -1 -1 -1-1 -1 -1 -1 -1 -1 -1 -1 -11 0 1 0 1 0 0.8 0.5 0.167
Tablo 6: Öznitelik vektörleri
Yukarıda görüldügü gibi Tablo 6’da katsayılar gösterilmektedir bölgeler sol yukarıdan sag
asagı dogru takip edilerek degerler yazılmıstır.Yani herbir satır bir bölgeye denk gelmek-
tedir.Ayrıca -1 degerleri o bölgede hiç olmayan[6],bir piksel yada birbirinden bagımsız
iki pikseli ifade eden bölgelerde özelik olarak 9 tane -1 basılır.
23
1 0 0 0 0 11 0 0 0 1 01 0 0 1 0 01 0 1 0 0 01 1 0 0 0 01 0 1 0 0 01 0 0 1 0 01 0 0 0 1 01 0 0 0 0 11 0 0 0 0 01 0 0 0 0 0
Tablo 7: Binari gösterimli bir k
Tablo 7’de gösterilen K harfini ifade eden binary matrisle Tablo 8 de farkedilmesede bir
önceki Tablo 3 ve 4 kolaylık farkedilecek bir operasyon var bunlar;
• satır ve sütunun 3’e bölünmesi amacıyla yanlardan yada alttan üstten sıfır ekleme
islemi,
• morfolojik islem yardımıyla görüntüyü erozyona ugratarak iskeleti [7] çıkartılıyor
böylelikle pikseller arası yön tayini karısıklıktan kurtulmus olunuyor.
2 32 32 32 35 52 42 42 42 42 22
Tablo 8: Yön tayini yapılmıs bir k
K harfini sembolize eden lojik matrisin Tablo 8’niteliksel Tablo 9 ise bölgesel nicelikleri-
dir.
24
y.adet y.uzun d.adet d.uzun sa.adet sa.yatıkuzun soyatadet soyatuzun alanoranı1 0 0.8 0.75 1 0 1 0 0.331 0 1 0 0.8 0.67 1 0 0.25-1 -1 -1 -1 -1 -1 -1 -1 -11 0 0.8 0.8 1 0 1 0 0.4161 0 1 0 1 0 0.8 0.67 0.25-1 -1 -1 -1 -1 -1 -1 -1 -11 0 0.8 0.67 1 0 1 0 0.25-1 -1 -1 -1 -1 -1 -1 -1 -11 0 0.8 0.5 1 0 1 0 0.167
Tablo 9: Öznitelik vektörleri
0 0 1 1 1 1 00 1 0 0 0 0 01 1 0 0 0 0 01 0 0 1 1 1 11 0 0 0 0 0 11 0 0 0 0 0 10 1 1 0 0 1 00 0 1 1 1 0 0
Tablo 10: ikili gösterilmis bir g
Yukarıda verilen Tablo 10 niteliksel gösterimi Tablo 11 ve öznitelikleri Tablo 12 görül-
mektedir.
3 1 1 13
22 1 1 12 44 2
1 4 31 3
Tablo 11: Homojen bölünmüs bir g harfi ve piksel dogrultuları belirtilmis
25
y.adet y.uzun d.adet d.uzun sa.adet sa.yatıkuzun soyatadet soyatuzun alanoranı1 0 1 0 0.8 0.5 1 0 0.22
0.8 0.67 1 0 1 0 1 0 0.333-1 -1 -1 -1 -1 -1 -1 -1 -11 0 0.8 0.67 1 0 1 0 0.333
0.8 0.5 1 0 1 0 1 0 0.221 0 1 0 1 0 0.8 0.67 0.33-1 -1 -1 -1 -1 -1 -1 -1 -11 0 1 0 1 0 0.8 0.67 0.33-1 -1 -1 -1 -1 -1 -1 -1 -1
Tablo 12: Öznitelik vektörleri
26
2.11 Sınıflandırma
[11] Sınıflandırma ögrenmeli ögrenme ve ögrenmesiz ögrenme olmak üzere genel olarak
ikiye ayrılır.Bizim uygulama olarak gerçeklestirecegimiz sınıflandırma alan bilgisi girip
egitme islemi gerçeklestirdigimizden destekli kapsamına girer.Çapraz geçerleme yapa-
rak yani 10 parçaya ayırıp 1’ini hariç tutup 9’uyla egitip hariç tutugumuzla egitilme du-
rumu,bunu on defa tekrarlar basarı ölçümü yapılacaktır.
2.11.1 Görüntüler
Paint aracılıgıyla Sekil 6,Sekil 8 ve Sekil 7 gibi klasörlere eklendi.
Sekil 6: 50x50 lik görüntüler
Sekil 7: Sekildeki kalibrasyonlar olusturuldu
Sekil 8: Dörrt degerlerinden olusan kalibrasyonlar
Sonra ise (3) parametre olarak görüntüyü veriyoruz ve bize 85 alandan olusan vektör
çıktılayacak.
vektor = feature_extractor(goruntu); (3)
27
2.11.2 Weka’da ne yapılacak?
Weka[8],Yeni Zelanda’nın Waikato üniversitesi tarafından java’da yazılmıs açık kamu li-
sanslı bir yazılımdır.Gelecekte açık kamu lisanslı yazılımların ülke ekonomilerine yazı-
lım lisanslarından kurtararak belirli ölçüde tasarruf ettirecegi öngörülmektedir.Weka kul-
lanımı basit ve pratiktir.Piyasada emsali programlara göre hatırı sayılır bir popülerlige
sahiptir.
2.11.3 Verilerin arff formatına uydurulması
[9] Elliser tane a,b,c,d,....,y,z ve 0 dan 9’a kadar olan karakter elle paint aracılıgla üre-
tilecektir.Sonra ise feature extractor’a parametre olarak verdigimiz görüntüden 85 alanlı
özellik vektörü elde edecegiz Sekil 9 görüldügü gibi.
Sekil 9: Matlabtaki görüntü özelikleri
Sonra ise excel aracılıgıyla sınıf bilgisini Sekil 10 gibi dahil ettik.
Sekil 10: Hesap tablosunda csv verisine uyarlama
Bundan sonra ilgili programımızın giris olarak aldıgı formata veriyi uyarlamak olacaktır.
Bu format Sekil 11’teki gibi olacaktır.Bu arff dosya uzatısının text olarak açılıp görüntü-
lenebilmektedir.
Sekil 11: Arff dosya formatı
28
3 Deneysel Çalısmalar
3.1 Verilerin analizinin gerçeklenmesi
Artık veri setimizin olusturuldugunu varsayarak programda egitim [10] islemine basla-
yabiliriz.Programa genel bir bakıs yapacak olursak Sekil 12’te oldugu gibi bir menümüz
olacaktır.
Sekil 12: Arff uzantılı dosya seçme
Bu menü aracılıgıyla biz open file butonu yardımıyla dizinden arff uzantılı dosyamızı
seçiyoruz.Bu asamadan sonra artık hangi sınıflandırma yöntemini belirleyecegimizi Sekil
13 oldugu gibi seçiyoruz.Deneme amaçlı olarak sonucunu inceleyecegiz.
Sekil 13: Sınıflandırma yöntemi
Sonra ise bu butonun altında olan egitim ve test kriterlerine dokunmadan start butonuna
basarak sınıflandırma islemini baslatıyoruz.Sonuçta confusion matrisimiz asagıdaki Sekil
14 çıktı verdi.
29
Sekil 14: Bayes aglarıyla cross edilmis 1650x85 verinin karmasıklık matrisi
3.2 Alanların minimizasyonu
Özelik çıkartımı yapılırken çogu algortima çok sayıda alan üretmektedir ancak söz konusu
kıyas edilecek veriler sınıflandırılırken bir sınıra göre sınıflandırılır bu sınır sınıflandırı-
lacak sınıf sayısının çokluguna göre degisebilir[11] örnegin biz iki adet sınıfı sınıflandı-
racagız algoritmamızın olusturacagı sınır yalnızca bu iki veri için geçerlidir üçüncü bir
veri için degildir.Kısacası duragan alanları filtreleme yaparak program aracılıgıyla alan
sayısını üçte birine indirecegiz.Öncelikle alanların sınıflandırmayı yüzde kaç etkiledigine
bakalım.
Sekil 15: Alan seçme algoritması arayüzü
Sekil 15 arayüzünden ilgili sekme tıklanarak Sekil 16 elde edilir.Buradan anlıyoruz ki
bütün alanlar mevcut veri kümesine göre sınıflandırma üzerinde etkili degil.
30
Sekil 16: Hangi alan sınıflandırmayı ne kadar etkiliyor?
Bu bilgiyi göz önüne alarak ön isleme ekranına giderek gereksiz alanları filtrelemek ama-
cıyla ilgili algoritmayı seçip Sekil 17 oldugu gibi onaylıyoruz.
Sekil 17: Filtreleme tipi seçme
Sekil 18 de scroll bardan anlasılacagı üzere 85’tane olan alan 27 ye kadar düsmüstür.Böylelikle
sınıflandırma isleminde gereksiz islemler devre dısı bırakılmıstır.
31
Sekil 18: Görüldügü gibi gözle görülür bir azalma söz konusu
3.3 Bayes Agları
Sekil 19: Bayes sınıflandırıcısı
Sekil 20: Dikey olarak belirli alan kısıtları
32
Gayet basarılı bir sınıflandırma yöntemi bu basarısını matematikteki olasılık tabanlı he-
saplamalarından alır.Gelismis bayes olarakta nitelendirilir.Sekil 19 oldugu gibi konfigü-
rasyon yapıp çapraz geçerleme yaptıgımızda Sekil 20’de sonuçları üzerine sag tıklayarak
vizualize graph diyerek yapıyı yorumlayabiliriz.Sonuçlar Sekil 21 oldugu gibidir.
Sekil 21: Bayes Karmasıklıgı
3.4 j48 agaç
Sekil 22: Agaçın veri kümemize ait genellemesi
Gayet anlasılabilir net ve keskin hatlar ile sınırlarını belirleyen agaç algoritması bize es-
nek bir sekilde veriyi yorumlama imkanı sunuyor.Veri kümesine ait agaç sonuçların üze-
rine gelip sag tıklayıp visualize tree seçenegiyle Sekil 22 deki gibi görüntülenebilir sonuç
matrisi 23 olarak çıkacaktır.
33
Sekil 23: Agaç algoritmasının karmasıklık matrisi
3.5 Çok katmanlı algılayıcılar
Sekil 24: Katmanlar ve döngü sayıları gösterilmis
Sekil 25: ÇKA’nın karmasıklık matrisi
Çok katmanlı algılayıcılar yapay sinir agları kapsamındadır.Gayet basarılı olmasına kar-
sın yüksek degerde döngüler hatanın çok küçük olmasından dolayı varyansa(ezber) gi-
34
rer.Çogu mühendislik ve bilim dallarında oldukça kullanılan bir yöntemdir.Sekil 24’de ha-
tayı kontrol edebiliriz istedigimiz zaman egitimi sonlandırabilme gibi yetkimiz var.Sonuçları
Sekil 25 gösterilmektedir.Gayet basarılı bir sınıflandırma yapmıstır.Yine bir yapay sinir
agları kapsamında esikleme radial fonksiyonu kulanan model bu model yogun egitim ve-
risinde çok iyi sınırlar çıkarmaktadır.Çıktılar Sekil 26 gibidir.
Sekil 26: Radyal tabanlı sinir agıyla
35
4 DENEYSEL SONUÇLAR
Neticede 85 alandan 27 alana indirgenen özelik vektörü ile çapraz geçerlenen veride 12
sınıfa ait 108 kayıtta ise basarı oranları Tablo 13 oldugu gibidir.
RBF MLA BayesNet j48 BP SVM95.372 92.506 98.141 97.222 93.518 95.307
Tablo 13: Veri kümemizin çapraz geçerleme neticesinde sınıflandırma oranları
Sonuc olarak sınıflandırmayı yorumlarsak Bayes en yüksek sınıflandırma basarısına sa-
hiptir.
36
Kaynaklar
[1] http://www.mathworks.com/matlabcentral/fileexchange/
24624-feature-extraction-for-character-recognition
[2] http://rasimavci.com/matlab/kodlar/GorIsl/islemler/
gorisl_esikleme1.html
[3] http://rasimavci.com/matlab/kodlar/GorIsl/islemler/
gorisl_esikleme1.html#3
[4] http://ceng.gazi.edu.tr/~mahmut/image_processing/Image_
processing/12_tr/aciklama.aspx
[5] A Novel Feature Extraction Technique for the Recognition of Segmented Handw-
ritten Characters M. Blumenstein, B. Verma and H. Basli School of Information
Technology, Griffith University-Gold Coast Campus, Australia
[6] http://www.mathworks.com/matlabcentral/fileexchange/
24624-feature-extraction-for-character-recognition
[7] http://www.yildiz.edu.tr/~bayram/sgi/Morfoloji2.ppt
[8] http://sourceforge.net/projects/weka/
[9] http://www.cs.waikato.ac.nz/~ml/weka/documentation.html
[10] http://www.slideshare.net/mustafakostek/
makine-renmesi-snflandrmarenmeli-renme-yntemlerinin-weka-ortamnda-uygulanmas
[11] http://en.wikipedia.org/wiki/Category:Classification_
algorithms
[12] http://bilgisayarkavramlari.sadievrenseker.com/2009/06/
01/weka/
37
EKLER
4.1 feature extractor
%Bu fonksiyon giris görüntüsünün özniteliklerini çıkarır
function [features]=feature_extractor(image);
% Bu fonksiyon bölgeleri giris görüntüsünü ve her bölge için özelliklerini belirler.
%% görüntü ön isleme
if length(size(image))>2 % rgb görüntü ise;
image=rgb2gray(image);
image=im2bw(image,graythresh(image));
end
% Simdi görüntü ikili iskeletize görüntü olmalı
image=bwmorph(image,’skel’,inf);%%morfolojik islem olarak iskelet çıkarma seçiliyor...
%selecting the universe of discourse
image=discourser(image);
original_image=image;% orjinal görüntü yedekleme
row=size(image,1);
column=size(image,2);
% 3x3 pencere kullanıldıgı bu yana 3 yakın katına bu no.s Hücresi zorunda
% Önce biz bu görüntü en az 9 satır ve minimum 9 sütun olusur saglamak zorunda
add_rows=0; %ek sıra herhangi bir 9x9 matris dakika için
add_columns=0; % sütunları içindeki
if row<9
add_rows=9-row;
end
if column<9
add_columns=9-column;
end
if mod(add_rows,2)==0
image=[zeros(add_rows/2,column);image;zeros(add_rows/2,column)];
else
38
image=[zeros((add_rows-1)/2,column);image;zeros((add_rows+1)/2,column)];
end
%bu satırların hepsi üst ve alt esit olarak güncellestirilmesi gerekir
%esit olması amacıyla esit olmayanlara 0 alanları ekleniyor
row=size(image,1);
if mod(add_columns,2)==0
image=[zeros(row,(add_columns)/2),image,zeros(row,(add_columns)/2)];
else
image=[zeros(row,(add_columns-1)/2),image,zeros(row,(add_columns+1)/2)];
end
column=size(image,2); %güncellenmis colon sayısıı
n_rows=ceil(row/3)*3-row; % sıfırlardan olusan satır yok edilmeyecek
n_columns=ceil(column/3)*3-column; % sıfırlardan olusan sütun yok edilecek
% Satır = 4, yani sıfırlardan olusan 2 satır eklenmesi gerektigini varsayalım. Hücresi (4/3) * 3 dönecektir.
% Olan 6 3 yandaki ila 4 arası yakın katıdır. Satırlar görüntüye eklenmesi Dosya Adedi Böylece n_rows içerir.
if mod(n_rows,2)==0
image=[zeros(n_rows/2,column);image;zeros(n_rows/2,column)];
else
image=[zeros((n_rows-1)/2,column);image;zeros((n_rows+1)/2,column)];
end
%satırın esit bölünmesi amacıyla asagıdaki operasyonlar uygulanmaya devam
%ediyor
row=size(image,1);
if mod(n_columns,2)==0
image=[zeros(row,(n_columns)/2),image,zeros(row,(n_columns)/2)];
else
image=[zeros(row,(n_columns-1)/2),image,zeros(row,(n_columns+1)/2)];
end
column=size(image,2); %Satırlar üçe bölünüyor simdi sıra sütunlara geldi
zone_height=row/3;
zone_width=column/3;
39
%Her bölgedeki satır sayısı 12 ise partlamada 3’erli gidecektir
%Ancak sütunları 9,3 esit parça 3 olmalıdır oysa matris 12x3 ?.
%Bu degiskenler bölge yüksekligi ve genisligi depolanır.
zone11=image(1:zone_height,1:zone_width);
zone12=image(1:zone_height,(zone_width+1):2*zone_width);
zone13=image(1:zone_height,(2*zone_width+1):end);
zone21=image((zone_height+1):2*zone_height,1:zone_width);
zone22=image((zone_height+1):2*zone_height,(zone_width+1):2*zone_width);
zone23=image((zone_height+1):2*zone_height,(2*zone_width+1):end);
zone31=image((2*zone_height+1):end,1:zone_width);
zone32=image((2*zone_height+1):end,(zone_width+1):2*zone_width);
zone33=image((2*zone_height+1):end,(2*zone_width+1):end);
% feature_vectors
zone11_features=lineclassifier(zone11);
zone12_features=lineclassifier(zone12);
zone13_features=lineclassifier(zone13);
zone21_features=lineclassifier(zone21);
zone22_features=lineclassifier(zone22);
zone23_features=lineclassifier(zone23);
zone31_features=lineclassifier(zone31);
zone32_features=lineclassifier(zone32);
zone33_features=lineclassifier(zone33);
%Bu hayır Euler ... bir özellik olarak adlandırılan Eulerdir. O görüntüdeki nesnelerin ve deliklerin arası farkıdır.
euler=bweuler(image);
features=[zone11_features;zone12_features;zone13_features;zone21_features;zone22_features;zone23_features;zone31_features;zone32_features;zone33_features];
features=[reshape(features’,numel(features),1);euler];
% Burada görüntünün bölge özellikleri dikkate alınacaktır.
stats=regionprops(bwlabel(image),’all’);
40
skel_size=numel(image);
%convexarea=(stats.ConvexArea)/skel_size;
eccentricity=stats.Eccentricity;
extent=stats.Extent;
%filledarea=(stats.FilledArea)/skel_size;
%majoraxislength=(stats.MajorAxisLength)/skel_size;
%minoraxislength=(stats.MinorAxisLength)/skel_size;
orientation =stats.Orientation;
% Bu bölgesel özellikleri vardır.
regional_features=[eccentricity;extent;orientation];
features=[features;regional_features]; % I CHANGED HERE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
% Simdi bir önceki geometrik ve bu local özellikleri birlestirilmis gerekir.
%features=[features;regional_features];
4.2 Line Classifier
% Bu islev, belirli bir girise göre bana olumsuz veya çizgi segmentleri türünü vermelidir.
function [featurevector]=lineclassifier(image)
% görüntü al
% Çıkıs olan unsurları 9 eleman özelligi vektörü içerecektir.
% 1.Yatay çizgilerin sayısı, 2.Yatay çizgilerin toplam uzunlugu,
%3. Sag çapraz çizgiler sayısı,
41
% 4. Sag çapraz çizgiler toplam uzunlugu,
% 5. Dikey çizgilerin sayısı, 6. Dikey çizgilerin toplam uzunlugu,
%Sol çapraz çizgilerin sayısı, sol çapraz çizgiler toplam uzunlugu ve kesisme noktalarının sayısı.
%% Eger yön türleri yineleyebilirsiniz durumu olarak kabul bulunmamıssın.
down=1; %okunabilirligi artırmak için çalısıyor, bu # seyleri tanımlar hatırlıyor musun? :)))
downleft=2;
left=3;
upleft=4;
up=5;
upright=6;
right=7;
downright=8;
previousdirection=0;
currentpixel=[0,0];
nextdirection=0; %hufff!!!!
image=prep_image(image);
skel_size=length(find(image==1));
if skel_size<=1
featurevector=-1*ones(1,9);
return;
end
coordinates=find(image==1);
segments=linesegmenter(image);
N_segments=numel(segments);
segmentdirection={}; %Her segmente karsılık gelen yön vektörü içerir.
%% Her segmente karsılık gelen yön vektörü bulmak için gidiyor.
for i=1:N_segments
currentsegment=segments{i};
currentdirectionvector=[];
if size(currentsegment,1)==1
42
error(’Lineclassifier.m içinde sadece bir piksel ile bir segmenti var dostum.’);
else
for j=1:(size(currentsegment,1)-1)
currentpixel=currentsegment(j,:);
nextpixel=currentsegment(j+1,:);
nextdirection=finddirection(currentpixel,nextpixel);
currentdirectionvector=[currentdirectionvector;nextdirection];
end
end
segmentdirection{i}=currentdirectionvector;
end
%%
% ok lets go with this!!!!!!!!!
% Asagıdaki durumlardan herhangi BIRI memnun IF, yeni bir çizgi baslaması tespit edilecektir.
% 1. Bir önceki yön sonraki yön asagı-saga veya yukarı-sol OR saga-yukarı veya asagı-sola VE
% 2. Bir önceki yön asagı dogru veya yukarı-sol VE sonraki yönü saga-yukarı veya asagı-sola VEYA
% 3. Bir çizgi parçasıyla yönünü yönü ya da üçten fazla tip degistirildi.
% 4. bir önceki yön Çesidi uzunlugu üç piksel daha büyüktür.
%Yukarıdaki kurallar, her segmente karsılık gelen tüm yön vektörü uygulanır.
Truelines={};
N=1;
for i=1:N_segments
currentdir_segment=segmentdirection{i};
currentsegment=segments{i};
%Kural 3 uygulamaya konmamıstır.
if numel(currentdir_segment)>2 %Kural 4 ile uygun olarak hazırlanmıstır.
j=1;
currentline=[];
while j<numel(currentdir_segment)
43
previousdirection=currentdir_segment(j);
nextdirection=currentdir_segment(j+1);
rule_one=(previousdirection==upright | previousdirection==downleft) & (nextdirection==downright | nextdirection==upleft);
rule_two=(previousdirection==downright | previousdirection==upleft) & (nextdirection==upright | nextdirection==downleft);
if (rule_one | rule_two)
Truelines{N}=[currentline;previousdirection;nextdirection];
N=N+1;
if j+2>=numel(currentdir_segment) %Sadece bir piksel o yapay olarak kabul edilir sonraya kalır mı denetleniyor.
break;
else
j=j+2;
end
else
currentline=[currentline;currentdir_segment(j)];
j=j+1;
if j==numel(currentdir_segment) %Tam bir çizgi taramıs iseniz, o zaman listelemek için eklenmelidir.
Truelines{N}=[currentline;currentdir_segment(end)];
N=N+1;
break;
end
end
end
elseif numel(currentdir_segment)<3
currentdir_segment(:)=currentdir_segment(1); %Ilk yönü varsayarak tüm yön vektörü.
%error(’dostum, senin çizgi parçası 3 piksel azdır.’);
currentline=currentdir_segment;
Truelines{N}=currentline;
N=N+1;
end
end
44
%% Çizgi türü algılama
% Burada çizginin türünü bulmak için çalısacagız.
N_Truelines=numel(Truelines);
Normallines={}; %normalize hatları tutmak için ayarlayın.
N=1;
% çizgi tipi normallestirme.
for i=1:N_Truelines
currentmaxtype=0;
currentmaxoccurence=0;
currentline=Truelines{i};
currentlength=numel(currentline);
occurencematrix=[];
for j=1:8 %Kez Dosya Adedi maksimum olusan numarasını bulmak için.
occurencematrix=[occurencematrix,numel(find(currentline==j))];
end
currentmaxoccurence=max(occurencematrix); % olayda max bulmak
current_max_direction=find(currentmaxoccurence==occurencematrix); %% max olusur yön bulma.
repetition=numel(current_max_direction)-1; %% Iki istikametin aynı sayisi kez olusup olusmadıgını bulma.
if repetition~=0
% display(’dostum, iki kez yol tarifi olumsuz sonuc verdi’);
end
Normallines{N}=current_max_direction(1)*ones(1,currentlength);% durumda iki dizin türleri aynı sayisi kez,
% ilk dizin alınlamlı olustu.
N=N+1;
end
% çizgi tipi algılama
N_horizontal=0; % yatay çizgi sayısı.
N_vertical=0; % dikey çizgi sayısı.
N_rightslant=0; % sag çapraz çizgi sayısı.
N_leftslant=0; %sol çapaz çizgi sayısı.
L_horizontal=0; % yatayların toplam uzunlugu.
45
L_vertical=0; % dikeylerin toplam uzunlugu.
L_rightslant=0; % sag çaprazların toplam uzunlugu.
L_leftslant=0; % sol çaprazların toplam uzunlugu
N_Normallines=numel(Normallines);
for i=1:N_Normallines
currentline=Normallines{i};
firstelement=currentline(1);
if firstelement==left | firstelement==right
N_horizontal=N_horizontal+1;
L_horizontal=L_horizontal+length(currentline);
elseif firstelement==up | firstelement==down
N_vertical=N_vertical+1;
L_vertical=L_vertical+length(currentline);
elseif firstelement==upleft | firstelement==downright
N_leftslant=N_leftslant+1;
L_leftslant=L_leftslant+length(currentline);
elseif firstelement==upright | firstelement==downleft
N_rightslant=N_rightslant+1;
L_rightslant=L_rightslant+length(currentline);
end
end
window_height=size(image,1);
window_width=size(image,2);
% Onun sayisi çizgiler sonra degeri 1-((no.of lines)/10)*2 olarak normalize edilecek özellik degerleri
V_horizontal=1-((N_horizontal)/10)*2;
V_vertical= 1-((N_vertical)/10)*2;
V_rightslant=1-((N_rightslant)/10)*2;
46
V_leftslant=1-((N_leftslant)/10)*2;
% uzunluk formülü uzunlugu = (belirli bir yönde toplam sayisi piksel) / (tüm toplam sayisi) iskelet ait pikseller kullanılarak bulunmustur
if skel_size~=0
norm_horizontal=L_horizontal/skel_size;
norm_vertical= L_vertical/skel_size;
norm_rightslant=L_rightslant/skel_size;
norm_leftslant=L_leftslant/skel_size;
else
norm_horizontal=-1;
norm_vertical=-1;
norm_rightslant=-1;
norm_leftslant=-1;
end
%Bu görüntü için Euler sayıyı verir, sayisi nesneler arasında ve Belirli bir görüntünün delikler sayisi farkı bu özelligi görüntüdeki toplam piksel oranını verir.
filled_area=skel_size/numel(image);
featurevector=[V_horizontal,norm_horizontal,V_vertical,norm_vertical,V_rightslant,norm_rightslant,V_leftslant,norm_leftslant,filled_area];
4.3 Line segmenter
% Bu dosyatek tek hat segmentler ayırt edici bana yardım etmelidir.
%Bu kodda Bu eser bir yazıda Blumenstein, Verma ve H.Basli tarafından
%’parçalı el yazısı karakterlerin tanınması için yeni bir özelligi çıkarma teknigi’ dayanmaktadır. (Bölüm 2.3.2 bakınız)
%% özellikleri giris
%görüntüde herhangi Baslatıcı su anda ise, eklenecek, kod ise yaramaz. (örn için, ’O’ harfini belada olurdu.)
%% Islevi burada baslar.
function [segments]=linesegmenter(image)
% görseli segmentlere önce, bu iskeletize olması ve sahte piksel çıkarılması gerekir. Fonksiyon prep_image o çalısır.
[starters,intersections]=starter_intersection(image);
% Baslatıcı ve kesismeler satır sütun koordinatlarını içerir.
down=1; %Bu # seyleri tanımlamak unutmayın, okunabilirligi artırmak için çalısıyor? :))
47
downleft=2;
left=3;
upleft=4;
up=5;
upright=6;
right=7;
downright=8;
previousdirection=0;
currentpixel=[0,0];
nextdirection=0; %hufff!!!!
% Ben orijinal görüntünün 4 tarafı sıfır bir sınır eklemek için gidiyorum.
image=[image,zeros(size(image,1),1)]; %Sag sınırında sıfır ekleme.
image=[zeros(1,size(image,2));image];% Üst sınırındaki sıfır ekleme.
image=[zeros(size(image,1),1),image]; % Sol sınırında sıfır ekleme.
image=[image;zeros(1,size(image,2))];% Alt sınırında sıfır ekleme.
%Simdi orijinal piksel koordinatları degisti, ben baslayanlar ve aynı zamanda kesisimlerde bu degisikligi getirmek zorunda
minor_starters_queue=[];
starters = starters + 1;
intersections = intersections + 1;
if isempty(starters) % mükemmel bir D düsünmek...
[r,c]=find(image==1);
coordinates=[r,c];
starter1=coordinates(1,:);
starter2=coordinates(end,:);
minor_starters_queue=[starter1;starter2];
end
% böylece bir komsuluk için tanımlanabilir.
N=1; % segmentlerin Hayır içermesi gerekiyordu.
segments={}; %gereken hücre bireysel kesimleri içerecek sekilde.
starters_queue=starters;
visited=[]; %ziyaret edilen tüm piksel ayarlayın.
48
%for i=1:size(starters_queue,1)
skel_size=numel(find(image==1)); % Biri degere sahip piksel bir olumsuz olarak nitelendirilir
%% Bu, tüm baslayanlar kadar çalısmaya devam ediyorum, ana döngü.
% Ele alınan ya da minör baslayanlar ele alınmaktadır da tüm iskelet ziyaret olmustur.
while(isnotempty(starters_queue) | isnotempty(minor_starters_queue))% | size(visited,1)<skel_size)BU HAKKINDA CIDDI BIR OLABILIR.
currentsegment=[];% Mevcut segmentler piksel listesini içermesi gerekir.
%% Bu kod kısmı, normal starters_queue üyeleri ile ilgilenir.
if isnotempty(starters_queue)
if isnotmember(starters_queue(1,:),visited)
current_starter=starters_queue(1,:);
starters_queue=del_pixel(current_starter,starters_queue);
currentpixel=findneighbours(image,current_starter);
visited=[visited;current_starter];
currentsegment=[currentsegment;current_starter];
nextdirection=finddirection(current_starter,currentpixel);
previousdirection=nextdirection; %Bu bölümleri baslatma parçalardır ve baslangıçları sonraki pikselde olur.
%findneighbours() mevcut pikselin komsuları bulmak için bir islevdir.
else
starters_queue=del_pixel(starters_queue(1,:),starters_queue);
continue; %baslangıç ile ... ele alınmıs ise orada kalan kod çalıstıran hiçbir nokta, böylece bir sonraki baslangıç için gitmeliyiz.
% böylece kontrol süre geçmesi gerekir.
end
%% Bu kod kısmı ÇALISIYOR (!!!) minör baslayanlar ile ugrasmak.
elseif (isempty(starters_queue) & isnotempty(minor_starters_queue))
currentminor=minor_starters_queue(1,:);
currentsegment=[];
if ismymember(currentminor,visited) % iskeletize ’A’ ikinci kesisme olgusu hatırlamak.
minor_starters_queue=del_pixel(currentminor,minor_starters_queue);
continue;
end
visited=[visited;currentminor]; % ziyaret edilen kümesine currentminor ilave edilmesi.
49
neighbours=findneighbours(image,currentminor); % Mevcut minör komsuları bulma.
temp=1;
while temp<=size(neighbours,1) %Mevcut Minors komsular listesinden ziyaret edilen komsuları silme.
current_neighbour=neighbours(temp,:);
if (ismymember(current_neighbour,visited) | ismymember(current_neighbour,minor_starters_queue))
neighbours=del_pixel(current_neighbour,neighbours);
temp=1;
else
temp=temp+1;
end
end
unvisited_neighbours=neighbours;
if size(unvisited_neighbours,1)>2
minor_starters_queue=del_pixel(currentminor,minor_starters_queue);
continue;
%error(’arkadas, geçerli minör ikiden fazla Gezilmemis komsuları var.’);
end
if size(unvisited_neighbours,1)==2
discarded=unvisited_neighbours(1,:);
currentpixel=unvisited_neighbours(2,:);
currentsegment=[currentsegment;currentminor];
minor_starters_queue=[minor_starters_queue;discarded];
elseif isempty(unvisited_neighbours)
minor_starters_queue=del_pixel(currentminor,minor_starters_queue);
continue;
elseif size(unvisited_neighbours,1)==1
currentpixel=unvisited_neighbours;
currentsegment=[currentsegment;currentminor];
unvisited_neighbours=[];
end
end
50
%% Bu kod satırı currentpixel isler.
while(isnotmember(currentpixel,visited))
%% Bu hücrenin noktası mevcut piksel ne ise bir sonraki piksel bulmaktır.
% kesisim ne Starter ne minör.
if(isnotmember(currentpixel,intersections) & isnotmember(currentpixel,starters_queue)) %isnotmember()
% fonksiyonel geçerli piksel kesisimleri ise, ayrıca mevcut piksel sadece iki komsu oldugunu anlasılacagı denetlemek.
neighbours=findneighbours(image,currentpixel);
visited=[visited;currentpixel];
%% komsuları ziyaret piksel yanı sıra baslatıcı silme ve bir sonraki piksel bulmak için gidiyor
temp=1;
while temp<=size(neighbours,1)
current_neighbour=neighbours(temp,:);
if (ismymember(current_neighbour,visited))
neighbours=del_pixel(current_neighbour,neighbours);
temp=1;
else
temp=temp+1;
end
end
% sonraki ise bölümün komsuları listesindeki tüm minör starterları temizler.
if size(neighbours,1)>2 %komsularından biri minör Starter ise bu durumda gerçeklesir.
temp=1;
while temp<=size(neighbours,1)
current_neighbour=neighbours(temp,:);
if (ismymember(current_neighbour,minor_starters_queue))
neighbours=del_pixel(current_neighbour,neighbours);
temp=1;
else
temp=temp+1;
end
51
end
end
if isempty(neighbours) %açıklama için alt bölümüne bakın.
currentsegment=[currentsegment;currentpixel];
segments{N}=currentsegment;
N=N+1;
break;
end
if size(neighbours,1)==1
nextpixel=neighbours;
elseif size(neighbours,1)==2 % Tüm ziyaret edilmis komsuların kaldırıldıgını unutmayın.
%bu nedenle bu iki adet ziyaret edilmemis bulunmaktadır.Burada bunlardan birisi olacaktır.
first_neighbour=neighbours(1,:);
second_neighbour=neighbours(2,:);
% komsularının biri oldugu bir durum olusabilir.
% kesisim öyleyse bu piksel kadar çoksa, burada segmenti durdurmak ve bir minör olarak kesisim dısındaki
%piksel düsünelim.else continue
if ismymember(first_neighbour,intersections)|ismymember(second_neighbour,intersections)
currentsegment=[currentsegment;currentpixel];
if ismymember(first_neighbour,intersections)
currentsegment=[currentsegment;first_neighbour];
segments{N}=currentsegment;
N=N+1;
visited=[visited;first_neighbour];
minor_starters_queue=[minor_starters_queue;second_neighbour];
else
currentsegment=[currentsegment;second_neighbour];
segments{N}=currentsegment;
N=N+1;
visited=[visited;second_neighbour];
minor_starters_queue=[minor_starters_queue;first_neighbour];
52
end
minor_starters_queue=[minor_starters_queue;first_neighbour;second_neighbour];
break;
end
neighbour_one_direction=finddirection(currentpixel,first_neighbour);
neighbour_two_direction=finddirection(currentpixel,second_neighbour);
if(neighbour_one_direction==previousdirection)
neighbours=del_pixel(second_neighbour,neighbours);
nextpixel=neighbours;
previousdirection=neighbour_one_direction;
else
neighbours=del_pixel(first_neighbour,neighbours);
nextpixel=neighbours;
previousdirection=neighbour_two_direction;
end
elseif size(neighbours,1)>2
%2’den fazla komsularının oldugundan bunlardan biri bir kesisim olacak çok yüksek ihtimalle. so we
%Bu kesisim bulmak ve burada parçayı sonlandırmak zorunda.
%küçük bir Starter var hiçbiri olmazsa, uç noktası olarak düsünmek yeterli.
%display(’hi, ikiden fazla Gezilmemis komsuları var.’);
unconsidered=neighbours;
for i=1:size(neighbours,1)
current_neighbour=neighbours(i,:);
if ismymember(current_neighbour,intersections)
unconsidered=del_pixel(current_neighbour,unconsidered);
visited=[visited;current_neighbour];
currentsegment=[currentsegment;current_neighbour];
segments{N}=currentsegment;
N=N+1;
currentsegment=[];
break;
53
end
end
% Bundan sonra döngü kesistigi hariç tüm pikseller önemsenmemis olacaktır
%bu nedenle, hepsi minor_starters_queue eklenmelidir.
%o zaman sadece bir tanesi kabul edilecektir komsuları ikiden fazla kesismeler, varsa baska bir sorundur.
minor_starters_queue=[minor_starters_queue;unconsidered];
break;
end
currentsegment=[currentsegment;currentpixel];
previousdirection=finddirection(currentpixel,nextpixel);
previouspixel=currentpixel; % Bazen, bu yardımcı olabilir.
currentpixel=nextpixel; % Bir sonraki piksel üzerine hareketli.
%% Bu bölümün noktası geçerli piksel bir kesistigi oldugu durumla basa çıkmak için ise
elseif (ismymember(currentpixel,intersections)) %ikiden fazla komsu olması anlamına gelir.
visited=[visited;currentpixel];
neighbours=findneighbours(image,currentpixel);
unvisited_neighbours=[]; %Gezilmemis komsuları tutmak için.
for i=1:size(neighbours,1)
if isnotmember(neighbours(i,:),visited)
unvisited_neighbours=[unvisited_neighbours;neighbours(i,:)];
end
end
unvisited_directions=[];
direction_flag=0; % Bu geçerli çapraz geçisi yönü korunmus olup olmadıgını kontrol etmek için bir bayraktır.
for i=1:size(unvisited_neighbours,1)
current_neighbour=unvisited_neighbours(i,:);
current_neighbour_direction=finddirection(currentpixel,current_neighbour);
if current_neighbour_direction==previousdirection
direction_flag=1;
currentsegment=[currentsegment;currentpixel];
previouspixel=currentpixel;
54
currentpixel=current_neighbour;
unvisited_neighbours=del_pixel(current_neighbour,unvisited_neighbours);
minor_starters_queue=[minor_starters_queue;unvisited_neighbours];
unvisited_neighbours=[];
break;
end
% komsu piksellerin hiçbiri geçerli çapraz geçisi yönünde nerede oldugunu bir durum meydana gelebilecek.
%Daha sonra bunların her minor_starters_queue eklenmelidir.
%Örnek için alt bölümüne bakın.
%sonu burada gerçeklesirse, hepsini st ilave edilmelidir,
%pikselin bir döngü baska bundan sonra, mevcut çapraz geçisi yönünde oldu demektir.
end
if direction_flag==0
minor_starters_queue=[minor_starters_queue;unvisited_neighbours];
currentsegment=[currentsegment;currentpixel];
segments{N}=currentsegment;
N=N+1;
end
%% geçerli piksel starter oldugunun anlasılması
elseif (ismymember(currentpixel,starters_queue))
currentsegment=[currentsegment;currentpixel];
starters_queue=del_pixel(currentpixel,starters_queue);
visited=[visited;currentpixel];
segments{N}=currentsegment;
N=N+1;
%% minör mü=?
elseif (ismymember(currentpixel,minor_starters_queue))
currentsegment=[currentsegment;currentpixel];
minor_starters_queue=del_pixel(currentpixel,minor_starters_queue);
visited=[visited;currentpixel];
55
segments{N}=currentsegment;
N=N+1;
end
end
end
% Simdi tüm segmentler nedeniyle sıfır sınırına ekleyerek orijinal konumuna geçer, her (x, y) noktası kaymıstır (x + 1, y + 1).
for i=1:(N-1)
segments{i}=segments{i}-1;
end
save debug.mat
% [1 1 1 1
% 0 1 0 0]
% Bu durumda, çapraz geçisi (1,4) baslayacak ve (1,2) ulastıgında, zikzaklı yönde (1 oldugu, iki komsu (1,1) ve (2,2) vardır 1), (2,2), bu bakıs açısıyla, geçerli piksel) (simdi 1,1 starters_list eklenir, komsular (1,2) ve (2,2), ancak (1,2) zaten ziyaret ve (2,2) ziyaret olamaz....
% cpr=currentpixel(1);cpc=currentpixel(2);
%cpr geçerli piksel satır ve oldugunu.
% tbm geçerli piksel sütundur.
% [1 0 1
% 0 1 0
% 0 1 0]
%baslangıç piksel ne olursa olsun, bu durumda, merkez pikselde, çapraz geçisi yönü korunmaz.
4.4 find neighbours
%Bu fonksiyon, bir görüntü alacak ve merkez pikselin koordinatları verilecektir. .
% Bu 1 olarak deger merkezi pikselin tüm komsularının koordinatlarını dönmelidir.
function [neighbours]=findneighbours(image,coords)
imwindow=image((coords(1)-1):(coords(1)+1),(coords(2)-1):(coords(2)+1));
neighbours=[];
imwindow(2,2)=0; %% Bunun nedeni açıktır !!!!!!!!! olmalı
indexes=find(imwindow==1);
for i=1:length(indexes)
currentindex=indexes(i);
56
row=rem(currentindex,3);
if(row==0)
row=3; %rem (currentindex, 3) sıfır olacaktır eger onun 3. satırda.
end
column=ceil(currentindex/3);
neighbours=[neighbours;[row,column]];
end
neighbours(:,1)=coords(1)+(neighbours(:,1)-2); % merkez piksel ’komsuları-2’ .. dinlenme, u anlamaya merkezi haline (0,0) ima, (2,2) ’dir !!!
neighbours(:,2)=coords(2)+(neighbours(:,2)-2);
4.5 find direction
%Fonksiyon find_direction argümanlar ilk merkez piksel olarak ilk piksel dikkate göre ikinci piksel yönünü verir gibi
%iki piksel koordinatlarını alır.Numaralandırma saat yönünün oldugunu.
%Merkez pikselin altına piksel 1 olarak numaralandırılmıs ve kalan saat yönünde numaralandırılmıstır.
function direction=finddirection(first,second);
direction=0;
position = second-first;
if position==[1,0]
direction=1;
elseif position==[1,-1]
direction=2;
elseif position==[0,-1]
direction=3;
elseif position==[-1,-1]
direction=4;
elseif position==[-1,0]
direction=5;
elseif position==[-1,1]
direction=6;
elseif position==[0,1]
direction=7;
57
elseif position==[1,1]
direction=8;
end
4.6 ismymember
% func ismymember() cheks whether pixel is a element of given set
% chek doc for isnotmember for more info
function result=ismymember(pixel,set);
if isnotmember(pixel,set)
result=0;
else
result=1;
end
4.7 starter intersection
% Bu dosya girisi her baslatıcı ve kesismeler vererek bana yardım etmelidir.
% Bu geçerli görüntüdeki tüm Starter noktalarını bulur kod (çok kötü !!!!) çok verimsiz bir parça içerir.
%Sorun kontrolleri altındaki kodu verilen görüntüdeki tüm pikselleri bu harfin yalnızca bedene piksel Baslatıcı olabilir çünkü aslında gerekli olmayan
%bir Starter noktası, olup olmadıgını kontrol etmek olması. hufffffffffffffffff!!!!!!!!!!!!!
% kesismeler 3 ya da daha fazla komsuları olan piksellerdir.
% Bu kodda eser bir yazıda Blumenstein, Verma ve H.Basli tarafından ’parçalı el yazısı karakterlerin tanınması için yeni bir özelligi çıkarma teknigi’ dayanmaktadır. (Bölüm 2.3.1 bakınız)
function [starters_list,intersections] = starter_intersection(image)
%Ben orijinal görüntünün 4 tarafı sıfır bir sınır eklemek için gidiyorum.
image=[image,zeros(size(image,1),1)]; % Sag sınırında sıfır ekleme.
image=[zeros(1,size(image,2));image];% Üst sınırındaki sıfır ekleme.
image=[zeros(size(image,1),1),image]; % Sol sınırında ekleme sıfır...
image=[image;zeros(1,size(image,2))];% Alt sınırında sıfır ekleme.
58
% Tüm sınırları sıfır ekleyerek tüm (x, y) yapar (x + 1, y + 1).
row=size(image,1);
column=size(image,2);
starters_list=[];
intersections=[];
for m=2:(row-1)
for n=2:(column-1)
if (image(m,n)==1)
neighberhood=image(m-1:m+1,n-1:n+1);
neighbours=numel(find(neighberhood==1))-1;
if neighbours==1
starters_list=[starters_list;[m,n]];
end
if neighbours==3 %açıklama için alt bölümüne bakın.
surrounders=findneighbours(image,[m,n]);
cornerpixels=0;
directpixels=0;
directions=[];
trueneighbours=3;
for i=1:3
currentdirection=finddirection([m,n],surrounders(i,:));
directions=[directions,currentdirection];
end
for i=1:3
currentdirection=directions(i);
if currentdirection==1
adjacency=find(directions==8 | directions==2);
if isempty(adjacency)
continue;
else
59
trueneighbours=trueneighbours-1;
break;
end
elseif currentdirection==8
adjacency=find(directions==7 |directions==1);
if isempty(adjacency)
continue;
else
trueneighbours=trueneighbours-1;
break;
end
else
adjacency=find(directions==currentdirection-1 | directions==currentdirection+1);
if isempty(adjacency)
continue;
else
trueneighbours=trueneighbours-1;
break;
end
end
end
if trueneighbours==3
intersections=[intersections;[m,n]];
end
end
if neighbours==4
surrounders=findneighbours(image,[m,n]);
cornerpixels=0;
directpixels=0;
for i=1:4
currentdirection=finddirection([m,n],surrounders(i,:));
60
if(rem(currentdirection,2)==0) %alt piksel 1 ve daha sonra piksel piksel merkezi etrafında saat yönünde numaralandırılmıstır.
cornerpixels=cornerpixels+1;
else
directpixels=directpixels+1;
end
end
if cornerpixels~=2
intersections=[intersections;[m,n]];
end
end
if neighbours>4
intersections=[intersections;[m,n]];
end
end
end
end
starters_list=starters_list-1; % koordinat sistemi kaymasının dengelemektedir.
intersections=intersections-1;
%consider matrix [1 1 0
% 0 1 0
% 0 0 1]
% ikiden fazla komsuları vardır, ama belli ki bir kavsak degil çünkü kesismeler
%tanımına göre burada merkezi piksel bir kesisim olarak kabul edilecektir !!!!. Bu sadece 3 komsuları oldugu durumlarda olur.
%Görüntünün iskeleti boyunca seyahat düsünün.En asagı-sag pikselden piksele merkezi geldi diyelim.
% Simdi bu merkez piksel (yukarı ve yukarı-sol), kod kesisim olarak görmektedir gitmek için iki yol vardır çünkü.Bu davranıs, modifiye edilmelidir.
%Yolu bu kalan iki komsu bu 3 * 3 penceresinde bitisik olup olmadıgını kontrol etmektir.
%Bunun için, onlar aynı satır veya sütunda olup olmadıgını kontrol etmek için yeterli.
% Koduyla baska sorun harfi ’C’ düsünmeleridir. Olası bir olay matristir. [1 1 1 1
% 1 0 0 0
% 1 1 1 1]
61
% Burada piksel (2,1), bu 4 komsular vardır düsünün.Yani bir kesisim olarak sınıflandırılır, ama onun edilmeyecektir.
%Ben bu görmek gerekecektir.
% Now the elements in the four borders should be checked
% since they are not checked in the previous portion of code
%Dört köselerinde dört piksel denetimi kod önceki bölümü kontrol edilmez çünkü simdi dört sınırları ögeler kontrol edilmelidir
%(Ben kodlama bu tarz nefret !!!!!!)
%% Simdi sol üst kösesinde piksel ile kontrol edecek.
% if image(1,1)==1
% neighberhood=[image(1,2),image(2,2),image(2,1)];
% neighbours=numel(find(neighberhood==1));
% if neighbours==1
% starters_list=[starters_list;[1,1]];
% end
% if neighbours>=3
% intersections=[intersections;[1,1]];
% end
% end
%% Simdi sag üst kösesinde piksel ile kontrol edecek
% if image(1,column)==1
% neighberhood=[image(1,column-1),image(2,column-1),image(2,column)];
% neighbours=numel(find(neighberhood==1));
% if neighbours==1
% starters_list=[starters_list;[1,column]];
% end
% if neighbours>=3
% intersections=[intersections;[1,column]];
% end
% end
%% Simdi sol alt köse piksel kontrol edecek
% if image(row,1)==1
% neighberhood=[image(row-1,1),image(row-1,2),image(row,2)];
62
% neighbours=numel(find(neighberhood==1));
% if neighbours==1
% starters_list=[starters_list;[row,1]];
% end
% if neighbours>=3
% intersections=[intersections;[row,1]];
% end
% end
%% Simdi sag alt kösede piksel kontrol edecek.
% if image(row,column)==1
% neighberhood=[image(row-1,column-1),image(row,column-1),image(row-1,column)];
% neighbours=numel(find(neighberhood==1));
% if neighbours==1
% starters_list=[starters_list;[row,column]];
% end
% if neighbours>=3
% intersections=[intersections;[row,column]];
% end
% end
%% Simdi sol sınır piksel kontrol edecek
% for m=2:row-1
% if image(m,1)==1
% neighberhood=image(m-1:m+1,1:2);
% neighbours=numel(find(neighberhood==1))-1;
% if neighbours==1
% starters_list=[starters_list;[m,1]];
% end
% if neighbours>=3
% intersections=[intersections;[m,1]];
% end
% end
63
% end
%% Simdi üst sınır piksel kontrol edecek.
% for n=2:column-1
% if image(1,n)==1
% neighberhood=image(1:2,n-1:n+1);
% neighbours=numel(find(neighberhood==1))-1;
% if neighbours==1
% starters_list=[starters_list;[1,n]];
% end
% if neighbours>=3
% intersections=[intersections;[1,n]];
% end
% end
% end
%% Simdi sag sınır piksel kontrol edecek
% for m=2:row-1
% if image(m,column)==1
% neighberhood=image(m-1:m+1,(column-1):column);
% neighbours=numel(find(neighberhood==1))-1;
% if neighbours==1
% starters_list=[starters_list;[m,column]];
% end
% if neighbours>=3
% intersections=[intersections;[m,column]];
% end
% end
% end
%% Simdi alt sınır piksel kontrol edecek.
% for n=2:column-1
% if image(row,n)==1
% neighberhood=image((row-1):row,n-1:n+1);
64
% neighbours=numel(find(neighberhood==1))-1;
% if neighbours==1
% starters_list=[starters_list;[row,n]];
% end
% if neighbours>=3
% intersections=[intersections;[row,n]];
% end
% end
% end
4.8 Isnotintersection
% This function tests whether pixel is in the given set
function result=isnotmember(pixel,set)
result=1;
for i=1:size(set,1)
if pixel==set(i,:)
result=0;
break;
end
end
4.9 isnotempty
function result=isnotempty(matrix)
if isempty(matrix)
result=0;
else
result=1;
end
65
ÖZGEÇMIS
KISISEL BILGILER
Adı Soyadı :Mustafa Köstek
Uyrugu : T.C
Dogum Yeri ve Tarihi: Çayıralan 9/5/1993
Adres : bilecik
Telefon :
e-mail : mustafakostek@gmail.com
EGITIM DURUMU
Lisans Ögrenimi : Bilecik Seyh Edebali Üniverstesi, Bilecik
Bitirme Yılı : 2015
Lise : Edremit Anadolu Lisesi
IS DENEYIMLERI
Yıl : 2013
Kurum : IZSU
Stajlar :
ILGI ALANLARI
YABANCI DILLER : Ingilizce,almanca
66