5.2. พิกัดและบริเวณ

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

5.2.1. กริดพิกเซล

พิกเซล (0, 0) คือมุม ซ้ายบน ของภาพ แกน x ชี้ไปทางขวา ดังนั้นค่า x ที่มากขึ้นหมายถึงตำแหน่งที่อยู่ทางขวามากขึ้น แกน y ชี้ ลงด้านล่าง ดังนั้นค่า y ที่มากขึ้นหมายถึงตำแหน่งที่อยู่ ต่ำลง ในภาพ ภาพที่มีขนาด width x height มีพิกเซลที่พิกัดจำนวนเต็มตั้งแต่ (0, 0) จนถึง (width - 1, height - 1) โดยไม่มีพิกเซลที่ (width, 0) หรือ (0, height) เพราะตำแหน่งเหล่านั้นคือขอบขวาและขอบล่าง ซึ่งอยู่เลยพิกเซลจริงสุดท้ายในแต่ละทิศทางออกไปหนึ่งก้าว

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

A rectangle representing an image. A marker at its top-left corner is labelled (0, 0). An arrow along the top edge points to the right labelled x; an arrow down the left edge points downward labelled y. A smaller rectangle drawn inside is labelled ROI, with its top-left corner at (x, y) and its dimensions w and h marked along the edges.

ระบบพิกัดของภาพ: จุดกำเนิดที่มุมซ้ายบน แกน x ชี้ไปทางขวา แกน y ชี้ลง บริเวณสี่เหลี่ยมภายในภาพระบุด้วยพิกัดมุมซ้ายบน (x, y) และขนาด (w, h)

5.2.2. สี่เหลี่ยม

การดำเนินการส่วนใหญ่กับภาพไม่ได้สนใจพิกเซลเดียว แต่สนใจ สี่เหลี่ยม ของพิกเซล ไม่ว่าจะเป็นพื้นที่สำหรับค้นหา บริเวณที่จะคัดลอก หรือกรอบภายในกรอบเพื่อคำนวณสถิติ รูปแบบในการระบุสี่เหลี่ยมเป็นการต่อยอดจากรูปแบบพิกเซลเดียวที่ง่ายที่สุด: ระบุพิกัดมุมซ้ายบน ตามด้วยขนาดของสี่เหลี่ยม บรรจุในทูเพิลสี่ค่า (x, y, w, h) โดยพิกเซลภายในสี่เหลี่ยมอยู่ที่คอลัมน์ x ถึง x + w - 1 และแถว y ถึง y + h - 1

รายละเอียดที่ควรระบุให้ชัดเจนคือ w และ h คือ ขนาด ไม่ใช่พิกัดมุมขวาล่าง สี่เหลี่ยม (10, 20, 4, 3) ครอบคลุมคอลัมน์ 10, 11, 12, 13 และแถว 20, 21, 22 รวมสิบสองพิกเซล ไม่ใช่บริเวณที่วิ่งจาก (10, 20) ไปถึง (4, 3) รูปแบบนี้ใช้อย่างสม่ำเสมอตลอดทั้ง module ดังนั้นเมื่อซึมซับจนคุ้นแล้วก็จะไม่เกิดความสับสนอีก แต่มักสะดุดในครั้งแรก

รูปแบบ (x, y, w, h) ปรากฏในสามกรณีที่ดูแตกต่างแต่ใช้รูปแบบเดียวกัน กรณีแรกคือเมื่อภาพอธิบายขนาดตัวเอง: สี่เหลี่ยมที่ครอบคลุมภาพทั้งหมดคือ (0, 0, width, height) กรณีที่สองคือเมื่อเมธอดตรวจจับส่งคืนผลลัพธ์พร้อมกรอบล้อมรอบ ไม่ว่าจะเป็น blob, rect หรือ apriltag โดยกรอบจะถูกรายงานในรูปแบบ (x, y, w, h) กรณีที่สามคือเมื่อเมธอดต้องการทำงานกับส่วนย่อยของภาพแทนที่จะเป็นทั้งเฟรม อาร์กิวเมนต์คีย์เวิร์ด roi ที่กำหนดขอบเขตการทำงานก็ใช้ทูเพิลสี่ค่าเดียวกัน

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

5.2.3. ที่อยู่เป็นจำนวนเต็ม เซนทรอยด์เป็นทศนิยม

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

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

กรณีอื่นคือ การกระจัด ระหว่างสองเฟรมที่วัดในโดเมนความถี่ เทคนิคที่วิเคราะห์เนื้อหาสเปกตรัมของภาพแทนที่จะวิเคราะห์พิกเซลโดยตรงสามารถแยกแยะการเลื่อนที่ละเอียดกว่าหนึ่งพิกเซลได้ และรายงานการเลื่อนเหล่านั้นเป็นค่าทศนิยม (dx, dy)

กฎง่ายๆ คือ: ที่อยู่พิกเซลเป็นจำนวนเต็ม ส่วนตำแหน่งและการเลื่อนที่ ได้จาก อัลกอริทึมอาจเป็นทศนิยม เมธอดการวาดรับได้ทั้งสองรูปแบบและปัดทศนิยมลงสู่พิกเซลจำนวนเต็มที่ใกล้ที่สุดเมื่อผลลัพธ์ต้องตกลงบนกริด

5.2.4. คาร์ทีเซียนและโพลาร์

ระบบที่อธิบายมาจนถึงตอนนี้คือระบบคาร์ทีเซียน: พิกเซลแต่ละตัวถูกระบุด้วยระยะห่างแนวนอนและแนวตั้งจากจุดกำเนิด นั่นคือระบบที่ไบต์ถูกจัดเก็บ -- พิกเซล i ในบัฟเฟอร์ตรงกับพิกเซลที่คอลัมน์ i % width และแถว i // width เดินผ่านแถวจากบนลงล่าง และเป็นระบบที่ทุกเมธอดทำงานด้วยโดยค่าเริ่มต้น

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

Two rectangles side by side, each representing the same image. The left one shows Cartesian coordinates -- top-left origin, x and y axes, a sample point P at coordinates (x, y). The right one shows polar coordinates -- a centre marker C inside the rectangle, with a line from C to the same point P labelled r (distance), and an arc labelled theta (angle).

จุด P เดิมถูกระบุสองวิธี: คาร์ทีเซียน (x, y) จากจุดกำเนิดมุมซ้ายบน และ โพลาร์ (r, theta) จากจุดศูนย์กลางที่เลือก

ทำไมต้องสลับระบบ? เพราะเอกลักษณ์สองอย่างที่เปลี่ยนการค้นหาที่ยากให้กลายเป็นเรื่องง่าย

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

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

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

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

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