Sayısal görüntülerde geometrik şekil bulmanın görüntü işlemede birçok uygulama alanı bulunmaktadır. İris bulma, plaka bulma, saha üzerinde top bulma ve benzeri uygulamalar buna örnek olarak verilebilir. Bir kamera veya benzeri bir algılayıcı yardımı ile elde edilen görüntülerdeki şekillerin her zaman eksiksiz yer alması mümkün olmamaktadır ve şekillerdeki kopukluklar şekil tespitini zorlaştırmaktadır. Bu noktada hough dönüşümü ile görüntünün tamamının görülebilir olmadığı durumlarda da olası şekiller tespit edilebilmektedir. Bu çalışmada şekil bulmada kullanılan hough dönüşümünün dairesel şekil tespitinde kullanımı üzerinde durulmuştur. Hough dönüşümü temelde kenarların olası geometrik şekilleri oylaması mantığı ile çalışmaktadır. Hough dönüşümü kullanılarak şekil tespiti genel olarak aşağıdaki adımlar ile özetlenebilir:
Bu çalışmada kaynak görüntüler üzerinde dairesel şekil arandığından kullanılan akümülatör matrisi çemberin merkezi olan [a,b] noktaları ve yarıçap değeri [r] olmak üzere üç boyuttan oluşmaktadır. Belirlenen aralıktaki yarıçap değerleri için çember merkezi çember denkleminden faydalanılarak bulunabilir.
Kullanılan açı değeri 0 – 2π aralığında değiştirilerek bir noktanın, yarıçapı bilinen bir çember üzerinde yer alıp almadığı tespit edilebilmektedir. Yarıçap değerinin bilinmesi durumunda çember merkezini ifade eden [a,b] değerlerinin iki boyutlu bir akümülatör matrisi üzerinde tutulması yeterli olacaktır. Yarıçap değerinin bilinmemesi veya bir aralık halinde olması durumunda ise olası yarıçap değerleri bir döngü içerisinde denenerek merkez koordinatları ve yarıçap uzunluğu boyutlarına (a,b,r) karşılık gelen akümülatör değerleri artırılarak elde edilen üç boyutlu akümülatör matrisi elde edilebilmektedir.
matlab hough transform kodu için tıklayınız.
hough fonksiyonu için tıklayınız
imfindcircles ve viscircles olmak üzere iki yeni fonksiyon kullanacağız.
:
function hough_yuvarlak_bulma() RGB = imread('nesneler.jpg'); % resim sayısal olarak yüklendi I = rgb2gray(RGB); % resim tek renk olan gri tona indirgendi. esik_degeri = graythresh(I); % resmin eşik değeri belirlendi. bw = im2bw(I,esik_degeri); % resmin eşik değerine göre bir ve sıfırdan oluşan siyah beyaz formata çevrildi. bw = bwareaopen(bw, 50); % nesnelerin elemanları arasındaki boşlukları birleştirecek birlestirici = strel('square',3); bw = imdilate(bw,birlestirici); imshow(bw); Rmin = 8; Rmax = 30; % belirtilen yarı çaplarda aydınlık yuvarlaklar bulunmaktadır. [aydinlik_merkezi, aydinlik_yaricapi] = imfindcircles(bw,[Rmin Rmax],'ObjectPolarity','bright'); % belirtilen yarı çaplarda karanlık yuvarlaklar bulunmaktadır. [karanlik_merkezi, karanlik_yaricapi] = imfindcircles(bw,[Rmin Rmax],'ObjectPolarity','dark') % bulunan aydınlık ve karanlık çember çiziliyor. viscircles(aydinlik_merkezi, aydinlik_yaricapi,'EdgeColor','b'); viscircles(karanlik_merkezi, karanlik_yaricapi,'LineStyle','--'); end