Kenarlar aramıyorsunuz (= yüksek ve düşük gri değere sahip geniş alanlar arasındaki sınırlar), sırtlar arıyorsunuz (çevrelerinden daha koyu veya daha parlak ince çizgiler), bu nedenle kenar filtreleri ideal olmayabilir: Bir kenar filtresi size iki kanat (çizginin her bir tarafında bir tane) ve çizginin ortasında düşük bir yanıt verin:
EKLE : Bir kenar dedektörü ve bir sırt dedektörü arasındaki farkı daha net bir şekilde açıklamanız istendiyse. Bu cevap çok uzadıysa şimdiden özür dilerim.
Bir kenar algılayıcısı (genellikle) bir birinci türev operatörüdür: Giriş görüntüsünü bir 3B manzara olarak hayal ederseniz, bir kenar algılayıcı eğimin dikliğini o manzaradaki her bir noktada ölçer:
Uzatılmış bir aydınlık veya karanlık bölgenin sınırını tespit etmek istiyorsanız, bu gayet iyi. Fakat OP görüntüsündeki damarlar için size aynı şeyi verecektir: her damarın solunda ve sağında ana hatlar:
Bu ayrıca Canny kenar dedektörü sonuçlarında "çift çizgi deseni" açıklar:
gxy
g(x,y)≈12x2∂2g∂x2+xy∂2g∂x∂y+12y2∂2g∂y2+x∂g∂x+y∂g∂y+g(0,0)
veya matris formunda:
g(x,y)≈12(xy).⎛⎝⎜∂2g∂x2∂2g∂x∂y∂2g∂x∂y∂2g∂y2⎞⎠⎟.(xy)+(xy).(∂g∂x∂g∂y)+g(0,0)
⎛⎝⎜∂2g∂x2∂2g∂x∂y∂2g∂x∂y∂2g∂y2⎞⎠⎟
λ1x2+λ2y2λ1λ2
Bu işlev yaklaşımının ne tür şekilleri olabilir? Aslında o kadar değil:
Sırtı tespit etmek için, yukarıdaki parsellerin sonuncusuna benzeyen alanları bulmak istiyoruz, bu nedenle Hessian'ın ana özdeğerinin büyük olduğu (küçük özdeğerle karşılaştırıldığında) alanlar arıyoruz. Bunu tespit etmenin en basit yolu, her pikselin ana özdeğerini hesaplamaktır - ve aşağıdaki sırt filtresinin yaptığıdır.
Bir sırt filtresi muhtemelen daha iyi sonuçlar verecektir. Mathematica'yı yerleşik olarak RidgeFilter
(Hessian matrisinin her bir pikselindeki özdeğerini hesaplayan) resminizde denedim :
Gördüğünüz gibi, her ince koyu çizgi için sadece tek bir tepe var. Binarizasyon ve skeletonizing verimler:
İskeleti budandıktan ve görüntüdeki küçük bileşenleri (gürültü) çıkardıktan sonra şu son iskeleti elde ediyorum:
Tam Mathematica kodu:
ridges = RidgeFilter[ColorNegate@src];
skeleton = SkeletonTransform[Binarize[ridges, 0.007]];
DeleteSmallComponents[Pruning[skeleton, 50], 50]
EKLEMEK:
Ben bir Matlab uzmanı değilim, bir sırt süzgecine sahip olup olmadığını bilmiyorum, ama size "elle" nasıl uygulandığını gösterebilirim (yine, Matematica kullanarak). Dediğim gibi, sırt süzgeci, Hessian matrisinin ana öz değeridir. Bu özdeğerin matematiksel olarak Mathematica'da hesaplamasını yapabilirim:
eigenvalue=Last[Eigenvalues[(HxxHxyHxyHyy)]]
12(Hxx+Hyy+H2xx+4H2xy−2HxxHyy+H2yy−−−−−−−−−−−−−−−−−−−−−−−√)
HxxHxyHyy