Etiket arşivi: iki resim arası fark

İki Resim Arasındaki Farkı Bulma

Bu yazımda Matlab’ın Image Processing Toolbox’ının içinde bulunan fonksiyonları kullanarak iki resim arasında bulunan farkları yuvarlak içine alarak aşağıdaki gibi göstermeye çalışacağım.

Burada amacımız ilk önce bir algoritma belirleyerek iki resim arasındaki farkı bulmak ve göstermektir. İlk önce farkları bulacağımız resimleri matlab ortamına aktarmamız gerekmektedir. Current File dikkate alınarak aşağıdaki iki resim altındaki kodlar ile matlab workspace’e aktarılır.
Iki Resim Arası Fark Bulma Matlab

planes1 = imread('planes1.jpg');
planes2 = imread('planes2.jpg');

Böylece resimlerimizi matlab ortamına aktarmış olduk. Resimleri görmek için imshow(planes1); komutunu kullanabiliriz. Resimleri dosyadan okumak ve göstermek için Matlab Image Processing Toolbox İle Resmi Bir Değişkene Atama isimli makalemi inceleyebilirsiniz.

Resimleri gösteren bir başka komut ise “imagesc(planes1);” dir. Bu komut resim üzerinde hiçbir değişiklik yapmamaktadır. Sadece resmi görsel olarak değişik renk tonlarında görmemize yardımcı olur.

Amacımıza ulaşmak için en iyi yöntem bu iki resmi birbirinden çıkarmaktır. Eğer bu iki resmi birbirinden çıkartırsak üst üste gelen pixel değerleri aynı ise 0 değerini verecektir yani fark yoktur ( Siyah Renk ) . Eğer üst üste gelen pixel değerleri arasındaki fark sıfırdan büyükse , o pixel için bir değişiklik olduğu anlamına gelir . Fark ne kadar büyükse pixel değeri o kadar beyaz renke yaklaşır. Bunun için kullanmamız gereken komut :

D = imabsdiff(planes1,planes2);

Yukarıdaki resimde de görüldüğü gibi resimler üst üste getirilip çıkarıldığında , farklı olan pixeller daha beyaz ve belirgin oldu. Image Processing binary resimler üzerinde gerçekleşebilir. Bu yüzden gri tonlamalı bu resmi ( D ) binary bir resim haline getirmemiz gerekiyor. Bunun için bir eşik değeri kullanmamız gerek . Bu eşik değerinin üstünde kalan değerleri 1’e ( Beyaz ) , altında kalan değerleri ise 0’a ( Siyah ) atayarak resmi binary hale getirelim. Bu yönteme Image Thresholding denir. İlk önce eşik değeri olarak 50 seçelim .

Dbw = D>50;
imshow(Dbw);

Üstteki resimde görüldüğü gibi eşik değeri 50 seçildiğinde farklı olan uçaklar tam net belirlenememektedir. Bu şekilde farkları bulmak zorlaşacaktır. Şimdi biraz daha büyük bir eşik değeri seçelim . Örneğin 55 olsun.

Dbw = D>55;
imshow(Dbw);

Eşik değeri arttıkça büyük uçağın belirlenmesi zorlaşıyor. Biraz da küçük değerler deneyelim.

Dbw = D>20;
imshow(Dbw);

Artık uçaklarımız daha belirgin. Bu uçakları nesne olarak algılatabilmek için etraflarında bulunan küçük beyaz pixelleri ( noise adı verilir ) kaldırmamız gerekir .

Dbw_open = bwareaopen(Dbw,30);
imshow(Dbw_open);

bwareaopen ile 30 pixelden daha az sayıda pixele sahip olan nesneler kaldırılıyor. Böylece Dbw_open resminin görünümü aşağıdaki gibi olur.

Artık uçaklarımız çok daha belirgin ve tanınabilir oldu. Şimdi aşağıdaki kodları inceleyelim.

se1 = strel('square',3);
Dbw_dilate = imdilate(Dbw_open,se1);
imshow(Dbw_dilate);

Bu kodlar ile yakınlarda bulunan pixel değerleri birleştirilir. strel kenarı 3 birimlik kare biçiminde bir yapı oluşturur ve imdilate ile bu kare içinde olan pixeller birleştirilir. Böylece Dbw_dilate resmi şu hali alır .

Artık uçaklarımız onları nesne olarak tanımlayabilmemiz için yeterli belirginliğe ulaştı .

[L,NumDiffs] = bwlabel(Dbw_dilate);
s = regionprops(L,'all');
c = [s.Centroid];

bwlabel ile resmimizdeki nesneleri belirliyoruz . L içine nesnelerin pixel değerleri , NumDiffs içine ise kaç tane nesne olduğu atılıyor . Burada NumDiffs değeri 3’tür. regionprops ile L’de bulunan nesnelerin tüm özellikleri ( all ) alınıyor . Merkezleri , alanları , çevrelemek için kullanılan bounding box değerleri gibi bir sürü değer s değişkenine atanıyor. Farklı olan yerlerin üzerine yuvarlak çizebilmemiz için merkez değerlerini de c değişkenine atıyoruz.

Artık yuvarlakları çizmeye başlayabiliriz.

figure;
imshow(planes1);
hold on;
x = c(1:2:end);
y = c(2:2:end);
plot(x,y,'yo','MarkerSize',20,'LineWidth',4);
figure;
imshow(planes2);
hold on;
x = c(1:2:end);
y = c(2:2:end);
plot(x,y,'yo','MarkerSize',20,'LineWidth',4);

Kodun tamamını indirmek için “Iki Resim Arası Fark Bulma Matlab Kodu” bağlantısına tıklayabilirsiniz. Uzantısını .m olarak değiştirerek Matlab’da direk çalıştırabilirsiniz.

Paylaş / Yer imi