มีมุมเพิ่มเติมในขอบเขตของ "วัตถุแหลมคม" ของคุณดังนั้นวิธีการหนึ่งในการปรับแต่งเครื่องตรวจจับมุมสำหรับสิ่งนี้
ตัวอย่างเช่นฉันคำนวณดีเทอร์มิแนนต์ของเทนเซอร์ของโครงสร้าง (รหัส Mathematica ด้านล่าง) ของรูปภาพที่แปลงระยะทาง:
การสร้าง Binarizing ด้วย hysteresis ให้ภาพนี้ซึ่งเป็นจุดเริ่มต้นที่ดีสำหรับอัลกอริทึมการแบ่งส่วนที่คุณเลือก:
รหัส Mathematica ( src
เป็นภาพต้นฉบับที่คุณโพสต์)
ตอนแรกฉันคำนวณการแปลงระยะทางของภาพอินพุต สิ่งนี้สร้างความแตกต่างเหนือพื้นที่วัตถุทั้งหมด (แทนที่จะเป็นแค่เส้นขอบ) เพื่อให้สามารถตรวจจับวัตถุทั้งหมดได้
dist = ImageData[DistanceTransform[src]];
ถัดไปผมเตรียมส่วนประกอบของเมตริกซ์โครงสร้าง ขนาดตัวกรองสำหรับสัญญา gaussian ถ้า 5 ขนาดหน้าต่างคือ 20
gx = GaussianFilter[dist, 5, {1, 0}];
gy = GaussianFilter[dist, 5, {0, 1}];
gx2 = GaussianFilter[gx^2, 20];
gxy = GaussianFilter[gx*gy, 20];
gy2 = GaussianFilter[gy^2, 20];
ในการคำนวณตัวกรองมุมที่แต่ละพิกเซลฉันแค่เสียบสิ่งเหล่านี้เข้ากับตัวกำหนดเชิงสัญลักษณ์ของเทนเซอร์โครงสร้าง:
corners = Det[{{dx2, dxy}, {dxy, dy2}}] /. {dx2 -> gx2, dxy -> gxy, dy2 -> gy2};
ซึ่งโดยทั่วไปเหมือนกับ:
corners = gx2 * gy2 - gxy * gxy;
การแปลงเป็นภาพและปรับให้เป็นช่วง 0..1 ทำให้ได้ภาพมุมตรวจจับด้านบน
ในที่สุดการ binarizing ด้วยเกณฑ์ที่ถูกต้องจะให้ภาพไบนารีสุดท้าย:
MorphologicalBinarize[Image[corners], {0.025, 0.1}]