01204483 Image Processing — Topic 07, Hough Transforms

Hough Transform — จุดในภาพ กลายเป็นเส้นโค้งใน Parameter Space ได้อย่างไร

แต่ละจุดในภาพไม่ได้ "โหวต" ให้รูปทรงเดียว — มันโหวตให้ ทุกรูปทรงที่เป็นไปได้ที่ผ่านจุดนั้น พร้อมกัน ในรูปของเส้นโค้งหนึ่งเส้นใน 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) ทางซ้าย

65%

เส้นตรงที่ตรวจพบ: เส้น (โหวตสูงสุด จาก จุด)

1 · จุดทดสอบ (คลิกที่ภาพเพื่อเพิ่ม/ลบจุดเองได้)

จุดทั้งหมด: 0 จุด — เอาเมาส์ชี้ใกล้จุดใดจุดหนึ่งเพื่อดู "วงกลมโหวต" ของมันในข้อ 2 (รัศมีเท่ากับ r ที่เลือกไว้)

2 · Accumulator (a, b) ที่รัศมี r + วงกลมที่ตรวจพบ

แต่ละจุดในข้อ 1 โหวตเป็นวงกลมรัศมี r รอบตัวมันเองในปริภูมินี้ — ลองเลื่อน r แล้วดูว่า peak คมที่สุดตอนไหน

35

โหวตสูงสุดที่ r นี้: จาก จุด

โหวตสูงสุด (แกน y) เทียบกับรัศมีที่กวาดดู (แกน x) — ยอดแหลม = รัศมีจริงของวงกลมในภาพ

55%

วงกลมที่ตรวจพบ (กวาดทุกรัศมี): วง