Kirli İşler için Classifier Kullanın

Görüntü işleme uygulamalarında, bazen göze çok basit görünen işler, içinden çıkılmaz hale gelebilir. Threshold seçimi bunların başında gelir. Uygun bir threshold seçersiniz Diyelim ki var_threshold. 3-5 örnekte mükemmel çalışır, 1-2 örnekte teklemeye başlar, sonunda -öyle resimler çıkar ki- hiç çalışmaz 🙁 Neyse ki, HALCON var, moral bozmaya gerek yok. “Bir çok alternatif thresholding yöntemi sunuyor ne de olsa” özgüveniyle, hemen başka bir threshold seçilir. Mesela dynamic threshold. Sonuçlar baştan kontrol edilir. Eh, biraz daha iyi. Ama hala yakalanamayan örnekler var. İşin kötüsü, bazı resimlerde var_threshold iyi sonuç verirken, bazen de dyn_yhreshold iyi sonuç veriyor. Hangi durumda hangisini kullanalım? İkisinin sonucunu union yapıp denesek, bu kez de bazı istenmeyen durumlar çıkıyor. İstenmeyen durumları opening_circle vb. fonksiyonlarla elesek, sonra dilate etsek… derken bir bakmışsınız, yüzlerce satır HALCON kodu ile boğuşuyorsunuz.

Bu durum hemen hemen tüm görüntü işlemecilerin başına sık sık gelmektedir. Böyle bir durumla karşılaştıysanız, yanlış yoldasınız demektir, en iyisi önce bir mola verip şu klibi izleyin.

http://www.youtube.com/watch?v=y14_nLOi7YU

“Dirty deeds done dirt cheap”. Demek istediğimiz tam da bu. Kirli işler öyle kastırarak değil, (bizde) ucuz ve kolay yoldan halledilir.

Classifier Kullanımı :

Classifier belirgin 1 ya da 1 den fazla ortak özelliği bulunan nesneleri, bu ortak özelliklerine göre sınıflayarak seçmek için kullanılır. Örneğin bir resimdeki nesneleri, renklerine göre sınıflamak isteyebiliriz. HALCON a, bana bu resimdeki yeşilleri, mavileri, sarıları ver diyebilirim. Aksi halde, tek tek, farklı renklerin farklı threshold değerleri ile ilgilenmek zorunda kalacaktım. Ve bence işin en güzel yanı, bir örnek resim üzerinde, nesneleri tek tek göstrerek, mavi bu, yeşil bu, sarı bu, hadi bunları öğren, ve diğer resimleri verdiğimde, bana bu renkleri bu diyebilme kolaylığı.

Özetle, classifier yaygın olarak kullanılmalıdır. Çok düzgün ve güvenilir sonuçlar verir. Hızlı çalışır, iyi optimize edilmiştir. Sonuçlar kaydedilebilir / okunabilir vs.

 

Threshold seçimi ile uğraşıp 100 lerce satır HALCON kodunu silip, classifier kullanarak 3-5 satırla halledebileceğinizi görünce, ofisin içinde baştan sona Angus Young yürüyüşü yapacağınıza eminim. (yukarıdaki klibin ilk saniyelerinde. Angus Young yürüyüşü yapmayı bilmiyorsanız, buradan öğrenebilirsiniz. http://www.youtube.com/watch?v=MPBSKl9TpO8 (hayatımda böyle saçma video görmedim) )

Şimdi GMM classifier kullanan bir örnek verelim.

Bronz renkli metal plakanın üzerindeki kırmızı renkli çizgileri yakalayan bir görüntü işleme programı yazmamız isteniyor.
Klasik thresholding yöntemlerine göre elde ettiğimiz sonuçlar :

Yukarıdaki örnekte, yakalamak istediğimiz kırmızı çizgiler gayet başarıyla yakalanmış. (Etrafı yeşil ile çizilerek gösterilmiş). Fakat, kırmızı çizginin kalınlığı azaldıkça, kırmızı boyanın etkisi de azalmakta ve threshold kırmızıyı yakalamakta biraz zorlanmaktadır.

Yukarıdaki örnekte, uygulamamızın kırmızı çizgiyi kısmen yakaladığını ama tam istediğimiz gibi olmadığını görüyoruz.

Sonuçta, yukarıdaki gibi bazı örnekler için ise, kırmızı çizginin hiç yakalanamadığını görüyoruz. Kırmızı çizginin bazen yakalanıp, bazen yakalanamaması,

  • plaka yüzeyinde ışık şiddetinin değişken olması (sağ ve sol iyi aydınlanıyor, orta taraf iyi aydınlanmıyor)
  • Çizgi kalınlığının değişken olması (dolayısıyla ince çizgilerde kırmızı rengin belirsizleşmesi)
  • Zeminde lekeler açık koyu bölgeler olması
  • Bronz zeminin kendi içinde kırmızılık içermesi

gibi sebeplerden olabilir.

 

 

 

 

 

 

 

 

Yukarıdaki resim, yanlış threshold denemeleri ile boğuşurken, farketmeden hızlıca artmış HALCON kodlamasını gösteriyor.

GMM classifier kullanılarak yazılan aşağıdaki kod ise, tüm durumlarda %100 çalışarak istenen sonucu almamızı sağlamıştır.

 

set_display_font (3600, 16, 'mono', 'true', 'false')

list_files ('C:/Projects/Bronz/R', ['files','follow_links'], ImageFiles)
* list_files ('C:/Projects/SahinMotor/deneme 2/çapraz ışık/nok', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima)$','ignore_case'], ImageFiles)

* Red Region seçimi
read_image (Image, 'Reddic.jpg')
gen_rectangle1 (ROI_0, 198.172, 226.049, 485.801, 901.164)
reduce_domain(Image, ROI_0, ImageReduced)
decompose3(ImageReduced, R, G, B)
bin_threshold(G, RedRegion)
*

create_class_gmm (3, 1, 1, 'full', 'none', 3, 42, GMMHandle)
add_samples_image_class_gmm (Image, RedRegion, GMMHandle, 0)
train_class_gmm (GMMHandle, 100, 0.001, 'training', 0.001, Centers, Iter)
create_class_lut_gmm (GMMHandle, ['bit_depth','rejection_threshold'], [6,0.03], ClassLUTHandle)
clear_class_gmm (GMMHandle)

dev_set_color('blue')
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])
    reduce_domain(Image, ROI_0, ImageReduced)
    classify_image_class_lut (ImageReduced, ClassRegions, ClassLUTHandle)
    closing_circle(ClassRegions, RegionClosing, 3.5)
    area_center(RegionClosing, Area, Row, Column)
    if (Area > 500)
        disp_message(3600, 'KIRMIZI', 'image', 12, 12, 'red', 'true')
    endif
    stop()
endfor