5.9. การดำเนินการทางคณิตศาสตร์

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

กลุ่มคณิตศาสตร์ในคลาส Image มีขนาดเล็กพอที่จะระบุทั้งหมดได้ทีเดียว:

  • add() -- self + other ต่อพิกเซล ถูกตัดทอนที่ค่าสูงสุดของรูปแบบ

  • sub() -- self - other ต่อพิกเซล ถูกตัดทอนที่ 0 ทางด้านล่าง

  • rsub() -- other - self ต่อพิกเซล ถูกตัดทอนที่ 0 (คณิตศาสตร์เดียวกับ sub แต่สลับตัวดำเนินการ)

  • min() -- ค่าต่ำสุดต่อพิกเซลของสองค่า

  • max() -- ค่าสูงสุดต่อพิกเซล

  • difference() -- |self - other| ต่อพิกเซล คือผลต่างสัมบูรณ์

บวกกับการดำเนินการภาพเดียวที่เกี่ยวข้องอีกสองแบบ:

  • invert() -- แทนที่แต่ละพิกเซลด้วย 255 - pixel (หรือค่าสูงสุดที่เทียบเท่าสำหรับรูปแบบนั้น)

  • negate() -- นามแฝงสำหรับ invert()

Two horizontal gradient bars at the top representing source images A and B -- A going dark to bright left-to-right, B going bright to dark left-to-right. Below them, five gradient bars representing the result of each pairwise operation applied to A and B: A.add(B) appears uniform white because every position sums past 255 and clips; A.sub(B) is zero on the left half and brightens toward the right; A.difference(B) shows a V shape, bright on each end and dark in the middle; A.min(B) is dark on the ends and brighter in the middle; A.max(B) is bright on the ends and grey in the middle.

ไล่ระดับต้นทางสอง A และ B และผลลัพธ์ของการดำเนินการแบบคู่แต่ละอย่างที่ใช้กับพวกมัน ทุกการดำเนินการทำงานตำแหน่งต่อตำแหน่ง -- สิ่งที่แสดงในผลลัพธ์ที่ตำแหน่งใดตำแหน่งหนึ่งขึ้นอยู่เฉพาะกับพิกเซลต้นทางสองตัวที่ตำแหน่งนั้น

5.9.1. รูปแบบตัวดำเนินการสองแบบ

แต่ละเมธอดสองภาพยอมรับรูปแบบใดรูปแบบหนึ่งสำหรับตัวดำเนินการที่สองของมัน:

  • อีก Image ที่มีขนาดเดียวกัน การดำเนินการทางคณิตศาสตร์ทำงานตำแหน่งต่อตำแหน่ง -- ผลลัพธ์ที่ (x, y) คือการดำเนินการที่ใช้กับพิกเซลต้นทางที่ (x, y) ของทั้งสองภาพ

  • ค่าสเกลาร์ -- จำนวนเต็มสำหรับระดับสีเทา หรือ tuple (r, g, b) สำหรับ RGB565 สเกลาร์เดียวกันใช้กับทุกตำแหน่ง

รูปแบบสเกลาร์มีประโยชน์เมื่อแอปพลิเคชันต้องการเลื่อนทุกพิกเซลด้วยจำนวนคงที่ img.add(40) ทำให้ทั้งภาพสว่างขึ้น 40 หน่วย img.sub((20, 20, 20)) ทำให้ทุกพิกเซลมืดลง 20 หน่วยต่อช่อง img.max(50) ยกพิกเซลใดๆ ที่ต่ำกว่า 50 ขึ้นมาที่ 50 และปล่อยส่วนที่เหลือไว้ตามเดิม -- การดำเนินการประเภทที่แปลงพื้นเซนเซอร์ที่ใกล้ดำให้เป็นสีเทาเข้มราบเรียบสำหรับขั้นตอนถัดไปในการทำงาน

5.9.2. การตัดทอน

ค่าพิกเซลยังคงอยู่ภายในช่วงของรูปแบบตลอดทุกการดำเนินการ สำหรับช่อง 8 บิต นั่นหมายถึง 0 -- 255: สิ่งใดที่จะล้นเกิน 255 จะถูกตัดทอนกลับมาที่ 255 และสิ่งใดที่จะลงไปต่ำกว่า 0 จะถูกตัดทอนขึ้นมาที่ 0 ไม่มีการวนรอบ

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

การตัดทอนยังเป็นเหตุผลที่ sub และ rsub ให้ผลลัพธ์ที่แตกต่างกัน img_a.sub(img_b) ให้ส่วนของ a ที่สว่างกว่า b และเป็นศูนย์ทุกที่อื่น img_a.rsub(img_b) ให้ส่วนของ b ที่สว่างกว่า a อย่างใดอย่างหนึ่งมีประโยชน์สำหรับการตรวจจับการเปลี่ยนแปลง แบบด้านเดียว -- ถ้าแอปพลิเคชันสนใจเฉพาะพิกเซลที่สว่างขึ้น หรือเฉพาะพิกเซลที่มืดลง -- แต่ไม่มีทั้งคู่ที่จับภาพ การเปลี่ยนแปลงทั้งหมด ระหว่างสองเฟรม

5.9.3. การดำเนินการผลต่าง

สำหรับการตรวจจับการเปลี่ยนแปลงแบบสองด้าน การดำเนินการที่ต้องใช้คือ difference() ซึ่งคำนวณ |self - other| ที่ทุกตำแหน่ง -- ผลต่างสัมบูรณ์ ปราศจากเครื่องหมาย ทุกพิกเซลที่เปลี่ยนแปลงไปในทิศทางใดก็ตามจะปรากฏเป็นค่าที่ไม่ใช่ศูนย์ในผลลัพธ์ โดยขนาดสัดส่วนกับปริมาณที่เปลี่ยนแปลงที่ตำแหน่งนั้น

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

5.9.4. การจำกัดขอบเขตด้วยมาสก์

เมธอดคณิตศาสตร์ทั้งหมดยอมรับอาร์กิวเมนต์คีย์เวิร์ด mask ที่แนะนำในหน้าบริเวณและมาสก์ เมื่อส่งมาสก์มา การดำเนินการจะทำงานเฉพาะที่ตำแหน่งที่มาสก์ไม่ใช่ศูนย์เท่านั้น ส่วนอื่นๆ ทั้งหมดจะปล่อยให้ภาพปลายทางไว้ตามเดิม

การประกอบนั้นปรากฏในสองรูปแบบ รูปแบบแรกคือ การจำกัด การดำเนินการในพื้นที่ที่รู้จัก: ตัวอย่างเช่น การบวกสองเฟรมเข้าด้วยกันเฉพาะภายในกรอบล้อมรอบของมาร์กเกอร์ที่ตรวจพบ รูปแบบที่สองคือ การสร้าง เฟรมผสมทีละชิ้น -- min ในลำดับของเฟรมภายในมาสก์พื้นหน้า max ในลำดับเดียวกันภายในมาสก์เสริม -- รูปแบบประเภทนั้น

5.9.5. ในที่เดิม และการรักษาข้อมูลนำเข้า

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

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

diff = current.copy()       # leaves current intact
diff.difference(reference)  # diff now holds the absolute difference

รูปแบบนั้น -- คัดลอก จากนั้นดำเนินการ -- คือกระดูกสันหลังของไปป์ไลน์การหาผลต่างเฟรมใดๆ ที่เฟรมอ้างอิงต้องรอดจากการเปรียบเทียบเพื่อนำมาใช้ใหม่ในเฟรมที่จับได้ถัดไป

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