Akıllı Şekil Tamamlama

Bazen alınan görüntüde eksik kalan yerlerin tamamlanması gerekebilir. Aşağıdaki örnek kod, tamamlama işini akıllı bir biçimde yapmaktadır.

Yukarıda görüldüğü gibi parçalar arasındaki boşluk, olabildiğince gerçeğe yakın bir şekilde birleştirilmiştir. Birçok yerde kullanılabilecek olan, prosedürel olarak yazılmış HALCON kodu :

read_image (Image, 'C:/Users/Mustafa/Desktop/aa.png')
bin_threshold (Image, Region)
connection (Region, ConnectedRegions)
CombineSplittedRegions (ConnectedRegions, RegionCount)
dev_set_draw ('fill')
dev_display(Image)
dev_display(RegionCount)

Burada asıl işi yapan CombineSplittedRegions prosedürü ise

count_obj(ConnectedRegions, Number)
if (Number > 1)
    while (Number > 1)
        select_obj (ConnectedRegions, Obj1, 1)
        select_obj (ConnectedRegions, Obj2, 2)
        inner_circle(Obj1, Row, Column, Radius1)
        inner_circle(Obj2, Row, Column, Radius2)
        minR := Radius1
        if (Radius2 < Radius1)
            minR := Radius2
        endif
        distance_rr_min(Obj1, Obj2, MinDistance, Row1, Column1, Row2, Column2)
        gen_region_line (RegionLines, Row1, Column1, Row2, Column2)
        dilation_circle(RegionLines, RegionDilation, minR)
        union2(ConnectedRegions, RegionDilation, RegionUnion)
        union1(RegionUnion, RegionCombine)
        connection(RegionCombine, ConnectedRegions)
        count_obj(ConnectedRegions, Number)
    endwhile
else
    copy_obj(ConnectedRegions, RegionCombine, 1, -1)
endif
inner_circle(RegionCombine, Row, Column, Radius)
rank_region(RegionCombine, RegionCount, Radius, Radius, 50)
return ()

programda kullanılan orijinal resim aşağıdadır. Programı denemek için bunu kullanabilirsiniz.

HALCON Temelleri

HALCON üzerine referans site çok fazla olmamasından dolayı (benim bildiğim hiç yok) bu blog sitesinde HALCON temel fonksiyonları ve gittikçe ilerleyen seviyelerde örnekler vermeyi uygun gördüm.

Aşağıdaki örnek proje, resimdeki belirlenen bir nesneye, en yakın diğer nesneyi bulma örneği. Bu örnek dikkatle incelenirse, kendi içinde dikkat edilmesi gereken bir “TRICK” içeriyor. Bunu da hemen takip eden makalede açıklamayı düşünüyorum.

Yukarıdaki resimde (sağ tuşa tıklayarak orijinal halini görebilir / kaydedebilirsiniz) somunu seçip, somuna en yakın civatayı bulup, aralarındaki mesafeyi pixel cinsinden yazan bir HALCON kodu geliştirelim.

Sonuçta ekran görüntüsü soldakine benzer bir şey olacak. Sistem önce somunu belirleyecek, daha sonra somuna en yakın civatayı, ve aralarındaki mesafeyi bulacak.

Bunun için öncelikle somunun belirlenmesi, daha sonra distance_rr_min komutu ile iki region arasındaki minimum mesafenin bulunması işlemi söz konusu olacaktır.

HALCON koduna dönersek

set_display_font (3600, 12, 'mono', 'true', 'false')
read_image (Image, 'C:/Users/mvs/Desktop/SC.bmp')
bin_threshold (Image, Region)
connection (Region, ConnectedRegions)
*Çok küçük parçalar, noktasal kirlilikler varsa eleyelim
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 150, 99999)
count_obj(SelectedRegions, Number)
if (Number > 0)
    *nesnelerin içinde var olan boşlukları dolduralım
    fill_up_shape(SelectedRegions, RegionFillUp, 'area', 1, 100)
    *içinde 1 adet delik olan nesneyi bul
    select_shape (RegionFillUp, Somun, 'holes_num', 'and', 1, 1)
    count_obj(Somun, Number)
    if (Number = 1)
        difference(RegionFillUp, Somun, RegionDifference)
        union1(RegionDifference, RegionUnion)
        distance_rr_min(Somun, RegionUnion, MinDistance, Row1, Column1, Row2, Column2)
        dev_set_color('blue')
        disp_arrow(3600, Row1, Column1, Row2, Column2, 2)
        disp_message (3600, MinDistance, 'image', Row2 - 20, Column2 + 20, 'green', 'false')
    endif
endif

şeklinde bir kod işimizi fazlasıyla görür.

Burada fill_up_shape komutunun etkisi aşağğıdaki resimde görülebilir:

fill_up_shape yerine fill_up kullanılsaydı, somun simit şeklinde olmayıp içi dolu daire şekline gelecekti.

Örnekte, somunu seçmek için, içindeki boşlık sayısı 1 olan nesneleri arattım. Duruma göre bir çok farklı alternatif denenebilirdi. dairesellik, (circularity), alan (area) vb. gibi.

Bu örnekte hala eksik olan ve dikkatli olunmaması durumunda ciddi hatalara neden olabilecek bir kod var. Bir sonraki makalede buna değineceğim.