हफ़ ट्रांसफॉर्म (Hough Transform) एक फीचर एक्सट्रैक्शन तकनीक है जो गणितीय रूप में प्रस्तुत सरल आकृतियों (रेखा, वृत्त) का पता लगाती है, भले ही वे टूटी या विकृत हों।
रेखा का गणितीय प्रतिनिधित्व
पैरामीट्रिक फॉर्म: ρ = x·cos(θ) + y·sin(θ)
- ρ (रो): मूल बिंदु से रेखा की लंबवत दूरी
- θ (थीटा): लंबवत रेखा और क्षैतिज अक्ष के बीच कोण (काउंटर-क्लॉकवाइज़)
एक्युमुलेटर (Accumulator)
2D ऐरे जहां पंक्तियां ρ और स्तंभ θ दर्शाते हैं। प्रत्येक एज पिक्सेल के लिए, संभावित (ρ, θ) जोड़े की गणना करके एक्युमुलेटर में वोट बढ़ाया जाता है। सर्वाधिक वोट वाली सेल रेखा दर्शाती है।
OpenCV में हफ़ लाइन ट्रांसफॉर्म
cv2.HoughLines() - स्टैंडर्ड (ρ, θ) लौटाता है
cv2.HoughLinesP() - प्रोबेबलिस्टिक (x1, y1, x2, y2) लौटाता है, तेज और व्यावहारिक
पूरा उदाहरण: पार्किंग लॉट में लाइन डिटेक्शन
import cv2
import numpy as np
# इमेज लोड
img = cv2.imread('parkingLot1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# एज डिटेक्शन (Canny)
edges = cv2.Canny(gray, 75, 150)
# प्रोबेबलिस्टिक हफ़ लाइन ट्रांसफॉर्म
# rho=1 पिक्सेल, theta=1 डिग्री, threshold=30, maxLineGap=250
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 30, maxLineGap=250)
# डिटेक्टेड लाइन्स ड्रॉ करें
if lines is not None:
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()
पैरामीटर्स समझाया
| पैरामीटर | विवरण | सामान्य मान |
|---|---|---|
rho | दूरी रिज़ॉल्यूशन (पिक्सेल्स) | 1 |
theta | कोण रिज़ॉल्यूशन (रेडियन) | np.pi/180 (1°) |
threshold | न्यूनतम वोट्स रेखा के लिए | 30-100 |
minLineLength | न्यूनतम रेखा लंबाई | 10-100 |
maxLineGap | अधिकतम गैप रेखा जोड़ने के लिए | 10-250 |
स्टैंडर्ड हफ़ लाइन्स (HoughLines)
lines = cv2.HoughLines(edges, 1, np.pi/180, 100)
if lines is not None:
for line in lines:
rho, theta = line[0]
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
# रेखा के दो बिंदु गणना करें
x1 = int(x0 + 1000 * (-b))
y1 = int(y0 + 1000 * (a))
x2 = int(x0 - 1000 * (-b))
y2 = int(y0 - 1000 * (a))
cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
सर्कल डिटेक्शन (HoughCircles)
circles = cv2.HoughCircles(
gray,
cv2.HOUGH_GRADIENT,
dp=1,
minDist=20,
param1=50,
param2=30,
minRadius=10,
maxRadius=100
)
if circles is not None:
circles = np.uint16(np.around(circles))
for circle in circles[0, :]:
cv2.circle(img, (circle[0], circle[1]), circle[2], (0, 255, 0), 2)
cv2.circle(img, (circle[0], circle[1]), 2, (0, 0, 255), 3)
ट्यूनिंग टिप्स
- Canny थ्रेशोल्ड्स एडजस्ट करें (लोअर/अपर) एज क्वालिटी के लिए
- threshold कम करें अधिक रेखाओं के लिए, बढ़ाएं कम शोर के लिए
- minLineLength बढ़ाएं छोटे सेगमेंट्स हटाने के लिए
- maxLineGap बढ़ाएं टूटी रेखाएं जोड़ने के लिए
- ROI (Region of Interest) उपयोग करें प्रोसेसिंग क्षेत्र सीमित करने के लिए
ROI उदाहरण: केवल सड़क क्षेत्र
height, width = img.shape[:2]
# ट्रैपेजॉइड मास्क (सड़क क्षेत्र)
mask = np.zeros_like(gray)
roi_vertices = np.array([[
(0, height),
(width//2 - 50, height//2 + 50),
(width//2 + 50, height//2 + 50),
(width, height)
]], dtype=np.int32)
cv2.fillPoly(mask, roi_vertices, 255)
masked_edges = cv2.bitwise_and(edges, mask)
# फिर masked_edges पर HoughLinesP लागू करें
आवश्यक इंस्टॉलेशन
pip install opencv-python numpy
निष्कर्ष: HoughLinesP अधिकांश व्यावहारिक अनुप्रयोगों के लिए बेहतर है - यह सीधे लाइन सेगमेंट्स (एंडपॉइंट्स के साथ) देता है, अनंत रेखाओं के बजाय।