Çatlak, Çizik, Çizgi vs. bulma

Genelde gözle dahi zor görülen çatlak, çizgi, çizik vs. bulunması işlemi bazen oldukça baş ağrıtıcı olabilir. Cam çatlağı bulunması, ahşap ya da mermer yüzeyde damarların kontrolü, tıbbi görüntüler, metalik yüzeydeki çiziklerin tesbiti gibi örneklerde karşımıza sıkça çıkan bu uygulamalarda alınan  görüntünün hem arka zemini ile uğraşmak (görüntüye giren yansımalar, noktacık şeklindeki tozlar vs. ayrıştırılmalı) hem de ön plandaki çizgiler hassas olarak seçilebilmelidir.
Uygulamaya göre pek çok farklı yaklaşım getirilmekle birlikte, bu tür uygulamalarda

  • Gauss Filtresi Uygulama
  • Gradient Domain Manipulation tekniği uygulama
  • Photometric stereo yöntemine göre görüntü alma

vb yöntemler ilk akla gelenlerdir.

Yukardaki resimde görüldüğü gibi, lines gauss bize çizgileri, gradient_domain işlemi ise arka zemin temizlemeyi ve çizgileri belirginleştirmeyi göstermektedir. Her iki tekniğin de HALCON kurulumu ile gelen angio-part isimli resme uygulandığı HALCON programcığı ise aşağıdadır. Kendi örneklerinizde uygulamalar daha komplike olacaktır.

(gradient domain manipulation tekniği, zemin üzerindeki resim üzerinde yer alan, genelde istenmeyen lekelerin elenmesi ve ön plana çıkartılmak istenen yerlerin belirginleştirilmesi suretiyle resmin yumuşatılması işlemidir. Bazı durumlarda çok iyi sonuçlar verebilmektedir.)

dev_update_off ()
dev_close_window ()
read_image (Angio, 'angio-part')
get_image_size (Angio, Width, Height)
dev_open_window (0, 0, 3*Width/2, 3*Height/2, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
lines_gauss (Angio, Lines, 2.3, 0.0, 0.7, 'dark', 'true', 'parabolic', 'true')
dev_display (Angio)
dev_set_color ('green')
dev_display (Lines)
disp_message (WindowHandle, 'X-Ray image with extracted contours', 'window', 20, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop()
*
gen_image_const (DX, 'real', Width, Height)
gen_image_const (DY, 'real', Width, Height)
count_obj (Lines, Number)
*
for I := 1 to Number by 1
    select_obj (Lines, Line, I)
    get_contour_xld (Line, Row, Col)
    if (|Row| < 10)
        continue
    endif
    get_contour_attrib_xld (Line, 'angle', Angle)
    get_contour_attrib_xld (Line, 'width_left', WidthL)
    get_contour_attrib_xld (Line, 'width_right', WidthR)
    get_contour_attrib_xld (Line, 'contrast', Attrib)
    * To process the lines, the point at which the gray value drops to
    * 25% of the contrast between the line and the background will be
    * displayed.  This point is given by sqrt(3/4) for the parabolic
    * line model.
    RowR := Row+cos(Angle)*WidthR*sqrt(0.75)
    ColR := Col+sin(Angle)*WidthR*sqrt(0.75)
    RowL := Row-cos(Angle)*WidthL*sqrt(0.75)
    ColL := Col-sin(Angle)*WidthL*sqrt(0.75)
    tuple_max ([RowR,RowL], Max)
    tuple_max ([ColR,ColL], Max2)
    if (Max < Height and Max2 < Width)
        set_grayval (DX, int(RowR), int(ColR), Attrib*sin(Angle))
        set_grayval (DY, int(RowR), int(ColR), Attrib*cos(Angle))
        set_grayval (DX, int(RowL), int(ColL), -Attrib*sin(Angle))
        set_grayval (DY, int(RowL), int(ColL), -Attrib*cos(Angle))
    endif
endfor
real_to_vector_field (DY, DX, VectorField, 'vector_field_relative')
reconstruct_height_field_from_gradient (VectorField, SmoothedImages, 'poisson', [], [])
dev_display (SmoothedImages)
disp_message (WindowHandle, 'Smoothed image', 'window', 20, 12, 'black', 'true')

Gradient domain manipulation allows strong image smoothing simply by suppressing all gradients below a certain threshold.

As result, only strong edges remain while small changes (which are typically caused by noise) are removed.