วิธีที่ดีที่สุดในการแบ่งกลุ่มเส้นเลือดในใบไม้?


47

ฉันได้ทำการวิจัยจำนวนมากและค้นพบวิธีการเช่นการปรับเปลี่ยนตามธรรมชาติ, การทำสันปันน้ำเป็นต้นซึ่งสามารถใช้ในการตรวจจับหลอดเลือดดำในใบ อย่างไรก็ตามการกำหนดเกณฑ์ไม่ดีเพราะมันมีเสียงรบกวนมาก

ภาพทั้งหมดของฉันเป็นภาพสีเทาใคร ๆ ก็สามารถแนะนำวิธีการที่จะนำมาใช้ในขณะที่พิจารณาปัญหานี้ในความต้องการความช่วยเหลือเร่งด่วน

แก้ไข: ภาพต้นฉบับของฉัน

ป้อนคำอธิบายรูปภาพที่นี่

หลังจากการนวดแป้ง

ป้อนคำอธิบายรูปภาพที่นี่

ตามคำแนะนำของคำตอบฉันได้ลองการตรวจจับขอบต่อไปนี้

  1. แสนรู้

เสียงรบกวนมากเกินไปและสิ่งรบกวนที่ไม่พึงประสงค์

ป้อนคำอธิบายรูปภาพที่นี่

  1. โชเบล

ป้อนคำอธิบายรูปภาพที่นี่

  1. โรเบิร์ต

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข: พยายามอีกหนึ่งการดำเนินการฉันได้รับผลลัพธ์ต่อไปนี้ดีกว่าสิ่งที่ฉันพยายามด้วยแสนรู้และปรับตัวคุณรู้สึกอย่างไร

ป้อนคำอธิบายรูปภาพที่นี่


คุณช่วยแสดงให้เราเห็นภาพบางภาพได้ไหม
Jonas

ฉันได้เพิ่มรูปภาพ
vini

@vini คุณกำลังทำสิ่งนี้เป็นขั้นตอนการประมวลผลล่วงหน้าเพื่อรับแม่แบบที่ดีในภายหลังหรือไม่ นอกจากนี้คุณยังได้ภาพที่สองอย่างไรโดยการทำ thresholding อย่างง่าย?
Spacey

เป้าหมายของฉันคือการได้ผลลัพธ์ที่ดีที่สุดในการแบ่งส่วนหลอดเลือดดำเพื่อให้ผลลัพธ์ของฉันไม่ได้มีสิ่งประดิษฐ์หลงทางฉันใช้ Adreshive thresholding เพื่อให้ได้ภาพที่สอง
vini

จากภาพที่คุณให้ดูเหมือนว่าคุณกำลังใช้ฟิลเตอร์ (ต่าง ๆ ) ในภาพที่กำหนด นี้จะให้มากผลลัพธ์ที่น่าสงสาร คุณควรใช้ตัวกรองในภาพต้นฉบับจากนั้นขีด จำกัด ผลลัพธ์ของพวกเขา
Benjohn

คำตอบ:


56

คุณไม่ได้มองหาขอบ (= เส้นขอบระหว่างพื้นที่ขยายของค่าสูงและต่ำสีเทา) คุณกำลังมองหาสันเขา (เส้นบางสีเข้มหรือสว่างกว่าละแวกของพวกเขา) ดังนั้นตัวกรองขอบอาจไม่เหมาะ: ตัวกรองขอบจะ ให้ปีกสองอัน (ด้านใดด้านหนึ่งของบรรทัด) และการตอบสนองที่ต่ำในระหว่างบรรทัด:

ตัวอย่างกรอง

เพิ่ม : หากได้รับการขอให้อธิบายความแตกต่างระหว่างตัวตรวจจับขอบและตัวตรวจจับสันได้ชัดเจนยิ่งขึ้น ฉันต้องขออภัยล่วงหน้าหากคำตอบนี้ใช้เวลานานมาก

เครื่องตรวจจับขอบคือ (โดยปกติ) ผู้ดำเนินการที่ได้มาเป็นอันดับแรก: หากคุณจินตนาการภาพอินพุตเป็นแนวนอน 3 มิติเครื่องตรวจจับขอบจะวัดความชันของความลาดชันในแต่ละจุดของภูมิทัศน์นั้น:

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณต้องการตรวจจับขอบของพื้นที่ที่สว่างหรือมืดที่ขยายออกไป แต่สำหรับเส้นเลือดในภาพของ OP มันจะให้คุณเหมือนกัน: โครงร่างด้านซ้ายและขวาของแต่ละเส้นเลือด:

