การตรวจจับส่วนประกอบที่แตกต่าง:
หากคุณพยายามที่จะตรวจสอบส่วนประกอบต่าง ๆ อาจมีวิธีอื่นที่จะทำได้มากกว่าการตรวจจับรูปทรง นี่คือตัวอย่างใน 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 ในขนาดที่เล็กกว่า มันไม่ได้ดูแบบนั้นบนหน้าจอของฉัน