Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Ersin Özüağ
Ersin Özüağ
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
1 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: algoritma algoritmasi benzerligin degerleri farkli imgeler imgenin kullanilan merkez merkezi oldugu olmasi piksel sinifi siniflandirma C++ / C++.NET Ersin Özüağ
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : İleri
Kategori : C++ / C++.NET
Yayınlanma Tarihi : 18.11.2006
Okunma Sayısı : 42311
Yorum Sayısı : 2     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 23.11.2024
Turhal Temizer
Mac OS/X Removing CUDA 23.11.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 23.11.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 23.11.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
C++ ve K-Ortalama Algoritması ile İmge Bölütleme
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Bu çalışmaya Kocaeli Üniversitesi Elektronik ve Haberleşme Mühendisliği bölümü İşaret ve Görüntü İşleme Laboratuvarında yaz stajımda gerçekleştirdim. İlk bölümde imge bölütlemenin ne olduğunu ve nasıl yapıldığı anlatacağım. Ardından bir imge bölütleme algoritması olarak da kullanılan k-ortalama algoritmasının yapısı hakkında bilgi vererek, C++ programlama dili ile nasıl gerçekleştirdiğimi anlatacağım. İMGE BÖLÜTLEME

İmge bölütleme, imgeyi birbiriyle çakışmayan fakat imgenin tümünü içeren alt imge gruplarına ayırma işlemidir. Bu gruplandırma işlemi imgenin belirli bir veya birden fazla özelliği dikkate alınarak gerçekleştirilebilmektedir.

Bölütleme işleminde kullanılan özelliğin seçimi uygulamaya bağlı olarak değişiklik gösterebilir. Bölütlemede kullanılan en temel özellikler gri imgelerde parlaklık, renkli imgelerde renk bileşenleri olarak sıralanabilir. İmgedeki ayrıtlar ve doku özellikleri de bölütleme açısından oldukça yararlı bilgiler taşıyabilmektedir.

Genelde bölütlemenin teorik bir tabanı olmadığından bölütlemeye ilişkin standart bir yöntem bulunmamakta, sezgisel (ad-hoc) ya da probleme özgü yöntemlerle bölütleme işlemi gerçekleştirilmektedir.

İmge bölütleme bir imgeyi anlamlı parçalara yada nesnelere ayırma işlemidir ve otonom hedef takiplerinde oldukça önemli bir işleve sahiptir . Bir bölütleme algoritmasından iyi bir sonuç alınabilmesi için algoritma hangi matematiksel modele bağlanmış olursa olsun imge hakkındaki anlamsal veriler ve önceki bilgilerden oluşan sezgiselliğin de çözüm yöntemine katılması gerekir. Şimdiye kadar literatüre yüzlerce segmentasyon algoritması sunulmuştur . Tüm imgeler için iyi sonuç veren genel bir algoritma olmadığı gibi aynı algoritma farklı imgeler üzerinde farklı sonuçlar verebilmektedir . Algoritmalar genellikle imgelerin gürültüye karşı hassasiyet, aydınlatma koşulları ve büyüklükleri gibi özelliklerinden dolayı her zaman iyi performans gösteremeyebilmektedirler. Büyük değişimlere ve detaylara sahip imgeler bölütlenmek istendiğinde hiçbir algoritma bütün imgeler üzerinde başarılı olamamaktadır . Bölütleme algoritmalarının genelleme özelliğinin ve kararlılığının (robust) artırılması ile daha fazla imgeye uyarlanabilir olması üzerine çalışmalar yapılmaktadır. Birçok görme sisteminde imge bölütleme için kural tabanlı tümleşik metotlar kullanılmıştır . Bu metotlar problem ve kullanıcı tecrübesini ifade eden kurallara dayalıdır ve daha belirgin sonuçlar ortaya koymuştur. Kural tabanlı sistemlerin en büyük dezavantajı bilgiyi kurallara dönüştürmek gibi zor bir işlem gerektirmesidir. Çalışmada sınıflandırma algoritmaları ile imge bölütleme anlatılmıştır ve bu uygulamaya ait sonuçlar verilmiştir.


Bölütleme neticesinde elde edilen bölgelerin gerçek imgedeki yapısal parçalara veya belirgin nesnelere karşı düşmesi beklenmektedir (Rush, 1993). İyi bölütlenmiş bir imgenin özellikleri Haralick ve Shapiro (1992) tarafından şöyle verilmektedir:

• Gri ton ya da doku gibi bir özellik açısından bölütlenmiş imgede düzenli ve türdeş bölgelerin elde edilmesi,
• Bölge içlerinin basit olması ve küçük delikler içermemesi,
• Birbirine yakın fakat farklı bögelerin düzgün oldukları özellik açısından farklı değerler alması,
• Bölge snırlarının basit olamsı, girinti çıkıntı olmaması ve bölge sınırlarının uzamsal olarak doğru konumda bulunması.

Ancak bu özelliklerin tümünü aynı anda sağlayan ve her türden imge için başarılı sonçlar veren bölütleme yöntemi bulabilmek oldukça zordur (Haralick ve Shapiro 1992).


K-ortalama algoritması: ( k-ortalama demetleme algoritması (k-ortalama clustering algorithm))

Bu algoritma şöyle çalışır:

a) önce eğitim kümesinden k tane rastgele merkez seçer.

b) Her eğitim kümesi elemanının (xi) en yakın olduğu merkezi (mj) bularak xi’i j’inci kümeye atar.

c) Daha sonra j’inci kümedeki bütün dökümanları kullanarak yeni bir merkez belirler. Yeni merkez yine veri kümesinden bir elemandır ve bu elemanının o kümedeki diğer elemanlara olan uzaklığı minimumdur.

d) Merkezler bir önceki iterasyona göre değişmiş ise b)’den devam eder. Değişmemiş ise algoritma durur.

Oluşturulan kümelerin sınıfları küme içinde en çok geçen sınıf olarak belirlenir. Yeni bir test dökümanının sınıfı bulunacağı zaman, önce test dokümanına en yakın küme merkezi bulunur. Test dokümanının sınıfı o kümenin sınıfı olarak belirlenir.

Sınıflandırma

Genel anlamda sınıflandırma, bir veri kümesini sahip olduğu özelliklere göre sınıf yada kategorilere ayırmaktır. Sınıflandırmanın faydası gereksiz ve tekrarlı verileri kaldırmasıdır. Dahil oldukları sınıfa göre veriler üzerinde işlem yapılacağı zaman da bu verilerin sınıflandırılmış olması gerekir. Veriler sınıflandırılırken hangi sınıfa ait oldukları verilerin renk, boyut, şekil gibi bazı özelliklerine bakılarak belirlenir. İmgelerde de imgenin sahip olduğu gri ton değerlerine bakılarak bir sınıflandırma işlemi sağlanabilir. İyi bir sınıflandırma sonucunda sınıflar arasındaki benzerlik minimum, sınıf içi benzerlik maksimumdur. N bir veri kümesindeki eleman sayısı ve i=1,2,…,N olmak üzere Xi bu veri kümesindeki i. eleman olsun. Veri kümesi S={X1,X2,…,XN} dir. Sınıflandırma ile bu N tane veri K tane sınıftan birine atanır.



Klasik sınıflandırma algoritmalarından K-ortalama algoritmasının temel adımları aşağıdaki gibidir:

Adım 1: K adet başlangıç sınıfı belirle
Adım 2: Her bir sınıf arası tüm Pi uzaklıklarını ve buna bağlı olarak KxN boyutundaki uzaklık matrisini (D) hesapla
Adım 3: D matrisini kullanarak her bir noktanın en yakın olduğu sınıfı belirle ve bu noktayı bu sınıfa ata
Adım 4: Sınıfların merkezlerini hesapla
Adım 5: Sınıflar arası benzerliğin minimum, sınıf içi benzerliğin maksimum olması, artık hiçbir verinin sınıfının değişememesi veya algoritmanın belirlenen sayıda icra edilmiş olması gibi durma şartlarından birisi sağlanıyorsa algoritmayı sonlandır yoksa 2.adıma geri dön.

Sınıf içi benzerliğin hesaplanmasında yaygın olarak öklit uzaklığı kullanılmaktadır. Bölütlemede temel amaç öklit uzaklığının minimize edilmesiyle sınıf içi benzerliğin maksimize edilmesidir. Öklit uzaklığı (benzerliğin tersi) verilerin sınıflarının merkezi ile kendileri arasındaki farkların kareleri toplamının karekökünün alınması ile hesaplanabilir.

C++ ile k-ortalama Uygulaması

C++ ile imge okuma:
C++ ile imge okumak için "CImg.h" kütüphanesi kullanıldı. Bu programın çalıştırılması için öcelikle bu kütüphane dosyasının yüklü olması gerekmektedir.

