5.9. การดำเนินการทางคณิตศาสตร์¶
กลุ่มการวาดในส่วนก่อนหน้าวาด ลงใน ภาพ กลุ่มคณิตศาสตร์รวม ภาพสองภาพเข้าเป็นภาพที่สาม -- บวกค่าพิกเซลเข้าด้วยกัน ลบภาพหนึ่งออกจากอีกภาพ หรือหาค่าต่ำสุดหรือสูงสุดที่ทุกตำแหน่ง การดำเนินการทางคณิตศาสตร์ระดับพิกเซลชุดเล็กๆ นั้นคือสิ่งที่ การหาผลต่างเฟรม การลบพื้นหลัง การซ้อนภาพรับแสง และรูปแบบคลาสสิกอื่นๆ อีกหลายรูปแบบถูกสร้างขึ้นมาจาก
กลุ่มคณิตศาสตร์ในคลาส Image มีขนาดเล็กพอที่จะระบุทั้งหมดได้ทีเดียว:
add()--self + otherต่อพิกเซล ถูกตัดทอนที่ค่าสูงสุดของรูปแบบsub()--self - otherต่อพิกเซล ถูกตัดทอนที่0ทางด้านล่างrsub()--other - selfต่อพิกเซล ถูกตัดทอนที่0(คณิตศาสตร์เดียวกับsubแต่สลับตัวดำเนินการ)min()-- ค่าต่ำสุดต่อพิกเซลของสองค่าmax()-- ค่าสูงสุดต่อพิกเซลdifference()--|self - other|ต่อพิกเซล คือผลต่างสัมบูรณ์
บวกกับการดำเนินการภาพเดียวที่เกี่ยวข้องอีกสองแบบ:
invert()-- แทนที่แต่ละพิกเซลด้วย255 - pixel(หรือค่าสูงสุดที่เทียบเท่าสำหรับรูปแบบนั้น)
ไล่ระดับต้นทางสอง 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
รูปแบบนั้น -- คัดลอก จากนั้นดำเนินการ -- คือกระดูกสันหลังของไปป์ไลน์การหาผลต่างเฟรมใดๆ ที่เฟรมอ้างอิงต้องรอดจากการเปรียบเทียบเพื่อนำมาใช้ใหม่ในเฟรมที่จับได้ถัดไป
ด้วยการดำเนินการรวมหกแบบ การดำเนินการภาพเดียวสองแบบ เครื่องมือหลักผลต่างสัมบูรณ์ และคีย์เวิร์ดมาสก์สำหรับการจำกัดขอบเขต ชุดเครื่องมือคณิตศาสตร์พิกเซลครอบคลุมการรวมความสว่างและช่องที่การมองเห็นของเครื่องแบบคลาสสิกต้องการ เครื่องมือที่คล้ายคณิตศาสตร์ที่เหลืออยู่บนพื้นผิวทำงานทีละบิตแทนที่จะเป็นทีละค่า