01204483 Image Processing — Topic 07, Hough Transforms
แต่ละจุดในภาพไม่ได้ "โหวต" ให้รูปทรงเดียว — มันโหวตให้ ทุกรูปทรงที่เป็นไปได้ที่ผ่านจุดนั้น พร้อมกัน ในรูปของเส้นโค้งหนึ่งเส้นใน parameter space ถ้าหลายจุดอยู่บนเส้นตรง/วงกลมเดียวกันจริง ๆ เส้นโค้งของพวกมันจะไปตัดกันที่จุดเดียว — จุดตัดที่มีโหวตเยอะที่สุดก็คือรูปทรงที่ตรวจพบ
เลือกรูปทรงที่จะตรวจจับ
จุดหนึ่งจุดในภาพผ่านเส้นตรงได้ หลายแบบไม่จำกัด (สโลปไหนก็ได้) — Hough transform แปลง "จุดนั้นอาจอยู่บนเส้นตรงไหนได้บ้าง" ให้กลายเป็นเส้นโค้ง/เส้นตรงหนึ่งเส้นใน parameter space
โดเมนที่คุ้นเคย: y = mx + c — จุด (x,y) หนึ่งจุด กลายเป็นเส้นตรง c = y − m·x ในปริภูมิ (m, c) แทน (สลับบทบาท x,y กับ m,c)
ปัญหาของ (m,c): เส้นตั้งฉาก (vertical) มี slope m = ∞ ซึ่งไม่มีที่ยืนในกราฟที่มีขอบเขตจำกัด — ลองพรีเซ็ต "เส้นเกือบตั้งฉาก" ดูที่ข้อ 2
ทางแก้: parametrize ด้วย ρ = x·cosθ + y·sinθ แทน — จุด (x,y) กลายเป็นเส้นโค้ง sine curve ในปริภูมิ (θ, ρ) ซึ่ง θ ครอบคลุมทุกทิศทางได้โดยไม่มีค่า infinite เลย
จุดที่collinear กันจริง ไม่ว่าจะมองในโดเมนไหน เส้นโค้ง/เส้นตรงของทุกจุดจะไปตัดกันที่ตำแหน่งพารามิเตอร์เดียวกันเสมอ — จุดตัดสะสมโหวตสูง กลายเป็น peak ที่บอกว่าเส้นไหนคือคำตอบ
จุด noise ที่ไม่ได้อยู่บนเส้นไหนเลย ก็ยังโหวตเหมือนกัน แต่เส้นโค้ง/เส้นตรงของมันกระจายไม่ตรงกับใคร จึงไม่สะสมเป็น peak — ลองเอาเมาส์ชี้จุดในข้อ 1 ดูเส้นของมันเด่นขึ้นมาในทั้งสองโดเมน
จุดหนึ่งจุดในภาพผ่านวงกลมได้ หลายแบบไม่จำกัด (ศูนย์กลาง/รัศมีต่างกัน) — โมเดลสมการวงกลม (x−a)² + (y−b)² = r² มี 3 พารามิเตอร์ (a, b, r)
เดโมนี้กำหนด r คงที่ค่าหนึ่งก่อน (เลื่อนดูได้) — จุด (x,y) โหวตเป็น วงกลมรัศมี r เดียวกัน รอบจุดนั้นเองในปริภูมิ (a, b) ของศูนย์กลางที่เป็นไปได้ — ความสมมาตรที่สวยงามของปัญหานี้
จุดที่อยู่บนวงกลมขนาดเดียวกันจริง วงกลมโหวตของทุกจุดจะไปตัดกันที่ตำแหน่ง (a,b) เดียวกันเสมอ เมื่อ r ที่เลือกตรงกับรัศมีจริง
ลองเลื่อน r ไปเรื่อย ๆ — โหวตสูงสุดจะแหลมที่สุดพอดีที่รัศมีจริง ของวงกลมในภาพ แล้วอ่อนลงทันทีถ้า r ผิดไปแม้เพียงเล็กน้อย
จุด noise ก็ยังโหวตเหมือนกัน แต่วงกลมของมันกระจายไม่ตรงกับใคร จึงไม่สะสมเป็น peak — แม้มีแค่บางส่วนของวงกลม (ส่วนโค้ง) ก็ยังหาศูนย์กลางเจอได้
ลองเอาเมาส์ชี้จุดในข้อ 1 ดูวงกลมโหวตของมันเด่นขึ้นมาในข้อ 2 แล้วดูกราฟโหวตสูงสุดเทียบกับ r ว่ายอดแหลมอยู่ตรงไหน
1 · จุดทดสอบ (คลิกที่ภาพเพื่อเพิ่ม/ลบจุดเองได้)
จุดทั้งหมด: 0 จุด — เอาเมาส์ชี้ใกล้จุดใดจุดหนึ่งเพื่อดูเส้นโค้ง/เส้นตรงของมันในข้อ 2
2 · สองโดเมนพารามิเตอร์ที่บอกเรื่องเดียวกัน — (m,c) และ (ρ,θ)
จุดแต่ละจุดในข้อ 1 แปลงเป็นเส้นตรง/เส้นโค้งหนึ่งเส้นในแต่ละโดเมนด้านล่างพร้อมกัน — เอาเมาส์ชี้ใกล้จุดใดในข้อ 1 เพื่อดูเส้นของมันเด่นขึ้นมาทั้งสองฝั่ง
(m, c) — slope-intercept (y = mx + c)
จุด (x,y) กลายเป็น เส้นตรง c = y − m·x — แต่มีปัญหา: เส้นตั้งฉาก (vertical) มี slope m = ∞ ซึ่งไม่มีที่ยืนในกราฟที่มีขอบเขตจำกัดแบบนี้เลย (ลองพรีเซ็ต "เส้นเกือบตั้งฉาก" ในข้อ 1 ดู — peak จะจางหรือหลุดขอบจอ)
แกน x = m (จำกัดช่วง −8 ถึง 8), แกน y = c (ปรับสเกลอัตโนมัติตามจุดปัจจุบัน)
—
(ρ, θ) — normal form (ไม่มีปัญหาเส้นตั้งฉาก)
จุด (x,y) กลายเป็นเส้นโค้ง sine — θ ครอบคลุมทุกทิศทางรวมถึงแนวตั้ง (θ=0) โดยไม่มีค่า infinite เลย จึงไม่มีปัญหาแบบโดเมน (m,c) ทางซ้าย
เส้นตรงที่ตรวจพบ: — เส้น (โหวตสูงสุด — จาก — จุด)
1 · จุดทดสอบ (คลิกที่ภาพเพื่อเพิ่ม/ลบจุดเองได้)
จุดทั้งหมด: 0 จุด — เอาเมาส์ชี้ใกล้จุดใดจุดหนึ่งเพื่อดู "วงกลมโหวต" ของมันในข้อ 2 (รัศมีเท่ากับ r ที่เลือกไว้)
2 · Accumulator (a, b) ที่รัศมี r + วงกลมที่ตรวจพบ
แต่ละจุดในข้อ 1 โหวตเป็นวงกลมรัศมี r รอบตัวมันเองในปริภูมินี้ — ลองเลื่อน r แล้วดูว่า peak คมที่สุดตอนไหน
โหวตสูงสุดที่ r นี้: — จาก — จุด
โหวตสูงสุด (แกน y) เทียบกับรัศมีที่กวาดดู (แกน x) — ยอดแหลม = รัศมีจริงของวงกลมในภาพ
วงกลมที่ตรวจพบ (กวาดทุกรัศมี): — วง