ป้อนคำอธิบายรูปภาพที่นี่

นั่นยังอธิบาย "รูปแบบเส้นคู่" ในผลลัพธ์ของเครื่องตรวจจับขอบ Canny:

ป้อนคำอธิบายรูปภาพที่นี่

gxy

g(x,y)12x22gx2+xy2gxy+12y22gy2+xgx+ygy+g(0,0)

หรือในรูปแบบเมทริกซ์:

g(x,y)12(xy).(2gx22gxy2gxy2gy2).(xy)+(xy).(gxgy)+g(0,0)

(2gx22gxy2gxy2gy2)

λ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+Hxx2+4Hxy22HxxHyy+Hyy2)

HxxHxyHyy


ใช่นั่นคือสิ่งที่ฉันต้องการ แต่ฉันกำลังทำอยู่ใน MATLAB และการค้นหาตัวกรองสันได้กลายเป็นเรื่องยาก
vini

1
@nikie คำตอบที่ดีมาก - คำถาม - คุณช่วยอธิบายเกี่ยวกับความแตกต่างระหว่างตัวตรวจจับขอบและตัวตรวจจับสันให้เราได้ไหม? ขอขอบคุณอีกครั้ง
Spacey

@Mohammad: ฉันได้ลองแล้วฉันหวังว่าฉันจะทำให้มันชัดเจนขึ้นเล็กน้อยในขณะนี้แม้จะมีคณิตศาสตร์
Niki Estner

ฉันลองตัวกรอง ridge ไม่ให้ผลลัพธ์ที่น่าพอใจ
vini

2
@vini: "ไม่ให้ผลลัพธ์ที่น่าพอใจ" ไม่ได้บอกอะไรมาก คุณได้รับผลภาพเดียวกับที่ฉันโพสต์หรือไม่ "ไม่พอใจ" คืออะไร
Niki Estner

6

เมื่อใช้การตรวจจับขอบ Canny (ใน Halcon) โดยมีค่าเป็น 1 และขีด จำกัด ต่ำ 8 และขีด จำกัด สูง 13 (ในระดับ 1-255) ฉันได้รับผลลัพธ์ดังต่อไปนี้:

ใบไม้ตรวจจับขอบ Canny

ด้วยการปรับแต่งพารามิเตอร์ผลลัพธ์ที่คุณได้จาก Canny นั้นจะดีขึ้นมากขึ้น เมื่อใช้ภาพนี้คุณสามารถข้ามขอบสั้นเพื่อกำจัดสัญญาณรบกวนและเชื่อมต่อขอบยาวสำหรับผลสุดท้าย

BTW: สีที่แตกต่างบ่งบอกถึงขอบที่แตกต่างกัน

ฉันสามารถรับผลลัพธ์ที่คล้ายกันโดยใช้เครื่องตรวจจับขอบ Canny ออนไลน์นี้ :

  • เลือกรูปภาพ I9Pxl.png
  • ซิกม่า 1.2
  • T-low 0.04
  • T-high 0.07
  • การตั้งค่าอื่น ๆ เป็นค่าเริ่มต้น
  • คลิกอัปเดตมุมมองเพื่อดูผลลัพธ์

ขอบคุณ :) ฉันเดาว่า Canny นั้นดีที่สุด;) Btw การใช้ Canny กับผลลัพธ์ของคุณอาจให้ผลลัพธ์ที่ดียิ่งขึ้น ..
Geerten

BTW: หากคุณไม่ได้สังเกต: ข้อ จำกัด ของเครื่องตรวจจับขอบ Canny คืออะไร? คุณสามารถให้มุมมองของคุณที่นี่!
Dipan Mehta

หากคุณกำลังบอกฉัน: ฉันได้ให้ความเห็นกับคำถามของคุณแล้วถ้าคุณให้ความคิดเห็นโดยทั่วไป: ฉันจะลบความคิดเห็นนี้
Geerten

โอ้ใช่ - ฉันไม่ได้ตระหนักถึงสิ่งนี้!
Dipan Mehta

ขอบคุณสำหรับคำตอบของคุณ แต่ canny ไม่ได้เก็บรายละเอียดที่ดีของหลอดเลือดดำในใบไม้ซึ่งไม่ถูกตรวจพบในขณะที่คุณแสดงให้เห็น ...
vini

6

ต่อจากคำตอบที่ยอดเยี่ยมข้างต้นนี่คือวิธีทำใน python โดยใช้ scikit funcitons

