Dikiş Varlık Kontrolü

Dynamic Threshold ve Shock Filter Kullanımı

Yakın zamanda yaptığımız bir projede, yapılacak kontrollerden biri kumaşın desenini algılamaktı. Texture olarak bilinen bu çalışma, görüntü işlemenin en zor yanlarından biridir. Her ne kadar HALCON texture algılama üzerine bol miktarda fonksiyon barındırsa da, texture gibi genel bir konuda, her hangi bir fonksiyondan sihirli bir işlev beklenemez. Yapılması gereken, projeye özgü kodlamada bulunmak…

Projede, kumaşın deseni kadar, kenarında dikiş olup olmadığının da kontrol edilmesi gerekiyordu.

Resimdeki orijinal resimde göründüğü gibi, araba koltuk başlığının yan tarafında dikiş olup olmadığının belirlenmesi gerekiyordu. İlk başta kolay gibi görünen bazı uygulamalar, iplik renginin değişmesi, kumaş renginin / deseninin değişmesi vb. faktörlerden dolayı hiç hata vermeden çalışacak bir yapıda olmalıydı. aşağıdaki kod, dikiş izini hatasız olarak tesbit edebilen bir HALCON kodudur. (Denemek için bu resmi alarak kaydedebilirsiniz.)

 

sonuç görüntü :

HALCON kodu

 

read_image (Image, 'K.bmp')
bin_threshold (Image, Region) 
reduce_domain (Image, Region, ImageReduced)
shock_filter(ImageReduced, SharpenedImage, 0.5, 10, 'canny', 1)
gray_opening_shape(SharpenedImage, ImageOpening, 25, 25, 'octagon')
gray_closing_shape(SharpenedImage, ImageClosing, 25, 25, 'octagon')
dyn_threshold (ImageOpening, ImageClosing, RegionDynThresh, 50, 'not_equal')
dilation_circle(RegionDynThresh, RegionDilation, 5)
connection(RegionDilation, ConnectedRegions)
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 99999)
count_obj(SelectedRegions, Number)
if (Number > 0)
    skeleton(SelectedRegions, Skeleton)
    dev_set_line_width(2)    
    *set_line_style (3600, [20,10])
    dev_display(Image)
    dev_display(Skeleton)
endif

Burada asıl işi yapan dynamic_threshold kullanımıdır. shock_filter alınan görüntüde, kenarları belirginleştirmeye yarar. (Datamatrix, karekod, barkod okuma vb. işlemlerde önerilir) Kodda comment edilmiş set_line_style (3600, [20,10]) kodunu da açıp çalıştırırsanız, bulanan dikiş çizgisinin, kesikli olarak gösterildiğini göreceksiniz. set_line_style, HALCON çizgi gösterim biçimini formatlama fonksiyonudur.

Sağlam Yaprak Seçimi (Kameralı Yaprak Kontrolü)

Yaprakların sağlam ya da hatalı olup olmadığının ayıklanmasında istenenler

  • Yırtıklık kontrolü
  • Delik kontrolü
  • Kırıklık Kontrolü
  • Yabancı maddelerin ayrıştırılması
  • Renk kontrolü

gibi kontrollerdir.

bu kontrollerin gerçekleştirilmesinde, her birinde farklı yaklaşım söz konusu olabilir.  İyi bir görüntü işleme algoritması ile bu kontroller yapılabilir. Kullandığımız yöntemlerden biri, yaprağın sol tarafı ile sağ tarafı arasındaki simetrinin aranmasıydı.

Yaprağın sol ve sağ tarafının bulunması :

Basit Yöntem

  1. Yaprak seçilir (thresholding)
  2. Dönme açısı belirlenir (orientation_region)
  3. yatayla sıfır derece yapacak şekilde döndürülür (rotate_image)
  4. En küçük dörtgenle sınırlandırılır (smallest_rectangle1)
  5. Dörtgen yatay olarak tam ortadan ikiye bölünür.

Elde edilen 2 region dan, üstte olan yaprağın sol kısmı, allta olan sağ kısmını verir.

Bu yöntemin dezavantajı, yaprağın sol ve sağ tarafı tam simetrik değilse (genelde de olmaz) tam ortadan bölünmüş dörtgen, yaprağı tam ortadan ikiye bölmüş olmaz.

Gelişmiş Yöntem :

  1. Yaprak Seçilir (thresholding)
  2. skeleton komutu ile yaprağın ortadan geçen çizgisi yakalanır
  3. junctions_skeleton komutu ile yaprağın başlangıç ve bitiş noktasının koordinatları çıkartılır
  4. gen_region_points komutu ile, skeleton da çıkan noktaların üst tarafı yaprağın sol tarafını, alt tarafı ise sağ tarafını verecek şekilde 2 region elde edilir.

Sonuçta, burada işi yapan asıl fonksiyon skeleton dur. skeleton fonksiyonunun yaprak resmine uyarlanmış hali, neredeyse yaprağın ortasından geçen damar ile aynı yolu izlemektedir.

Projenin tamamında, kameralı yaprak ayrıştırması (kameralı yaprak kontrolü) ile hızlı bir şekilde yaprakların sağlam olup olmadığı algılanabilmektedir.