คุณไม่ได้มองหาขอบ (= เส้นขอบระหว่างพื้นที่ขยายของค่าสูงและต่ำสีเทา) คุณกำลังมองหาสันเขา (เส้นบางสีเข้มหรือสว่างกว่าละแวกของพวกเขา) ดังนั้นตัวกรองขอบอาจไม่เหมาะ: ตัวกรองขอบจะ ให้ปีกสองอัน (ด้านใดด้านหนึ่งของบรรทัด) และการตอบสนองที่ต่ำในระหว่างบรรทัด:
เพิ่ม : หากได้รับการขอให้อธิบายความแตกต่างระหว่างตัวตรวจจับขอบและตัวตรวจจับสันได้ชัดเจนยิ่งขึ้น ฉันต้องขออภัยล่วงหน้าหากคำตอบนี้ใช้เวลานานมาก
เครื่องตรวจจับขอบคือ (โดยปกติ) ผู้ดำเนินการที่ได้มาเป็นอันดับแรก: หากคุณจินตนาการภาพอินพุตเป็นแนวนอน 3 มิติเครื่องตรวจจับขอบจะวัดความชันของความลาดชันในแต่ละจุดของภูมิทัศน์นั้น:
หากคุณต้องการตรวจจับขอบของพื้นที่ที่สว่างหรือมืดที่ขยายออกไป แต่สำหรับเส้นเลือดในภาพของ OP มันจะให้คุณเหมือนกัน: โครงร่างด้านซ้ายและขวาของแต่ละเส้นเลือด:
นั่นยังอธิบาย "รูปแบบเส้นคู่" ในผลลัพธ์ของเครื่องตรวจจับขอบ Canny:
gxy
g(x,y)≈12x2∂2g∂x2+xy∂2g∂x∂y+12y2∂2g∂y2+x∂g∂x+y∂g∂y+g(0,0)
หรือในรูปแบบเมทริกซ์:
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
ฟังก์ชั่นการประมาณนี้มีรูปร่างแบบใด จริงๆแล้วไม่มาก:
ในการตรวจจับแนวสันเขาเราต้องการค้นหาพื้นที่ในภาพที่มีลักษณะเหมือนแปลงสุดท้ายด้านบนดังนั้นเราจึงค้นหาพื้นที่ที่ค่าลักษณะเฉพาะหลักของ Hessian มีขนาดใหญ่ (เทียบกับค่าลักษณะเฉพาะเล็กน้อย) วิธีที่ง่ายที่สุดในการตรวจจับนั่นคือการคำนวณค่าลักษณะเฉพาะที่สำคัญในแต่ละพิกเซล - และนั่นคือสิ่งที่ตัวกรองสันด้านล่างทำ
กรองสันอาจจะให้ผลลัพธ์ที่ดี ฉันลอง Mathematica ในตัวRidgeFilter
(ซึ่งคำนวณค่าลักษณะเฉพาะที่สำคัญของเมทริกซ์ Hessian ในแต่ละพิกเซล) บนภาพของคุณ:
อย่างที่คุณเห็นมันมีจุดสูงสุดเพียงจุดเดียวสำหรับเส้นสีดำบาง ๆ ผลตอบแทน Binarizing และ Skeletonizing:
หลังจากตัดโครงกระดูกและลบส่วนประกอบขนาดเล็ก (เสียงรบกวน) จากภาพฉันได้รับโครงกระดูกสุดท้ายนี้:
รหัส Mathematica แบบเต็ม:
ridges = RidgeFilter[ColorNegate@src];
skeleton = SkeletonTransform[Binarize[ridges, 0.007]];
DeleteSmallComponents[Pruning[skeleton, 50], 50]
เพิ่ม:
ฉันไม่ใช่ผู้เชี่ยวชาญ Matlab ฉันไม่รู้ว่ามันมีตัวกรองสันในตัวหรือไม่ แต่ฉันสามารถแสดงให้คุณเห็นวิธีการใช้ "ด้วยมือ" (อีกครั้งโดยใช้ Matematica) อย่างที่ฉันพูดตัวกรองสันเป็นค่าลักษณะเฉพาะที่สำคัญของเมทริกซ์ Hessian ฉันสามารถคำนวณค่าลักษณะเฉพาะที่เป็นสัญลักษณ์ใน Mathematica:
eigenvalue=Last[Eigenvalues[(HxxHxyHxyHyy)]]
12(Hxx+Hyy+H2xx+4H2xy−2HxxHyy+H2yy−−−−−−−−−−−−−−−−−−−−−−−√)
HxxHxyHyy