Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Siyah-Beyaz Resim Üzerindeki Nesneleri Bulma (Hazır Olmayan Metotlarla MATLAB) -- http://www.bulentsiyah.com/siyah-beyaz-resim-uzerindeki-nesneleri-bulma-hazir-olmayan-metotlarla-matlab/
%Program başangıcı, görüntüyü yükleme
resimOrjinal = imread('BulentSiyah.jpg');
subplot(1,2,1);
imshow(resimOrjinal);
title('Orjinal Resim');
%Kırmızı,Yeşil ve Maviden oluşan renk dizilerini ile gri duruma dönüştürüldü.
resimsiyah=(resimOrjinal(:,:,1)/3)+(resimOrjinal(:,:,2)/3)+(resimOrjinal(:,:,3)/3);
%Gri olan Resimde belli bir eşik değerin altında kalan (50 olarak belirledim)
%renkleri logical olarak bir veya sıfır diye kodlamış oldu.
resimsiyah=resimsiyah<50;
%Logical olan dizi tipi üzerinde işlem yapmak yerine diziyi normal double
%dizi tipine dönüşümünü sağlandı.
resimsiyah=[resimsiyah.*1];
%etiket 2 den başlamasının sebebi 0 ve 1 değerleri zaten dizide mevcut
%bunlar haricindeki en küçük sayı 2 dir.
etiket=2;
%resimde 1 değerine sahip piksel bulunduğu müddetçe döngü işlemlere devam edicek.
while(find(resimsiyah==1))
%ilk bulduğu 1 pikselinin x ve y değerlerini alınacak.
[birx,biry] = find(resimsiyah==1,1);
% bu eşitlemenin sebebi komşularından biri daha önce etiketlenmiş
% mi yoksa sadece bir veya 0 varmı diye bakabilmek için değişkeni
% eşitledim.
ekle=etiket;
%ust (burada önem sırasına göre komşuları dizdim bu elemanın hemen
%üstündeki piksel daha önceden etiketlenmiş mi diye bakılıyor.)
if ~(resimsiyah(birx-1,biry)==1 || resimsiyah(birx-1,biry)==0)
ekle=resimsiyah(birx-1,biry);
end
%sol ust ( az önceki uste kıyasla daha önemli olan komşunun etiketi diye varmı bakılıyor.)
if ~(resimsiyah(birx-1,biry-1)==1 || resimsiyah(birx-1,biry-1)==0)
ekle=resimsiyah(birx-1,biry-1);
end
%sol (sol ust komşuluğa göre daha önemli olan sol taraftaki piksel
%etiketi varmı kontrolu yapılıyor.)
if ~(resimsiyah(birx,biry-1)==1 || resimsiyah(birx,biry-1)==0)
ekle=resimsiyah(birx,biry-1);
end
%sol alt ( En önemli komşu piksel etiketi var mı diye bakılıyor
%eğer varsa diğer iflere girse bile bu değeri alıcaktır.)
if ~(resimsiyah(birx+1,biry-1)==1 || resimsiyah(birx+1,biry-1)==0)
ekle=resimsiyah(birx+1,biry-1);
end
% tüm 4 lü komşulara bakıldı fakat ilk başta eşitlediğimiz ekle ve
% etiket değeri aynı mı diye bakılıcak. Çünkü komşuluklardan birine
% bile girmişse o zaman aynı olmazlar dolayısıyla resimde bu
% komşuların sahip olduğu etiketi almalıdır.
if ekle~=etiket
resimsiyah(birx,biry)=ekle;
else
resimsiyah(birx,biry)=ekle;
etiket=etiket+1;
end
end
% yukarıdaki döngüde aynı nesne birçok etikete sahip olabilir. bu durumu
% düzeltmek için etiketler arası uzaklık kontrolu yapılıyor. Böylece
% program aynı nesneye farklı iki etiket vermiş ise bunu uzaklık denklemi
% ile fark edip düzeltiyor. Böylece her nesne farklı bir etiket ile
% belirtilicek.
etiket=etiket-1;
while etiket>2
[a1,b1]=find(resimsiyah==etiket,1);
[a2,b2]=find(resimsiyah==etiket-1,1);
if sqrt((a1-a2).^2 + (b1-b2).^2)   <=20
resimsiyah(resimsiyah==etiket)=etiket-1;
end
etiket=etiket-1;
end
% Algoritmanın son adımı olan ekrana çizdirme işlemi burada
% gerçekleştirilir. Kenarlar bulunup direk çizdirilir. For döngüsü her
% seferinde bir tane nesne çizer böylece nesne sayısı kadar for döngüsü
% gerçekleşir.
subplot(1,2,2);
imshow(resimsiyah);
title('Bulunan Nesneler');
nesneetiketleri=unique(resimsiyah);
fprintf('Bulunan Toplam Nesne Sayısı=%d\n',length(nesneetiketleri)-1)
hold on
kenar=[];
for i = 2:length(nesneetiketleri)
while(find(resimsiyah== nesneetiketleri(i)))
[plotx,ploty] = find(resimsiyah== nesneetiketleri(i),1);
%ust kenarları bul
if  (resimsiyah(plotx-1,ploty)==0)
kenar=[kenar;plotx,ploty];
% sol kenarları bul
elseif (resimsiyah(plotx,ploty-1)==0)
kenar=[kenar;plotx,ploty];
%sağ kenarları
elseif (resimsiyah(plotx,ploty+1)==0)
kenar=[kenar;plotx,ploty];
%alt kenarları bul
elseif (resimsiyah(plotx+1,ploty)==0)
kenar=[kenar;plotx,ploty];
end
resimsiyah(plotx,ploty)=nesneetiketleri(i)+1;
end
plot(kenar(:,2),  kenar(:,1), 'b.')
kenar=[];
end
clear a1 a2 b1 b2 birx biry ekle etiket i kenar plotx ploty resimOrjinal resimsiyah nesneetiketleri;
disp('Nesneler Grafik Üzerinde İşaretlenmiştir.');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.