//_______________________________________________________________________ //İşaret ve Görüntü İşleme laboratuarı (KULIS) #include <iostream.h> #include <conio.h> #include <string.h> #include "CImg.h" #include <math.h> using namespace cimg_library; CImg<unsigned char> imgek("C:/imge.bmp"); int x=imgek.dimx(),y=imgek.dimy(); int *ptr,*elemansayisi,*edegtop,*test,*merkx,*merky,*merkxy; int i,j,s,k,g,m1,ts,adimsayisi; CImg<int> imge1(x,y); imgekucult() { for(i=0; i<x; i=i+2) for(j=0; j<y; j=j+2) imgek(i/2,j/2)=(imgek(i,j)+imgek(i+1,j)+imgek(i+1,j+1)+imgek(i,j+1))/4; x=x/2; y=y/2; return 0; } void oku() { cout<<"kume sayisi gir : "; cin>>k; ptr=(int *) malloc(sizeof(int *)*(k*x*y)); merkx=(int *) malloc(sizeof(int *)*(k)); merky=(int *) malloc(sizeof(int *)*(k)); merkxy=(int *) malloc(sizeof(int *)*(k)); elemansayisi=(int *) malloc(sizeof(int *)*(k)); edegtop=(int *) malloc(sizeof(int *)*(k)); test=(int *) malloc(sizeof(int *)*(k)); } //____________1.adım _____________________ // rastgele merkezler olusturulur. int randmerk() { for(i=0; i<k; i++) { *(merkx+i)=random(x); *(merky+i)=random(y); *(merkxy+i)=imgek( *(merkx+i),*(merky+i)); *(elemansayisi+i)=0; *(edegtop+i)=0; *(test+i)=0; } return 0; } //_________________1.adim sonu_________________ //_________________2.adim _________________ //merkeze uzaklıklar bulunur imge duzenlenir. int merkuzak() { s=0; for(i=0; i<x; i++) for(j=0; j<y; j++) { m1=500; // baslangıc kosulu 255 ten buyuk olmalı for(g=0; g<k; g++) {*(ptr+(g*x*y)+s)=abs(imgek(i,j)-*(merkxy+g)); m1=min(*(ptr+(g*x*y)+s),m1); } for(g=0; g<k; g++) { *(ptr+(g*x*y)+s)=*(ptr+(g*x*y)+s)==m1; *(elemansayisi+g)=*(elemansayisi+g)+*(ptr+(g*x*y)+s); *(edegtop+g)=*(edegtop+g)+(*(ptr+(g*x*y)+s) * imgek(i,j)); } s++; } return 0; } //_________________2.adim sonu_________________ //_________________3.adim _________________ //yeni merkezler oluşur int yenimerk() { for(i=0; i<k; i++) *(merkxy+i)=*(edegtop+i)/ *(elemansayisi+i); return 0; } //_________________3.adim sonu_________________ main() { char c; while(x*y>160*120) { cout<<"imge boyutu : "<<x<<" "<<y<<endl <<"programi hizlandirmak ve hafiza problemi ile karsilasmamak icin"<<endl <<"imge boyutunu kucultebilirsiniz bunun icin ’E’ ye basiniz"<<endl; cin>>c; if(c==’E’) {imgekucult(); cout<<"yeni imge boyutu : "<<x<<" "<<y<<endl<<endl; } else break; } oku(); randmerk(); adimsayisi=0; //_________________4.adim _________________ while(1==1) { adimsayisi++; for(i=0; i<k; i++) *(test+i)=*(merkxy+i); merkuzak(); yenimerk(); ts=0; for(i=0; i<k; i++) ts+=*(test+i)==*(merkxy+i); if(ts==k) break; } //_________________4.adim sonu_________________ //bolutlenmıs ımgenın olusturulması s=0; for(i=0; i<x; i++) for(j=0; j<y; j++) { for(g=0; g<k; g++) if(*(ptr+(g*x*y)+s)) imge1(i,j)=g*255/(k-1); s++; } CImgDisplay disp1(imge1,"bölütlenmis imge"); cout<<"adimsayisi : "<<adimsayisi<<endl; getch(); } //_____________________________________________________________________ Açıklama:

Bu kütüphane ile, eğer bilgisayarınızda imagemagick programı yüklü değilse sadece *.bmp uzantılı imgeler üzerinde çalışabilirsiniz.

Öncelikle " CImg<unsigned char> image("C:/imgek.bmp"); " komutuyla kullanılacak olan imgenin programa tanıtılması gerekmektedir.

Bu programda k-ortalama uygulanacak imgenin boyut bilgileri kullanıldığı için
x=image.dimx();
y=image.dimy();

komutlarıyla imgenin boyularını öğrenip gerekli işaretçileri bu bilgilerle tanımlamalısınız. ( burada istenen küme sayısı ’k=5’ olarak alındı.)

Kullanılan bilgisayarda bellek problemi olmadığından eminseniz imgenin gerçek boyutlarıyla çalışmanız sadece programı yavaşlatır. Emin değilseniz ‘ imgekucult(); ‘ fonksiyonu ile imgeyi istediginiz boyutlara getirebilirsiniz.

Bu program algoritmanın anlaşılması ve programın takibinin kolay olması için adım adım fonksiyonlar halinde yazıldı.

programın akış diyagramı:

1.adım: Rastgele ’k’ adet küme merkezi için piksel değerleri belirlenir.

2.adım: Daha sonra imgedeki her pikselin merkez piksellere mutlak uzaklıkları belirlenir ve bir merkeze en yakın olan pikseller bir sınfta toplanır.

3.adım: Oluşan ’k’ adet kümenin ayrı ayrı elemalarının sayı değerleri toplamı eleman sayısına bölünerek yeni merkez piksel değerleri (sınıftaki piksel değerlerinin ortalaması) bulunur ve 2. adıma geri donulur.

4.adım: Eğer 3.adımda oluşan merkez piksel değerleri 2.adımdan gelen değerlerle aynı ise program sonlandırılır.

Programdan alınan sonuç:

Orjinal imgenin siyah-beyaz hali:



Bölütlenmiş imge:



Kaynaklar:

1. http://cimg.sourceforge.net
2. Mehmet SEZGİN, doktora tezi


Makale:
C++ ve K-Ortalama Algoritması ile İmge Bölütleme C++ ve C++.NET dili Ersin Özüağ
  • Yazılan Yorumlar
  • Yorum Yaz
ARA
12
2006
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor