Karinca Koloni Algoritmasi Ile Kenar Tespit Yontemi

Bu makalemde, karinca koloni algoritmasinin kenar bulmayla ilgili matlab kodlari, ekran goruntuleri ve basari sonuclarini inceleyebilirsiniz.
Bu calisma Yalova Universitesi - Fen Bilimleri Enstitusu - Bilgisayar Muhendisligi Ana Bilim Dali - Bilgisayarli Gorme dersi icin hazirlanmistir.
KKA Kullanilarak Goruntulerde Kenar Tespit Yontemi Kullanimi
Bu calismamizda, goruntu uzerindeki kenarlarin tespit edilmesinde cok saglikli sonuclar alinabildigi gibi nadir de olsa basarisiz sonuclarda alabiliyoruz. Calismada zamandan tasarruf edebilmek adina, kullanilan goruntuler 128X128 boyutlarinda ve 8 bitlik olacak sekilde hazirlanmistir. Bu istege bagli olarak baska calismalarda degistirilebilir. Calismada goruntuler uzerinde islemleri en hizli sekilde gerceklestirebilmek adina Matlab programinin 7.9.0 / R2009b versiyonu kullanilmistir. Asagidaki goruntulerde iterasyon sayisi 3 olarak kullanilarak kenar tespit algoritmasi ile almis oldugumuz goruntuler bulunmaktadir. Kullanilan toplam karinca sayilarini goruntunun satir ve sutun pixel degerlerine gore belirliyoruz. Burada 128 X 128 piksel degerlerine uygun yaklasik olarak 300 degeri verilmektedir. Varsayilan olarak alpha ve beta degerlerini 1 verilir. Phi degerleri 0 - 0.1 deger araliklarindayken, Rho degerleri 0 - 1 deger araliklarinda kullanilabilir.
Edge Detection By Ant Colony Algorithm Uygulamasinin Ekran Goruntuleri;
Matlab Gui Tasarimi
Bu calismada, Matlab'in gui tool'u kullanilarak kullanici arayuzu ile algoritmanin onemli verilerini kullanicidan isteniyor.
Formun uzerinde push button yardimiyla kullanicidan algoritmasi uygulanacak image isteniyor. Secilen image, Axes1 icerisinde gozukmesi icin ilgili kodlar arka planda yaziliyor. Gui tool'una ait slider'lar yardimiyla kullanicidan olasilik formullerinde kullanilacak olan alpha, beta, rho ve phi sayilari isteniyor. Edit text'ler yardimiyla algoritmanin iterasyon sayisini ve yine image'in boyutlarina uygun olacak sekilde algoritmada kullanilacak karinca sayisinin girisleri yapiliyor. Uygulamanin calistirilabilmesi icin, Push button yardimiyla secilen image uzerinde karinca algoritmasi uygulaniyor. Ilgili image'in algoritma uygulanmis hali hemen Axes1'in yaninda bulunan Axes2 icerisinde kullaniciya sonucu sunuluyor. Algoritmanin calisma suresi ise static text'lerle kullaniciya raporlamis oluyoruz.
Uygulamanin Calistirilmis Hali
Bu calismada, kullanilan goruntuler 128X128 boyutlarinda olup; karinca sayisi, iterasyon sayisi, feromon buharlasma kat sayisi rho degeri ile feromon yok olma kat sayisi phi degerlerinin degisimleri ile goruntu uzerinde farkli kenar tespit sonuclari tespit edebiliyoruz.
Matlab Kodu;
function varargout = AntColonyAlgorithmWithEdgeDetectionGui(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @AntColonyAlgorithmWithEdgeDetectionGui_OpeningFcn, ...
'gui_OutputFcn', @AntColonyAlgorithmWithEdgeDetectionGui_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
= gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function AntColonyAlgorithmWithEdgeDetectionGui_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
function varargout = AntColonyAlgorithmWithEdgeDetectionGui_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function edit1_Callback(hObject, eventdata, handles)
function edit1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit2_Callback(hObject, eventdata, handles)
function edit2_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function pushbutton1_Callback(hObject, eventdata, handles)
global goruntu dosyaAdi
dosyaAdi = imgetfile;
goruntu = double(imread(dosyaAdi))./255;
h = handles.axes1;
axes(h);
imshow(goruntu);
function pushbutton2_Callback(hObject, eventdata, handles)
msgbox('Secilen image icin algoritma calistiriliyor... Lutfen bekleyin... ','Dikkat !','warn');
global goruntu dosyaAdi alpha beta phi rho
= size(goruntu); ToplamIterasyonSayisi=str2num(get(handles.edit1, 'String')); tic; goruntuKopyasi = zeros(size(goruntu)); goruntuKopyasi_normal = 0; for satir =1:goruntuSatir for sutun=1:goruntuSutun taslak1 =
; taslak2 =
; taslak0 = find(taslak1(:,1)>=1 & taslak1(:,1)<=goruntuSatir & taslak1(:,2)>=1 & taslak1(:,2)<=goruntuSutun & taslak2(:,1)>=1 & taslak2(:,1)<=goruntuSatir & taslak2(:,2)>=1 & taslak2(:,2)<=goruntuSutun); taslak11 = taslak1(taslak0, :); taslak22 = taslak2(taslak0, :); taslak00 = zeros(size(taslak11,1)); for i = 1:size(taslak11,1) taslak00(i) = abs(goruntu(taslak11(i,1), taslak11(i,2)) - goruntu(taslak22(i,1), taslak22(i,2))); end if size(taslak11,1) == 0 goruntuKopyasi(satir, sutun) = 0; goruntuKopyasi_normal = goruntuKopyasi_normal + goruntuKopyasi(satir, sutun); else sigma = 10; taslak00 = sin(pi .* taslak00./2./sigma); goruntuKopyasi(satir, sutun) = sum(sum(taslak00.^2)); goruntuKopyasi_normal = goruntuKopyasi_normal + goruntuKopyasi(satir, sutun); end end end goruntuKopyasi = goruntuKopyasi./goruntuKopyasi_normal; goruntuKopyasi = goruntuKopyasi.*100; feromon = 0.0001 .* ones(size(goruntu)); ToplamKarincaSayisi = round(sqrt(goruntuSatir*goruntuSutun)); KarincaninKonumu = zeros(ToplamKarincaSayisi, 2); rand('state', sum(clock)); geciciToplamKarincaSayisi = rand(ToplamKarincaSayisi, 2); KarincaninKonumu(:,1) = round(1 + (goruntuSatir-1) * geciciToplamKarincaSayisi(:,1)); KarincaninKonumu(:,2) = round(1 + (goruntuSutun-1) * geciciToplamKarincaSayisi(:,2)); arananYol = '8'; if goruntuSatir*goruntuSutun == 128*128 deger = 40; elseif goruntuSatir*goruntuSutun == 256*256 deger = 30; elseif goruntuSatir*goruntuSutun == 512*512 deger = 20; end hafizaUzunlugu = round(rand(1).*(1.15*deger-0.85*deger)+0.85*deger); KarincaHafizasi = zeros(ToplamKarincaSayisi, hafizaUzunlugu); ToplamAdimSayisi = str2num(get(handles.edit2, 'String')); for IterasyonSayisi = 1:ToplamIterasyonSayisi deltaFeromon = zeros(goruntuSatir, goruntuSutun); for AdimSayisi = 1:ToplamAdimSayisi secilenDeltaFeromon = zeros(goruntuSatir, goruntuSutun); for SecilenKarinca = 1:ToplamKarincaSayisi SecilenKarincaSatir = KarincaninKonumu(SecilenKarinca,1); SecilenKarincaSutun = KarincaninKonumu(SecilenKarinca,2); if arananYol == '4' satir = SecilenKarincaSatir; sutun = SecilenKarincaSutun; geciciYolAraliklari =
; elseif arananYol == '8' satir = SecilenKarincaSatir; sutun = SecilenKarincaSutun; geciciYolAraliklari =
; end geciciToplamKarincaSayisi = find(geciciYolAraliklari(:,1)>=1 & geciciYolAraliklari(:,1)<=goruntuSatir & geciciYolAraliklari(:,2)>=1 & geciciYolAraliklari(:,2)<=goruntuSutun); yolAraliklari = geciciYolAraliklari(geciciToplamKarincaSayisi, :); karincaninGecisOlasiligi_v = zeros(size(yolAraliklari,1),1); karincaninGecisOlasiligi_p = zeros(size(yolAraliklari,1),1); for i = 1:size(yolAraliklari,1) geciciToplamKarincaSayisi = (yolAraliklari(i,1)-1)*goruntuSutun + yolAraliklari(i,2); if length(find(KarincaHafizasi(SecilenKarinca,:)==geciciToplamKarincaSayisi))==0 karincaninGecisOlasiligi_v(i) = goruntuKopyasi(yolAraliklari(i,1), yolAraliklari(i,2)); karincaninGecisOlasiligi_p(i) = feromon(yolAraliklari(i,1), yolAraliklari(i,2)); else karincaninGecisOlasiligi_v(i) = 0; karincaninGecisOlasiligi_p(i) = 0; end end if (sum(sum(karincaninGecisOlasiligi_v))==0) | (sum(sum(karincaninGecisOlasiligi_p))==0) for i = 1:size(yolAraliklari,1) geciciToplamKarincaSayisi = (yolAraliklari(i,1)-1)*goruntuSutun + yolAraliklari(i,2); karincaninGecisOlasiligi_v(i) = goruntuKopyasi(yolAraliklari(i,1), yolAraliklari(i,2)); karincaninGecisOlasiligi_p(i) = feromon(yolAraliklari(i,1), yolAraliklari(i,2)); end end karincaGecisOlasiligi = (karincaninGecisOlasiligi_v.^alpha) .* (karincaninGecisOlasiligi_p.^beta) ./ (sum(sum((karincaninGecisOlasiligi_v.^alpha) .* (karincaninGecisOlasiligi_p.^beta)))); rand('state', sum(100*clock)); geciciToplamKarincaSayisi = find(cumsum(karincaGecisOlasiligi)>=rand(1), 1); SiradakiKarincaSatir = yolAraliklari(geciciToplamKarincaSayisi,1); SiradakiKarincaSutun = yolAraliklari(geciciToplamKarincaSayisi,2); if length(SiradakiKarincaSatir) == 0 SiradakiKarincaSatir = SecilenKarincaSatir; SiradakiKarincaSutun = SecilenKarincaSutun; end KarincaninKonumu(SecilenKarinca,1) = SiradakiKarincaSatir; KarincaninKonumu(SecilenKarinca,2) = SiradakiKarincaSutun; secilenDeltaFeromon(KarincaninKonumu(SecilenKarinca,1), KarincaninKonumu(SecilenKarinca,2)) = 1; if AdimSayisi <= hafizaUzunlugu KarincaHafizasi(SecilenKarinca,AdimSayisi) = (KarincaninKonumu(SecilenKarinca,1)-1)*goruntuSutun + KarincaninKonumu(SecilenKarinca,2); elseif AdimSayisi > hafizaUzunlugu KarincaHafizasi(SecilenKarinca,:) = circshift(KarincaHafizasi(SecilenKarinca,:),<0 -1>
); KarincaHafizasi(SecilenKarinca,end) = (KarincaninKonumu(SecilenKarinca,1)-1)*goruntuSutun + KarincaninKonumu(SecilenKarinca,2); end feromon = ((1-rho).*feromon + rho.*secilenDeltaFeromon.*goruntuKopyasi).*secilenDeltaFeromon + feromon.*(abs(1-secilenDeltaFeromon)); end deltaFeromon = (deltaFeromon + (secilenDeltaFeromon>0))>0; feromon = (1-phi).*feromon; end end hesapla = histogramAyarlama(feromon); set(handles.text6, 'String', 'Image islendi...'); imwrite(uint8(abs((feromon>=hesapla).*255-255)), gray(256),
, 'bmp'); goster = handles.axes2; axes(goster); imshow(
);
set(handles.text11, 'String', 'Toplam sure : ');
set(handles.text7, 'String', toc);
set(handles.text12, 'String', 'Saniyedir.');
toc
function gonder = histogramAyarlama(goruntu)
goruntu = goruntu(:);
=hist(goruntu,256); i=1; kumulatif=cumsum(sayac); T(i)=(sum(N.*sayac))/kumulatif(end); kumulatif2=cumsum(sayac(N<=T(i))); MBT=sum(N(N<=T(i)).*sayac(N<=T(i)))/kumulatif2(end); kumulatif3=cumsum(sayac(N>T(i))); MAT=sum(N(N>T(i)).*sayac(N>T(i)))/kumulatif3(end); i=i+1; T(i)=(MAT+MBT)/2; Threshold=T(i); while abs(T(i)-T(i-1))>=1 kumulatif2=cumsum(sayac(N<=T(i))); MBT=sum(N(N<=T(i)).*sayac(N<=T(i)))/kumulatif2(end); kumulatif3=cumsum(sayac(N>T(i))); MAT=sum(N(N>T(i)).*sayac(N>T(i)))/kumulatif3(end); i=i+1; T(i)=(MAT+MBT)/2; Threshold=T(i); end gonder = Threshold; function slider1_Callback(hObject, eventdata, handles) function slider1_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',<.9 .9 .9>
); end function slider2_Callback(hObject, eventdata, handles) global alpha alpha = get(hObject,'Value'); alpha = num2str(alpha); set(handles.edit3, 'String', alpha); function slider2_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',<.9 .9 .9>
); end function slider3_Callback(hObject, eventdata, handles) global beta beta = get(hObject,'Value'); set(handles.edit4, 'String', beta); function slider3_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',<.9 .9 .9>
); end function slider4_Callback(hObject, eventdata, handles) global rho rho = get(hObject,'Value'); set(handles.edit5, 'String', rho); function slider4_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',<.9 .9 .9>
); end function slider5_Callback(hObject, eventdata, handles) global phi phi = get(hObject,'Value'); set(handles.edit6, 'String', phi); function slider5_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',<.9 .9 .9>
);
end
function edit3_Callback(hObject, eventdata, handles)
function edit3_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit4_Callback(hObject, eventdata, handles)
function edit4_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit5_Callback(hObject, eventdata, handles)
function edit5_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit6_Callback(hObject, eventdata, handles)
function edit6_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function figure1_CreateFcn(hObject, eventdata, handles)
Diger Kenar Tespit Algoritmalarindaki Goruntu Sonuclariyla Kiyaslama
goruntu = imread('KameraliAdam.bmp');
robertFiltresi = edge(goruntu,'roberts');
prewittFiltresi = edge(goruntu,'prewitt');
sobelFiltresi = edge(goruntu,'sobel');
LoGFiltresi = edge(goruntu,'log');
cannygoruntu = edge(goruntu,'canny');
figure
subplot(231), imshow(goruntu), title('Orjinal Goruntu')
subplot(232), imshow(robertFiltresi) , title('Robert Cross Filtresi')
subplot(233), imshow(prewittFiltresi), title('Prewitt Filtresi')
subplot(234), imshow(sobelFiltresi), title('Sobel Filtresi')
subplot(235), imshow(LoGFiltresi), title('LoG Filtresi')
subplot(236), imshow(cannygoruntu), title('Canny Filtresi')
Ekran Goruntuleri;
Keyifli Calismalar Dilerim



Yorumlar