เรียนรู้การตรวจจับเส้นตรงในรูปภาพด้วยเทคนิค Hough Transform ผ่าน OpenCV
Hough Transform คืออะไร?
Hough Transform เป็น Feature Extraction Method สำหรับตรวจจับรูปทรงง่ายๆ ที่สามารถแทนได้ในรูปแบบทางคณิตศาสตร์ สามารถตรวจจับได้แม้รูปทรงจะแตกหรือบิดเบือนเล็กน้อย
"Simple Shape" คือรูปทรงที่แทนได้ด้วยพารามิเตอร์ไม่มาก เช่น เส้นตรง (2 พารามิเตอร์: slope, intercept) วงกลม (3 พารามิเตอร์: center x, y และ radius)
หลักการตรวจจับเส้นตรง
เส้นตรงแทนได้ด้วยสมการพารามิเตอร์: ρ = x·cos(θ) + y·sin(θ)
ρ (rho): ระยะห่างตั้งฉากจาก Origin ถึงเส้นθ (theta): มุมระหว่างเส้นตั้งฉากกับแกน X (วัด Counter-clockwise)

Accumulator (ตัวสะสมคะแนน)
- สร้าง 2D Array (Accumulator) ขนาดขึ้นกับความแม่นยำ ที่ต้องการ เช่น θ = 1° ต้องการ 180 Columns, ρ = Diagonal ของรูปภาพ
- สำหรับแต่ละจุดบนเส้น (Edge Point) คำนวณ
(ρ, θ)ทุกค่าที่เป็นไปได้ - เพิ่มค่าใน Accumulator Cell ที่ตรงกับ
(ρ, θ)(Voting) - Cell ที่มีคะแนนสูงสุด = เส้นตรงที่ตรวจพบ
Hough Transform ใน OpenCV
ฟังก์ชัน cv2.HoughLines() คืน Array ของ (ρ, θ) โดย ρ วัดเป็น Pixel, θ วัดเป็น Radian
มีอีกแบบ cv2.HoughLinesP() (Probabilistic) เร็วกว่า คืน Endpoints ของเส้นตรง (x1, y1, x2, y2)
ตัวอย่างโค้ดเต็ม
import cv2
import numpy as np
# โหลดรูป
img = cv2.imread('parkingLot1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Edge Detection ด้วย Canny
edges = cv2.Canny(gray, 75, 150)
# Hough Lines Probabilistic
lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=30,
minLineLength=50, maxLineGap=250)
# วาดเส้นตรงที่พบ
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(img, (x1, y1), (x2, y2), (0, 0, 128), 2)
# แสดงผล
cv2.imshow('Edges', edges)
cv2.imshow('Lines Detected', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
พารามิเตอร์สำคัญของ HoughLinesP
rho: ความละเอียดระยะห่าง (Pixel) ปกติ = 1theta: ความละเอียดมุม (Radian) ปกติ =np.pi/180(1 องศา)threshold: ขั้นต่ำ Votes เพื่อถือว่าเป็นเส้นตรงminLineLength: ความยาวขั้นต่ำของเส้น (Pixel)maxLineGap: ช่องว่างสูงสุดระหว่าง Segment เพื่อรวมเป็นเส้นเดียว