5.8. Flood fill และ detection glyphs¶
Primitive เชิงเรขาคณิตที่ต้นของส่วนนี้วางเครื่องหมายที่ตำแหน่งที่แอปพลิเคชันรู้อยู่แล้ว Image composition วางภาพหนึ่งบนอีกภาพหนึ่ง กลุ่มเมธอดการวาดสุดท้ายขนาดเล็กทำสิ่งที่แตกต่าง: วางเครื่องหมายที่รูปแบบขึ้นอยู่กับสิ่งที่ อยู่ใน ภาพอยู่แล้ว หรือสิ่งที่อัลกอริทึมก่อนหน้า ค้นพบ ในภาพ
5.8.1. Flood fill¶
flood_fill() เริ่มจากพิกเซลเดียว -- seed -- และขยายออกด้านนอก ระบายสีทุกพิกเซลที่คล้ายกับ seed เพียงพอและเชื่อมต่อกับมันผ่านห่วงโซ่ของพิกเซลที่คล้ายกันอื่น ๆ ผลลัพธ์คือบริเวณที่เติมเต็มซึ่งขอบเขตถูกกำหนดโดยภาพเอง ไม่ใช่โดยสิ่งที่ส่งผ่านไปยังการเรียก
รูปแบบที่ง่ายที่สุดรับพิกัด seed และสีเพื่อเติม:
img.flood_fill(x=160, y=120, color=(0, 255, 0))
พารามิเตอร์ค่าขีดแบ่งสองตัวควบคุมความเร็วในการขยายของ fill seed_threshold (เศษส่วนที่ normalize แล้วจาก 0.0 ถึง 1.0) กำหนดว่าพิกเซลสามารถแตกต่างจากค่า seed ดั้งเดิม ได้เท่าใดในขณะที่ยังรวมอยู่ floating_threshold กำหนดว่าพิกเซลสามารถแตกต่างจากเพื่อนบ้านที่ รวมอยู่แล้ว แต่ละตัวได้เท่าใด ค่าขีดแบ่งทั้งสองทำงานร่วมกัน: floating_threshold ที่ใจกว้างให้ fill ติดตาม gradient ข้ามภาพได้ ในขณะที่ seed_threshold ที่แน่นกว่าป้องกันไม่ให้เบี่ยงออกจากค่า seed มากเกินไปแม้ตาม gradient นั้น
flag บางตัวปรับปรุงผลลัพธ์เพิ่มเติม:
invert=Trueระบายสีทุกพิกเซลที่ ไม่ ตรงกัน -- ส่วนเติมเต็มของบริเวณที่ตรงกัน -- แทนที่จะเป็นพิกเซลที่ตรงกันเองclear_background=Trueรีเซ็ตทุกพิกเซลภายนอกบริเวณ fill เป็นศูนย์ มีประโยชน์สำหรับการดึงเฉพาะบริเวณที่เติมเป็น maskคีย์เวิร์ด
maskมีความหมายปกติ: พิกเซลที่ปิดใน mask จะถูกปล่อยไว้โดยไม่แตะต้องไม่ว่า fill จะไปถึงหรือไม่
Flood fill มีประโยชน์มากที่สุดสำหรับสองรูปแบบ รูปแบบแรกคือ การแสดงให้เห็น สิ่งที่ตัวตรวจจับบริเวณบางตัวค้นพบ โดยเติมบริเวณที่ตรวจจับด้วยสีที่แตกต่างชัดเจนเพื่อให้โดดเด่นจากส่วนที่เหลือของเฟรม รูปแบบที่สองคือ การดึง บริเวณเองออกมา โดยรวม clear_background=True กับ seed ที่รู้จักภายในบริเวณและอ่านภาพผลลัพธ์เป็น mask สำหรับการดำเนินการต่อเนื่อง
5.8.2. การวาดผลการตรวจจับ¶
อัลกอริทึมการประมวลผลภาพมักคืน ออบเจ็กต์ผลลัพธ์ ที่มีทั้งตำแหน่งและโครงสร้างเพิ่มเติมบางอย่าง: keypoint พร้อม orientation, การตรวจจับใบหน้าพร้อม centroid ที่แตกต่างจากกรอบล้อมรอบ, AprilTag พร้อมจุดมุมสี่จุด การวาดสิ่งเหล่านั้นให้ดี -- ด้วย glyph ที่จับโครงสร้าง ไม่ใช่แค่กรอบล้อมรอบ -- เป็นรูปแบบที่เกิดขึ้นบ่อยพอจนโมดูลเปิดเผย helper สองตัวสำหรับมัน
draw_keypoints() รับตัวบ่งชี้ลักษณะ keypoint ที่ส่งกลับโดย feature extractor หรือรายการธรรมดาของ tuple (x, y, rotation) และวาด glyph เล็ก ๆ ที่แต่ละจุด glyph บรรจุทั้งตำแหน่งและ orientation: วงกลมรอบจุดบวกเส้นออกจากจุดศูนย์กลางที่บ่งชี้การหมุน การแสดงผลด้วยการเรียกครั้งเดียวนั้นเป็นวิธีที่ง่ายที่สุดเพื่อตรวจสอบว่า keypoint extractor คืน orientation ที่แอปพลิเคชันคาดหวัง
draw_detection() รับ six-tuple (rx, ry, rw, rh, cx, cy) -- สี่เหลี่ยมล้อมรอบบวก centroid ที่รายงานแยกต่างหาก -- และวาดทั้งสองพร้อมกัน: สี่เหลี่ยมรอบกรอบล้อมรอบ, กากบาทที่ centroid และ text label ทางเลือกที่มุมของสี่เหลี่ยม รูปแบบนี้ตรงกับสิ่งที่ neural-network detection หรือ template tracker มักรายงาน ซึ่ง centroid เป็นตำแหน่งที่แม่นยำกว่าจุดกึ่งกลางของกรอบล้อมรอบจะให้ได้
เมธอด glyph ทั้งสองเป็น convenience layer เหนือ primitive เชิงเรขาคณิตที่ต้นของส่วนนี้ แอปพลิเคชันสามารถจำลองการแสดงผลเดียวกันได้เสมอโดยเรียก draw_rectangle(), draw_circle(), draw_cross() และ draw_string() โดยตรง เมธอด glyph เพียงแต่ประหยัดงาน bookkeeping สำหรับรูปแบบที่เกิดขึ้นซ้ำ ๆ
ด้วย primitive เชิงเรขาคณิตสำหรับรูปทรงที่รู้จัก, image composition สำหรับการซ้อนทับ, flood fill สำหรับบริเวณที่มาจากภาพ และ detection glyphs สำหรับรูปแบบการแสดงผลมาตรฐาน ชุดเครื่องมือการวาดก็สมบูรณ์แล้ว สิ่งที่แอปพลิเคชันต้องการเพื่อทำให้ผลลัพธ์อัลกอริทึมมองเห็นได้มีเมธอดบนพื้นผิวที่วางมันไว้ที่นั่น