Last active
October 20, 2017 13:23
-
-
Save bulentsiyah/c894f528d52351851b6e9838ad6db0ed to your computer and use it in GitHub Desktop.
İki ve Üç Noktalı ile Kist Bulma (Matlab) -- http://www.bulentsiyah.com/iki-ve-uc-noktali-ile-kist-bulma-matlab/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% Bülent SİYAH 081503030 Sayısal Görüntü İşleme | |
% 5.Ödev iki ve Üç Noktalı Yöntem ile Kist Bulma | |
% Algoritmada adımlar şöyledir. Nokta sayısını belirlemek için 25 satırdaki | |
% ginput parametresine alınacak nokta sayısı yazmak yeterlidir. Algoritma | |
% bu haliyele kullanıcıdan 2 nokta seçmesini bekleyecek. | |
function ikiveUcNoktaliNesneBulma() | |
%Resim yüklenir. | |
resimOrjinal = imread('ultra4.png'); | |
%gaussıan filtresinden geçirilir. 5x5 luk maske kullanılmıştır. | |
hGaussionFiltresi=fspecial('gaussian',5,5); | |
gaussianFiltresi=imfilter(resimOrjinal,hGaussionFiltresi,'replicate'); | |
% Resim gri tonlara dönüştürülmüştür. | |
resimGri=rgb2gray(gaussianFiltresi); | |
% Aşındırma Filtresi uygulanmıştır. Kesinlikler netleşmesi için. | |
% disk şeklinde ve 5x5 lük maske ile yapılmıştır. | |
se=strel('disk',5); | |
resimAsindirma=imerode(resimGri,se); | |
% Genişletme Filtresi ile aşınmış resimde nesneler daha cok ayrılarak | |
% kenarlar netleşmiştir. Genişletme için 7x7 lik maske kullanılmıştır. | |
se=strel('disk',7); | |
resimGenisletme=imdilate(resimAsindirma,se); | |
%Ekrandan nokta alma kısmı: | |
figure(1); | |
imshow(resimOrjinal); | |
title('Resimde Kistin Bulunduğu Yerden Birkaç Nokta Seçiniz'); | |
%Noktanın sayısı,yeri ve değerinin aldığı kısım: | |
[x,y]=ginput(2); | |
noktaX=uint32(x); | |
noktaY=uint32(y); | |
%Resim üzerinde satır, sütun şeklinde noktanın yerine bakılır. Bu yüzden | |
%Y,X şeklinde değeri yerleştirildi. | |
%formul işlemlerinde kullanılması için double tipine dönüştürlür. | |
noktaDegeri=0; | |
for i=1:length(noktaX) | |
deger=resimGenisletme(noktaY(i),noktaX(i)); | |
deger=double(deger); | |
noktaDegeri=noktaDegeri+deger; | |
end | |
noktaDegeri=noktaDegeri/length(noktaX); | |
noktaDegeri=double(noktaDegeri); | |
% Alınan noktaya göre eşik değer belirlenicek böylece resmin içindeki | |
% nesneler ayrılmış olucak. Eğer ortalama esik değer kullanılırsa bu | |
% nesneler için ayrıt edici olmaz. Bunun dışında resme uygulanan filtreler | |
% ile birbirine yakın tondaki nesneler ile bir birine bitişik olan ayrı | |
% nesneler birbirinden ayrıldı. Böylece alınan noktaya ait nesne belirleme | |
% imkanı oluştu. | |
esikdegerNormal = graythresh(resimGenisletme); | |
% esikdegerNormal değişkeni tüm resmin eşik değerini gösteriyor. | |
% noktaDegeri değişkeni ise noktanın değerini gösteriyor. Burada | |
% noktanın değerinin 256 oranı noktanın eşik değerini verecektir. | |
% Bunun için formül=(normal eşik değer+ 2* noktanındeğeri/256)/3 böylece | |
% seçilen nokta ile genel eşik değerinin arasında ve seçilen noktaya daha | |
% yakın bir değerle alınarak resim siyah beyaz logical değerlere dönüştürülecek. | |
formul=(esikdegerNormal+1*(noktaDegeri/256) )/2; | |
resimSiyahbeyaz=im2bw(resimGenisletme,formul); | |
%Resim siyah beyaza dönüştürüldükten sonra bwlabel ile nesneler ayırt | |
%edilecek. Bunu yapabilmek için resmin siyah arkaplan beyaz zemin üzerine | |
%olması gerekir. Bu yüzden dönüştürülüyor. | |
resimSiyahbeyaz=~(resimSiyahbeyaz); | |
% bwlabel resmin yanındaki ikinci parametre 4 veya 8 dışında bir değer | |
% olamaz bu komşuluklarına göre düzenlediği için hassasiyeti belirler. | |
etiketlenmisNesneler = bwlabel(resimSiyahbeyaz,4); | |
% Seçilen nokta etiketlenme işlemi sonrası hangi değere sahip olduğuna | |
% bakılır. | |
noktaEtiketDegeri=etiketlenmisNesneler(noktaY(1),noktaX(1)); | |
% Seçilen noktanın etiket değeri dışındakileri yok edilir. | |
etiketlenmisNesneler(find(etiketlenmisNesneler~=noktaEtiketDegeri))=0; | |
% Nesnenin kenarları bulunup çizilerek gösterilme komutları: | |
figure(2); | |
% Ekranda iki resim görüntülenip solda orjinal hali, sağda nesnenin | |
% etiketli hali gösterilir. | |
subplot(1,2,1); | |
imshow(resimOrjinal); | |
title('Resmin Orjinali'); | |
subplot(1,2,2); | |
imshow(resimOrjinal); | |
title('Tek Noktalı Yöntem ile Nesnenin Yeri'); | |
nesneninCevresi = bwboundaries(etiketlenmisNesneler,'noholes'); | |
hold on | |
nesnem = nesneninCevresi{1}; | |
plot(nesnem(:,2), nesnem(:,1), 'r', 'LineWidth', 2); | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment