5.5. บริเวณที่สนใจและมาสก์¶
ทุกการดำเนินการในโมดูล image จะประมวลผลพิกเซลทุกตัวของภาพต้นฉบับโดยค่าเริ่มต้น นั่นคือพฤติกรรมที่อธิบายได้ง่ายที่สุดและเหมาะสมเมื่ออัลกอริทึมต้องการครอบคลุมทั้งเฟรม เช่น การปรับสีแบบสม่ำเสมอ ฮิสโตแกรมทั่วทั้งภาพ หรือการเข้ารหัสเพื่อส่งข้อมูล แต่อัลกอริทึมส่วนใหญ่ในทางปฏิบัติต้องการดูพื้นที่น้อยกว่านั้น ตัวติดตามบลอบที่ดูเครื่องหมายสีสนใจเฉพาะส่วนของฉากที่เครื่องหมายอาจปรากฏ ไม่ใช่กำแพงด้านหลัง การประมวลผลทางสัณฐานวิทยาจะปลอดภัยเฉพาะเมื่อรันบนพิกเซลที่ขั้นตอนก่อนหน้าระบุว่าเป็นผู้สมัคร ตัวตรวจจับใบหน้าอาจทำงานเฉพาะภายในกรอบล้อมรอบที่ตัวตรวจจับหยาบกว่าระบุไว้แล้ว โมดูล image รองรับการทำงานนี้ผ่านสองกลไกที่จำกัดขอบเขตการดำเนินการให้กับพิกเซลบางส่วน ได้แก่ บริเวณที่สนใจ (ROI) แบบสี่เหลี่ยม และ มาสก์ แบบไบนารี ทั้งสองสามารถใช้ร่วมกันได้อย่างอิสระ และเกือบทุกเมธอดที่ประมวลผลพิกเซลรับทั้งสองหรือแบบใดแบบหนึ่งเป็นอาร์กิวเมนต์คีย์เวิร์ด
5.5.1. บริเวณที่สนใจ (ROI)¶
บริเวณที่สนใจคือสี่เหลี่ยมของพิกเซลที่ระบุด้วย four-tuple (x, y, w, h) ตามที่อธิบายไว้ในหน้าพิกัด ประมาณสามสิบเมธอดในส่วนนี้รับอาร์กิวเมนต์คีย์เวิร์ด roi เมื่อระบุ การดำเนินการจะรันเฉพาะบนพิกเซลภายในสี่เหลี่ยมนั้นและปล่อยส่วนที่เหลือของภาพไม่เปลี่ยนแปลง เมื่อ roi เป็น None หรือละเว้น การดำเนินการจะรันบนภาพทั้งหมด เหมือนกับการส่ง roi=(0, 0, width, height)
ในโค้ด คีย์เวิร์ดนี้จะอยู่ร่วมกับอาร์กิวเมนต์อื่นๆ ที่การดำเนินการนั้นต้องการ:
# Compute a histogram over a centred crop of the image.
h = img.get_histogram(roi=(64, 64, 128, 128))
สิ่งแรกที่ ROI ให้ได้คือ การควบคุมผลบวกปลอม ตัวติดตามสีที่ดูเฉพาะโต๊ะจะไม่ถูกกระตุ้นโดยเสื้อผ้าที่เดินผ่าน ตัวตรวจจับขอบที่รันเฉพาะภายในพื้นที่ทำงานที่กำหนดจะไม่รายงานขอบของฐานยึดกล้องเลย การลดพื้นที่ค้นหาให้เหลือเฉพาะส่วนที่อัลกอริทึมสนใจจริงๆ เป็นการปรับปรุงที่ถูกที่สุดที่ pipeline สามารถทำได้เพื่อความน่าเชื่อถือของตัวเอง
สิ่งที่สองที่ ROI ให้ได้คือ pipeline แบบหยาบไปละเอียด วัตถุผลลัพธ์การตรวจจับ ได้แก่ blob, rect, apriltag และอื่นๆ จะเปิดเผยกรอบล้อมรอบเป็น four-tuple (x, y, w, h) เดียวกันที่ roi รับ ดังนั้นขั้นตอนแรกหยาบๆ สามารถส่งคืนกรอบล้อมรอบ กรอบนั้นเข้าสู่ roi ของขั้นตอนถัดไปโดยตรง และขั้นตอนที่สองรันบนพื้นที่แคบกว่า การแคบลงเรื่อยๆ แต่ละครั้งทำให้ขั้นตอนถัดไปเร็วขึ้นและผลลัพธ์น่าเชื่อถือมากขึ้น เพราะพื้นที่ค้นหาถูกกรองไปแล้ว
5.5.2. มาสก์แบบไบนารี¶
สี่เหลี่ยมเป็นรูปแบบที่เหมาะสมเมื่อพื้นที่ที่สนใจอยู่ในแนวแกน เมื่อไม่ใช่เช่นนั้น เช่น บริเวณโค้ง บริเวณที่ไม่นูน หรือพิกเซลที่ขั้นตอนก่อนหน้าจำแนกว่าเป็น "ตรงกัน" การดำเนินการต้องถูกบอกให้จำกัดขอบเขตตัวเองกับรูปแบบพิกเซลโดยพลการแทน กลไกสำหรับเรื่องนี้คือมาสก์แบบไบนารี ซึ่งเป็น Image แยกต่างหากที่มีขนาดเดียวกันกับต้นฉบับ ใช้เป็นสวิตช์เปิด/ปิดต่อพิกเซล พิกเซลที่ไม่เป็นศูนย์ในมาสก์หมายถึง "รวมพิกเซลต้นฉบับที่ตรงกัน" ส่วนพิกเซลศูนย์หมายถึง "ปล่อยพิกเซลต้นฉบับไว้ตามเดิม"
มาสก์มักเป็นภาพ BINARY ซึ่งเป็นรูปแบบหนึ่งบิตต่อพิกเซลที่มีไว้เพื่อจุดประสงค์นี้โดยเฉพาะ แต่ภาพช่องสัญญาณเดี่ยวใดก็ได้จะทำงานได้ เพราะผู้ใช้จะถือว่าค่าที่ไม่ใช่ศูนย์คือเปิด
เมธอดการกรอง การหาค่าขีดแบ่ง และการคำนวณเลขคณิตรับอาร์กิวเมนต์คีย์เวิร์ด mask รูปแบบจะเหมือนกันในแต่ละเมธอด ได้แก่ ภาพไบนารีที่จัดสรรแยกต่างหาก มีขนาดเดียวกันกับต้นฉบับ ส่งผ่านเข้าไป
ROI และมาสก์ ผสานกัน ส่งทั้งคู่ แล้วการดำเนินการจะรันเฉพาะบนพิกเซลที่อยู่ภายใน ROI และ เปิดอยู่ในมาสก์ กลไกทั้งสองให้โค้ดแอปพลิเคชันมีตัวควบคุมอิสระ ตัวหนึ่งสำหรับพื้นที่สี่เหลี่ยมที่สนใจ อีกตัวสำหรับรูปแบบโดยพลการภายใน โดยไม่ให้รูปแบบใดรับข้อจำกัดจากอีกรูปแบบ
ROI จำกัดการดำเนินการให้อยู่ในสี่เหลี่ยมตามแนวแกน มาสก์จำกัดยิ่งขึ้นไปอีกให้อยู่กับรูปแบบพิกเซลโดยพลการ ทั้งสองผสานกัน: เฉพาะพิกเซลที่อยู่ภายใน ROI และ เปิดอยู่ในมาสก์เท่านั้นที่ถูกแก้ไข¶
5.5.3. การสร้างมาสก์¶
เมธอด Image สามตัวสร้างรูปทรงมาสก์ทั่วไปในตัวเองโดยการทำให้พิกเซล นอก บริเวณที่เลือกเป็นศูนย์:
mask_rectangle()รักษาสี่เหลี่ยมmask_circle()รักษาวงกลมmask_ellipse()รักษาวงรี
แต่ละตัวรับ (x, y, w, h) (สำหรับสี่เหลี่ยมและวงรี) หรือ (x, y, radius) (สำหรับวงกลม) การเรียกใช้โดยไม่มีอาร์กิวเมนต์จะจัดกึ่งกลางรูปทรงและกำหนดขนาดให้เต็มภาพ ซึ่งเป็นรูปแบบที่แอปพลิเคชันใช้เมื่อต้องการวงรีหรือวงกลมเต็มภาพที่ซ่อนเฉพาะมุม
mask = image.Image(img.width(), img.height(), image.BINARY)
mask.clear() # start from all zeros
mask.mask_ellipse() # centred, full-size oval
มาสก์ที่น่าสนใจมักไม่ได้มาจากเมธอด mask_* เพียงอย่างเดียว แต่มาจากขั้นตอนก่อนหน้าของ pipeline การประมวลผลค่าขีดแบ่งให้ผลเป็นภาพไบนารีที่พิกเซลที่ไม่ใช่ศูนย์ระบุตรงกัน ซึ่งเป็นรูปแบบที่พอดีสำหรับป้อนเข้าอาร์กิวเมนต์ mask= ของขั้นตอนถัดไป การประมวลผลทางสัณฐานวิทยาปรับแต่งมาสก์นั้นโดยไม่เปลี่ยนรูปแบบ สิ่งใดก็ตามที่กลายเป็นภาพช่องสัญญาณเดี่ยวก็เป็นมาสก์ที่ถูกต้อง
5.5.4. วิธีที่การดำเนินการแก้ไขภาพ¶
รูปแบบที่ปรากฏในทุกตัวอย่างโค้ดในหน้าที่ผ่านมา ซึ่งก็คือการดำเนินการส่งคืน img เดียวกันสำหรับการเชื่อมโยง ควรอธิบายอย่างชัดเจนเพื่อไม่ต้องกล่าวซ้ำทุกครั้งที่แนะนำเมธอดใหม่ เมธอดสามกลุ่มปรากฏบนพื้นผิว Image โดยแต่ละกลุ่มจัดการกับภาพต้นฉบับต่างกัน:
เมธอดการทำงาน แก้ไขพิกเซลของต้นฉบับในตัวเองและส่งคืนภาพเดียวกันสำหรับการเชื่อมโยง กลุ่มการวาด เลขคณิต ค่าขีดแบ่ง และตัวกรองล้วนทำงานแบบนี้
img.gaussian(1)เบลอimgและส่งคืนimgเดิม การกำหนดค่าใหม่img = img.gaussian(1)ไม่เป็นอันตรายแต่ไม่จำเป็นเมธอดการแปลง ทำงานในตัวเองโดยค่าเริ่มต้นเหมือนกับเมธอดการทำงาน แต่รับ
copy=Trueและcopy_to_fb=Trueเพื่อจัดสรรภาพผลลัพธ์แยกต่างหากเมื่อต้องการรักษาต้นฉบับ การแปลงรูปแบบและสำเนาเชิงเรขาคณิตเป็นสมาชิกหลักของกลุ่มนี้เมธอดการตรวจสอบ อ่านพิกเซลและส่งคืน วัตถุผลลัพธ์ ได้แก่ รายการลักษณะเด่นที่ตรวจพบ ฮิสโตแกรม หรือชุดสถิติ โดยไม่แก้ไขภาพต้นฉบับเลย
การแบ่งสามกลุ่มนี้มีความสอดคล้องกันตลอดทั้งพื้นผิว การรู้ว่าเมธอดอยู่ในกลุ่มใดบอกแอปพลิเคชันว่าคาดหวังอะไรจากการเรียก: พิกเซลของต้นฉบับจะอยู่รอดครบถ้วนหรือไม่ จะมีการจัดสรรภาพผลลัพธ์แยกต่างหากหรือไม่ และค่าที่ส่งคืนคือต้นฉบับเองหรืออะไรอื่น