from skimage.feature import hessian_matrix, hessian_matrix_eigvals

#assume you have an image img

hxx, hxy, hyy = hessian_matrix(img, sigma=3)
i1, i2 = hessian_matrix_eigvals(hxx, hxy, hyy)

#i2 is the variable you want.

#Visualise the result
import matplotlib.pyplot as plt
plt.imshow(i2)

สิ่งที่imgควรเป็น ฉันมีpngไฟล์และมันใช้งานไม่ได้
Sigur

img ควรเป็นอาร์เรย์ 2 มิติ
Matthew Shun-Shin

ที่จริงแล้วi1ค่าลักษณะเฉพาะมีขนาดใหญ่กว่าดังนั้นคุณควรใช้ค่านั้น
Rob

นี่คือคำอธิบายที่ชัดเจนที่สุดที่ฉันเคยเห็น!
ยูเรก้า

3

แทนการกำหนดเกณฑ์ใหม่ฉันได้ใช้การตรวจจับขอบอย่างง่าย

ใช้GIMP ที่มีความแตกต่างของ Gaussian - Radious Outer: 3.0 และ Inner: 1.0

นี่มันเป็นอย่างไร

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถใช้ตัวกรองค่ามัธยฐานหรือการกัดเซาะ / การขยายเพื่อให้คุณสามารถลบสัญญาณรบกวนบางส่วน

นี่คือหน้าที่อธิบายการใช้งานของ gimp

คุณควรอ้างถึงเทคนิคต่าง ๆ เช่น Laplacian of Gaussian หรือ Difference of Gaussin ฯลฯ ดูที่นี้: http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm#7

และคำตอบนี้ Laplacian ใช้กับ Unsharp Mask อย่างไร?


คนพิการ? เครื่องตรวจจับขอบอะไร?
vini

1
ไม่ - เป็นแพ็คเกจการแก้ไขภาพ เป็นการตรวจสอบด่วน - เพียงแค่นำจุดไปข้างหน้า - ใช้การตรวจจับขอบเมื่อเทียบกับการกำหนดเกณฑ์ขั้นต่ำ
Dipan Mehta

GIMP ใช้ตัวตรวจจับขอบใด ฉันขอโทษมีความรู้น้อยมาก
vini

@vini เพิ่มการอ้างอิง
Dipan Mehta

3

หัวข้อนี้ดึงดูดความสนใจมาโดยตลอดและยังไม่มีฉันทามติที่แท้จริงในหัวข้อ ดังนั้นฉันตัดสินใจที่จะวางคำไม่กี่คำ

คำตอบของฉันสำหรับคำถามที่คล้ายกันก่อนหน้านี้เกี่ยวกับ stackexchange ( Q1และQ2 ) เกี่ยวข้องกับอัลกอริทึมการแยกโครงสร้าง curvilinear subpixel โดย Steger วิธีการนี้ทำได้ดีพอสมควรในหลาย ๆ กรณีและโชคดีรวมถึงวิธีนี้ ดังนั้นฉันโพสต์ภาพที่ส่งออกที่นี่: ป้อนคำอธิบายรูปภาพที่นี่ และที่นี่ด้วยการตั้งค่าพารามิเตอร์ที่แตกต่างกันและไม่มีการเชื่อมต่อสี - ness: ป้อนคำอธิบายรูปภาพที่นี่ สำหรับรายละเอียดและการอ้างอิงที่เหมาะสมโปรดดูโพสต์ stackexchange ฉันได้อ้างถึง


0

เป็นส่วนหนึ่งของงานวิศวกรรมปีสุดท้ายของฉันฉันต้องศึกษาวิธีการแบ่งส่วนสำหรับหลอดเลือดในรูปอวัยวะตา ฉันพบวิธีฟื้นฟูต้นไม้นี้ (โดย Cohen, Laurent D. และ Mille, Julienน่าสนใจเป็นพิเศษที่จะใช้พร้อมกับวิธีการเดินเร็ว

เอกสารอื่น ๆ ที่คุณอาจต้องการพิจารณา:

  • Geodesic Active Contours
  • ในการดำเนินการของวิธีการเดินเร็วสำหรับขัดแตะ 3D
  • Multistencils FMM: คำตอบที่แม่นยำสูงสำหรับสมการ Eikonal บนโดเมนคาร์ทีเซียน

ลิงค์ที่มีประโยชน์: - การแพร่กระจายด้านหน้าใน 2D และ 3D

ฉันหวังว่านี่จะช่วยได้นิดหน่อย แต่มันก็ไม่ได้ทันสมัย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.