Nesne Adedi Bulan HALCON Kodu, erosion ve dilation kullanımı

 

Soldaki resimde (HALCON da pellets adı ile kaydedilmiştir) kaç adet pellet (topak) var. Bunu farklı yaklaşımlarla bulan HALCON kodu üzerinde kafa yoralım.  Ben ve Kağan tarafından geliştirilen farklı algoritmalar, burada alt alta verilecektir.

Buradaki tek zorluk, nesneler birbirine bitişik olduğu için, connection kullandığımızda bitişik olan nesneleri tek bir nesne olarak değerlendirecektir. opening_circle kullanıldığında ise yine istenen sonucu elde edebilmek her zaman mümkün olmamaktadır. Basit gibi görünen bu örnekte biraz daha farklı yaklaşımlar gerekebilir.

 

 

Kağan tarafından geliştirilen HALCON kodu

read_image (Image, 'pellets')
scale_image_range (Image, ImageScaled, 100, 200)
gray_erosion_shape (ImageScaled, ImageMin, 3, 3, 'octagon')
bin_threshold (ImageMin, Region)
difference (ImageMin, Region, RegionDifference)
opening_circle (RegionDifference, RegionOpening, 10)
connection (RegionOpening, ConnectedRegions)
count_obj (ConnectedRegions, Number)

 

 

 

 

 

 

 

 

 

Kağan tarafından yukarıda yazılan kod çalıştırıldığında yukarıdaki sonuç elde edilmiştir. Aradığımız da tam olarak buydu. Kodu tam 1000 defa çalıştırdığımda 3.175 sn. sürdü. Şimdi farklı mantıklar ile yeniden kodu geliştirmeyi düşünelim.
Benim geliştirdiğim HALCON kodu

read_image (Image, 'pellets')
bin_threshold(Image, RegionDark)
difference(Image, RegionDark, RegionLight)
connection(RegionLight, ConnectedRegions)
erosion_circle(RegionLight, RegionErosion, 8 )
connection(RegionErosion, ConnectedRegions)
dilation_circle(ConnectedRegions, RegionDilation, 8 )
count_obj(RegionDilation, Number)

Benim yazdığım kodu 1000 defa çalıştırdığımda 1.439 sn. sürdü 🙂  Buradaki püf noktası, önce erosion_circle kullanarak birbirine yapışık nesneleri sınırlarından erimeye tabi tutarak (erosion) ayırmak, sonra dilation_circle kullanarak eski boyutlarına geri ulaştırmak. (Hız her zaman ilk göz önüne alınması gereken parametre değildir.)

HALCON da bir çok farklı yaklaşım ile istenen sonuca ulaşmak mümkündür. Bir diğer yaklaşım,

distance_transform

HALCON fonksiyonunu kullanmak olabilir. Belritilen sınır mesafeye göre en uzak olanları en parlak, en yakın olanları en koyu olarak çizecek şekilde transform edilmiş yeni resim işleri çok kolaylaştırabilir.

distance_transform (ConnectedRegions, DistanceImage, ‘euclidean’, ‘true’, Width, Height)

fonksiyonu uygulandıktan sonraki orijinal resmimiz aşağıdaki gibi olacaktır. Bundan sonrasını, HALCON programcıları için yazmaya gerek bile görmüyorum.