Merhaba. Aranızda YOLO kullanan, ya da herhangi bir şekilde görüntü işlemeyle ilgilenen olmuşsa obje ve sınır tespitlerini yapan yapay zeka modelleriyle karşılaşmıştır. Obje tespiti birden fazla gelişmiş tekniğin birleşimiyle yapılan bir uygulama olsa da bu rehberde çok basit düzeydeki bir görüntüde kenar-köşe tespiti yapmaya çalışalım. Görüntüler, bilgisayar hafızalarında basit matrisler olarak tutulur, kare bir görüntü için 256x256 lık bir matris gibi, ve her bir pikseldeki görüntü bilgisi matrisin bir elemanı olarak yer alır. Matrisin çok katmanlı olup problemi karmaşıklaştırmaması için tek katmanlı, siyah beyaz bir görüntü olduğunu düşünelim.
Görüntü üzerindeki objeler hakkında genelgeçer bir bilgi şudur, süregelen bir arkaplan görüntüsünden sonra objenin konumu geldiğinde görüntü keskin şekilde değişir. Bu felsefeye dayanarak eğer görüntü matrisi üzerindeki maksimum değişikliklerin olduğu yerleri hesaplayabilirsek görüntü üzerindeki kenar ve köşe noktaları hesalayabiliriz. Peki, değişiklik deyince aklımıza ne geliyor? Vektör kalkülüsü ve gradientler. Bu rehberde imaj üzerindeki gradientleri hesaplamaya çalışacağız.
Bilgisayardaki görüntü üzerinde kayan bir işlem yapılacaksa -görüntünün tamamı veya bir kısmı taranacaksa- konvolüsyon işlemi kullanılır. Bir görüntüyü hem yatay hem dikey şekilde konvolüsyondan geçirmek için 2 farklı matrise -bunlara kernel denir- ihtiyaç duyarız. Şimdi 2 tane kernel oluşturalım ve pikseller üzerinde kayarken konvolüsyon işleminin sonucunun ne kadar değişiklik göstereceğini hesaplayalım.
Bu görselde Prewitt Kernelleri olarak da bilinen Gx filtresi yatay eksendeki değişimleri hesaplamamıza yardımcı olurken Gy filtresi ise dikey değişimleri hesaplamamıza yardımcı olacak. Görseli okuyalım ve iki kernel için matrisleri Python dilinde oluşturalım,
Bu iki filtreyi görüntü üzerinde konvolüsyondan geçirdiğimizde bir görüntü bize yataydaki, diğer görüntü ise dikeydeki değişimlerin grafiğini verecektir. Bu değişimlerin maksimum olduğu yerlerin ise objenin sınırları olduğunu söyleyebiliriz.
Bilmeyenler için, burada konvolüsyon fonksiyonuna eklediğim mode="same" argümanı konvolüsyon sonucu görüntü boyutunun değişmemesi için M kernel boyutu olmak üzere (örneğimizde 3) görüntünün her tarafına (M-1)/2 adet piksel eklenmesi için kullanılır. Bu pikseller en yakındaki piksellerin ortalaması da olabilir, boş piksel de olabilir veya farklı metodlarla üretilebilir ama konu dışı olduğu için üstünde durmayacağım. Bu iki gradient çıktısını tıpkı bir görüntü gibi yazdıracak olursak aşağıdaki sonuçları alırız
X gradyenlerinin görüntüsü
Y gradyenlerinin görüntüsü.
Resimlerden açıkça görüleceği üzere bir gradyen yatay bileşendeki, diğer gradyen dikey bileşendeki en büyük değişimleri -sınırları- bize işaretliyor. Şimdi ikisini birleştirmek için Gradyen vektörünün total uzunluğuna bakalım ve onu yazdıralım.
Artık görüntümüzdeki en net objenin sınırlarını elde ettik. Daha gürültüsüz görüntü için sonuç görselini Gaussian filtreden geçirebiliriz, ama bu rehberde onu konu almayacağım. Bilgisayarlar bu aşamadan sonra elde edilen sonuç görüntüsünü özellik çıkarımında -feature extraction- o özellikleri de eşleştirmede -feature matching- kullanır. Buraya kadar okuduğunuz için teşekkür ederim
Görüntü üzerindeki objeler hakkında genelgeçer bir bilgi şudur, süregelen bir arkaplan görüntüsünden sonra objenin konumu geldiğinde görüntü keskin şekilde değişir. Bu felsefeye dayanarak eğer görüntü matrisi üzerindeki maksimum değişikliklerin olduğu yerleri hesaplayabilirsek görüntü üzerindeki kenar ve köşe noktaları hesalayabiliriz. Peki, değişiklik deyince aklımıza ne geliyor? Vektör kalkülüsü ve gradientler. Bu rehberde imaj üzerindeki gradientleri hesaplamaya çalışacağız.
Bilgisayardaki görüntü üzerinde kayan bir işlem yapılacaksa -görüntünün tamamı veya bir kısmı taranacaksa- konvolüsyon işlemi kullanılır. Bir görüntüyü hem yatay hem dikey şekilde konvolüsyondan geçirmek için 2 farklı matrise -bunlara kernel denir- ihtiyaç duyarız. Şimdi 2 tane kernel oluşturalım ve pikseller üzerinde kayarken konvolüsyon işleminin sonucunun ne kadar değişiklik göstereceğini hesaplayalım.
Bu görselde Prewitt Kernelleri olarak da bilinen Gx filtresi yatay eksendeki değişimleri hesaplamamıza yardımcı olurken Gy filtresi ise dikey değişimleri hesaplamamıza yardımcı olacak. Görseli okuyalım ve iki kernel için matrisleri Python dilinde oluşturalım,
Python:
from scipy.signal import convolve2d
import matplotlib.pyplot as plt
import numpy as np
import cv2
image_matrix = cv2.imread("image_gray.jpg")
image_matrix = cv2.cvtColor(image_matrix, cv2.COLOR_BGR2GRAY)
image_matrix = np.array(image_matrix)
P_x = np.array([
[-1,0,1],
[-1,0,1],
[-1,0,1]
], dtype=int)
P_y = np.array([
[-1, -1, -1],
[0, 0, 0],
[1, 1, 1]
], dtype=int)
Bu iki filtreyi görüntü üzerinde konvolüsyondan geçirdiğimizde bir görüntü bize yataydaki, diğer görüntü ise dikeydeki değişimlerin grafiğini verecektir. Bu değişimlerin maksimum olduğu yerlerin ise objenin sınırları olduğunu söyleyebiliriz.
Python:
P_x = np.array([
[-1,0,1],
[-1,0,1],
[-1,0,1]
], dtype=int)
P_y = np.array([
[-1, -1, -1],
[0, 0, 0],
[1, 1, 1]
], dtype=int)
Grad_x = convolve2d(image_matrix, P_x, mode='same')
Grad_y = convolve2d(image_matrix, P_y, mode="same")
Bilmeyenler için, burada konvolüsyon fonksiyonuna eklediğim mode="same" argümanı konvolüsyon sonucu görüntü boyutunun değişmemesi için M kernel boyutu olmak üzere (örneğimizde 3) görüntünün her tarafına (M-1)/2 adet piksel eklenmesi için kullanılır. Bu pikseller en yakındaki piksellerin ortalaması da olabilir, boş piksel de olabilir veya farklı metodlarla üretilebilir ama konu dışı olduğu için üstünde durmayacağım. Bu iki gradient çıktısını tıpkı bir görüntü gibi yazdıracak olursak aşağıdaki sonuçları alırız
X gradyenlerinin görüntüsü
Y gradyenlerinin görüntüsü.
Resimlerden açıkça görüleceği üzere bir gradyen yatay bileşendeki, diğer gradyen dikey bileşendeki en büyük değişimleri -sınırları- bize işaretliyor. Şimdi ikisini birleştirmek için Gradyen vektörünün total uzunluğuna bakalım ve onu yazdıralım.
Python:
Grad = np.sqrt(Grad_x ** 2 + Grad_y ** 2)
cv2.imwrite("boundaries.jpg", Grad)
Artık görüntümüzdeki en net objenin sınırlarını elde ettik. Daha gürültüsüz görüntü için sonuç görselini Gaussian filtreden geçirebiliriz, ama bu rehberde onu konu almayacağım. Bilgisayarlar bu aşamadan sonra elde edilen sonuç görüntüsünü özellik çıkarımında -feature extraction- o özellikleri de eşleştirmede -feature matching- kullanır. Buraya kadar okuduğunuz için teşekkür ederim

