5.12. การกำหนดค่าขีดแบ่งแบบไบนารี

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

5.12.1. เมธอด binary

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

ในรูปแบบที่ง่ายที่สุด รายการค่าขีดแบ่งมีช่วงเดียวและการเรียกคืนค่ามาสก์ของพิกเซลในช่วงนั้น:

img.binary([(120, 255)])

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

A horizontal grayscale gradient at the top labelled "input -- pixel values from 0 to 255". Below it, an inclusive threshold range from lo to hi is marked with brackets along the gradient, enclosing the range of brightness values that count as matches. A binary output bar at the bottom shows white inside the lo-to-hi range and black outside it.

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

5.12.2. ทูเปิลระดับสีเทา

สำหรับภาพระดับสีเทา แต่ละรายการในรายการค่าขีดแบ่งเป็นทูเปิลสองสมาชิก (lo, hi) ที่อธิบายช่วงความสว่างแบบรวม พิกเซลที่มีค่าระหว่าง lo และ hi (รวม) จะจับคู่ได้ ส่วนทุกอย่างนอกช่วงนั้นจะไม่จับคู่ รูปแบบที่เป็นธรรมชาติเป็นเรื่องง่ายๆ:

  • (0, 60) จับคู่พิกเซลมืด ซึ่งเป็นทุกอย่างตั้งแต่สีดำจนถึงสีเทาเข้ม

  • (180, 255) จับคู่พิกเซลสว่าง ซึ่งเป็นทุกอย่างตั้งแต่สีเทาอ่อนจนถึงสีขาว

  • (100, 160) จับคู่พิกเซลสีเทากลาง ซึ่งเป็นแถบกลางในช่วงความสว่าง

ลำดับของค่าสองค่าภายในทูเปิลไม่สำคัญ เมธอดจะสลับค่าภายในหาก lo มากกว่า hi ดังนั้น (60, 0) ทำงานเหมือนกับ (0, 60)

5.12.3. ทูเปิล LAB สำหรับสี

สำหรับภาพ RGB565 แต่ละรายการเป็นทูเปิลหกสมาชิก (l_lo, l_hi, a_lo, a_hi, b_lo, b_hi) ที่อธิบายช่วงแบบรวมใน LAB color space แทนที่จะเป็นสีแดง สีเขียว และสีน้ำเงินโดยตรง ค่าขีดแบ่งคือ L (ความสว่าง) A (แกนสีโครมาติกจากสีเขียวถึงสีแดง) และ B (แกนสีโครมาติกจากสีน้ำเงินถึงสีเหลือง) แต่ละค่าเปรียบเทียบกับค่าของพิกเซลในช่องนั้น

เหตุผลที่ใช้ LAB แทนการกำหนดค่าขีดแบ่ง RGB โดยตรงคือคุณสมบัติที่ LAB color space ถูกออกแบบมารองรับ: LAB แยกความสว่างออกจากโครมา พิกเซลสองอันที่แสดงสีเดียวกันแต่ที่ความสว่างต่างกันจะอยู่ที่ค่า L ต่างกัน แต่ที่ค่า A และ B ใกล้เคียงกัน การแยกนี้ทำให้ช่วงค่าขีดแบ่งสามารถอธิบาย สี ด้วยตำแหน่งบนแกน A และ B และปล่อยช่วง L ให้กว้างเพื่อรับสีนั้นที่ทุกความสว่างตั้งแต่เงามืดจนถึงไฮไลต์ ค่าขีดแบ่งแบบ RGB ไม่สามารถทำเช่นนั้นได้ การเปลี่ยนแปลงของแสงใดๆ ก็จะเปลี่ยนค่า R, G, B ทั้งสามพร้อมกัน และตัวติดตามที่สร้างบนค่าขีดแบ่ง RGB จะพังทันทีที่เมฆผ่านดวงอาทิตย์

รูปแบบปฏิบัติ: เลือกช่วง A และ B ที่อธิบายสีที่แอปพลิเคชันกำลังติดตาม และปล่อยช่วง L ให้กว้าง โดยมักใช้ (0, 100) เพื่อรับทุกความสว่าง เว้นแต่แอปพลิเคชันต้องการกำหนดค่าขีดแบ่งบนความสว่างร่วมด้วย

สำหรับทูเปิลที่มีค่าน้อยกว่าหกค่า ส่วนประกอบที่ขาดหายไปจะใช้ค่าเริ่มต้นเป็นช่วงสูงสุด (ไม่มีข้อจำกัดบนแกนนั้น) ทูเปิลสองสมาชิก (l_lo, l_hi) ในรายการค่าขีดแบ่ง RGB565 จึงกำหนดค่าขีดแบ่งเฉพาะบนความสว่างและจับคู่ทุกสี

Note

ช่วง L ที่กว้างมากมีข้อดักในด้านล่าง เมื่อความสว่างลดลงสู่ศูนย์ ทุกสีจะรวมกันเป็นสีดำ โดยค่า A และ B จะยุบตัวสู่ศูนย์และถูกครอบงำด้วยสัญญาณรบกวน ทำให้พิกเซลมืดสามารถเลื่อนเข้าสู่ช่วง A และ B และถูกติดตามว่าเป็นสีเป้าหมาย หากบริเวณสีดำในฉากปรากฏเป็นการจับคู่ ให้เพิ่ม l_lo จนกว่าจะหายไป

5.12.4. ค่าสถานะ

อาร์กิวเมนต์คีย์เวิร์ดสามตัวควบคุมเอาต์พุต:

  • invert=True พลิกผลลัพธ์ ทุกพิกเซลที่ จะ จับคู่ได้จะกลายเป็นศูนย์ และทุกพิกเซลที่ จะ เป็นศูนย์จะกลายเป็นค่าสูงสุด มีประโยชน์เมื่อวิธีธรรมชาติในการอธิบายเบื้องหน้าคือการระบุสิ่งที่มัน ไม่ใช่

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

  • to_bitmap=True คืนค่าผลลัพธ์เป็นภาพ BINARY แทนที่จะเขียนทับรูปแบบที่มีอยู่ของแหล่ง ผลลัพธ์หนึ่งบิตต่อพิกเซลคือสิ่งที่อาร์กิวเมนต์มาสก์ในภายหลังรับได้โดยตรง และการแปลงมักช่วยลดแรงกดดันของหน่วยความจำในการพกพามาสก์รูปแบบเต็ม

มาสก์และ ROI ใช้ข้อตกลงเดียวกับส่วนที่เหลือของ surface: สี่เหลี่ยม roi กำหนดขอบเขตการดำเนินการให้อยู่ในพื้นที่ย่อย และภาพ mask กำหนดขอบเขตให้อยู่ในรูปแบบตำแหน่งที่กำหนดเอง

5.12.5. ทำงานในตำแหน่งเดิมโดยค่าเริ่มต้น

เช่นเดียวกับการดำเนินการทางเลขคณิต binary ทำงานในตำแหน่งเดิมโดยค่าเริ่มต้น: พิกเซลของภาพต้นทางจะถูกเขียนทับด้วยเอาต์พุตไบนารี และค่าเดิมจะสูญหายหลังจากการเรียก รูปแบบ to_bitmap=True เป็นทางเลือกเมื่อต้องการเก็บต้นทางไว้และเอาต์พุตควรเป็นภาพ BINARY ที่จัดสรรใหม่ รูปแบบ copy=True ก็รองรับเช่นกันสำหรับผลลัพธ์รูปแบบเดิมบนบัฟเฟอร์ใหม่