Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Line Detection ใน Python ด้วย OpenCV (Hough Transform)

เรียนรู้การตรวจจับเส้นตรงในรูปภาพด้วยเทคนิค 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)

Line Detection ใน Python ด้วย OpenCV (Hough Transform)

Accumulator (ตัวสะสมคะแนน)

  1. สร้าง 2D Array (Accumulator) ขนาดขึ้นกับความแม่นยำ ที่ต้องการ เช่น θ = 1° ต้องการ 180 Columns, ρ = Diagonal ของรูปภาพ
  2. สำหรับแต่ละจุดบนเส้น (Edge Point) คำนวณ (ρ, θ) ทุกค่าที่เป็นไปได้
  3. เพิ่มค่าใน Accumulator Cell ที่ตรงกับ (ρ, θ) (Voting)
  4. 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) ปกติ = 1
  • theta: ความละเอียดมุม (Radian) ปกติ = np.pi/180 (1 องศา)
  • threshold: ขั้นต่ำ Votes เพื่อถือว่าเป็นเส้นตรง
  • minLineLength: ความยาวขั้นต่ำของเส้น (Pixel)
  • maxLineGap: ช่องว่างสูงสุดระหว่าง Segment เพื่อรวมเป็นเส้นเดียว