ฉันจะตรวจจับวัตถุที่แตกต่างเมื่อขอบของพวกเขาสัมผัสกันได้อย่างไร


21

ฉันต้องการค้นหารูปทรงทั้งหมดในภาพที่ดึงมาจากกล้อง ดังนั้นก่อนอื่นให้ใช้ตัวตรวจจับขอบแสนรู้เพื่อหาขอบแล้วหารูปทรง ค่อนข้างง่าย

อย่างไรก็ตามรูปทรงของฉันได้รับการ "ผสาน" ตัวอย่างเช่นในภาพด้านล่างฉันมีวัตถุต่าง ๆ 4 อย่างชัดเจน แม้ว่าขอบบางจุดจะสัมผัสกันเล็กน้อยดังนั้นฉันจึงได้รูปร่างที่ใหญ่แทนที่จะเป็นสี่แยก ฉันพยายามเปลี่ยนค่าขีด จำกัด การกัดเซาะการสัณฐานวิทยาและสิ่งที่คล้ายกัน แต่ขอบสัมผัสกันเล็กน้อย ไม่มีใครมีข้อเสนอแนะเกี่ยวกับวิธีการได้รับรูปทรงแยกต่างหากในภาพคล้ายกับด้านล่าง? (ภาพด้านล่างเป็นเพียงตัวอย่างจริงภาพจริงของฉันซับซ้อนกว่ามาก แต่มีปัญหาพื้นฐานเหมือนกัน)

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


การแบ่งส่วนลุ่มน้ำสามารถทำงานได้
sm176357

ดังนั้นคุณควรพิจารณากรณีที่ผู้ติดต่อเป็นเส้นและไม่ใช่เพียงแค่จุด (สัมผัส แต่ไม่ทับซ้อนกัน)
Shravya Boggarapu

คำตอบ:


11

การตรวจจับส่วนประกอบที่แตกต่าง:

หากคุณพยายามที่จะตรวจสอบส่วนประกอบต่าง ๆ อาจมีวิธีอื่นที่จะทำได้มากกว่าการตรวจจับรูปทรง นี่คือตัวอย่างใน Mathematica การชะตามด้วยการขยายจะใช้เพื่อปิดช่องว่างในองค์ประกอบที่สองก่อนการตรวจจับ (หากคุณไม่ทำสิ่งนี้มันจะไม่ตรวจจับ)

img = Binarize@Import["http://i.stack.imgur.com/yqDyu.png"];
Colorize[MorphologicalComponents[Dilation[Erosion[img,1],1]]]

รูปด้านซ้ายด้านล่างแสดงการตรวจจับวัตถุที่ไม่สมบูรณ์ (โดยไม่ปิดช่องว่าง) และทางด้านขวาแสดงการตรวจจับที่ถูกต้อง (เรียกใช้โค้ดด้านบน)

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

การตรวจจับรูปทรงที่แตกต่าง:

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

img2 = EdgeDetect[Dilation[Erosion[img, 1], 1], Method -> "Canny"]

สิ่งนี้จะให้ทั้งด้านในและด้านนอก (ดูรูปด้านล่างซ้าย) เนื่องจากความกว้างของพิกเซลมากกว่า 1 รอบ ฉันไม่ได้มีโชคมากที่พยายามทำให้มันบางลงเนื่องจากประสิทธิภาพลดลง (อาจแตกต่างกันสำหรับรูปภาพอื่น ๆ ของคุณ) รูปทรงภายในเป็นสิ่งที่คุณต้องการและรูปร่างชั้นนอกเป็นเพียงส่วนที่รวมกันของส่วนประกอบทั้ง 4 ตอนนี้สิ่งที่เราต้องทำคือวางอันนอกสุดด้วย:

SelectComponents[img2, "EnclosingComponentCount", # > 0 &]

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

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

โปรดทราบว่าการแบ่งชัดเจนในรูปเนื่องจากการบันทึกเพื่อ jpeg ในขนาดที่เล็กกว่า มันไม่ได้ดูแบบนั้นบนหน้าจอของฉัน


2

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


ฉันลองแล้ว แต่ผลลัพธ์ไม่แสดงการปรับปรุง

1
คุณสามารถแสดงภาพตัวอย่างจริงได้หรือไม่?

2

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

หากคุณมีปัญหาในการใช้งานคุณควรมองหาอัลกอริทึมที่แตกต่างอย่างสิ้นเชิง มีวิธีที่ซับซ้อนและมีประสิทธิภาพมากขึ้นในการแก้ปัญหา แต่ขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุ (การตรวจจับวัตถุการติดตามและอื่น ๆ ... )


ขอขอบคุณ. โปรแกรมของฉันใช้สำหรับการตรวจจับมือดังนั้นฉันคิดว่ามันจะคล้ายกับการตรวจจับวัตถุ คุณให้คำแนะนำใด ๆ สำหรับอัลกอริทึมที่ซับซ้อนและแข็งแกร่งกว่านี้หรือไม่? คุณสมบัติ Haar, SURF และอัลกอริทึมการเรียนรู้ของเครื่องที่คล้ายกันไม่ใช่สิ่งที่ฉันสามารถทำได้

คุณดูทรัพยากรเหล่านี้หรือไม่ paginas.fe.up.pt/~hgc2011ส่วนใหญ่เป็นฐานข้อมูล / ผลลัพธ์ แต่ฉันหวังว่าคุณจะสามารถหาเอกสารดีๆได้ที่นี่

0

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

นอกจากนี้ยังขึ้นอยู่กับว่าเรากำลังมองหารูปทรงหรือการแบ่งส่วน (Canny กับวิธีการเช่นGraphcuts ) ดังนั้นฉันเดาว่าการหาโซลูชันที่มีประสิทธิภาพนั้นขึ้นอยู่กับแอปพลิเคชันสุดท้ายของคุณ

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