इस पोस्ट में, हम हफ़ ट्रांसफ़ॉर्म नामक तकनीक की सहायता से छवि में रेखाओं का पता लगाने का तरीका जानेंगे।
हफ़ ट्रांसफ़ॉर्म?
यदि आप गणितीय रूप में उस आकृति का प्रतिनिधित्व कर सकते हैं, तो किसी भी साधारण आकार का पता लगाने के लिए हफ़ ट्रांसफ़ॉर्म एक सुविधा निष्कर्षण विधि है। यह किसी भी तरह आकार का पता लगाने में कामयाब होता है, भले ही वह थोड़ा सा टूटा या विकृत हो। हम देखेंगे कि यह एक लाइन के लिए कैसे काम करता है।
एक "सरल" आकार वह है जिसे केवल कुछ मापदंडों द्वारा दर्शाया जा सकता है। उदाहरण के लिए, एक रेखा को केवल दो मापदंडों (ढलान, अवरोधन) द्वारा दर्शाया जा सकता है और एक वृत्त के तीन पैरामीटर होते हैं - केंद्र के निर्देशांक और त्रिज्या (x,y, r)।
हफ़ ट्रांसफ़ॉर्म का इस्तेमाल करके इमेज से लाइनों का पता लगाएं
एक रेखा को एक समीकरण द्वारा दर्शाया जा सकता है- या पैरामीट्रिक रूप में इसे इस रूप में दर्शाया जा सकता है, जहां (ρ) मूल से रेखा तक की लंबवत दूरी है, और ϴ इस लंबवत रेखा द्वारा निर्मित कोण है और काउंटर में मापा गया क्षैतिज अक्ष है। -क्लॉकवाइज (यह प्रतिनिधित्व OpenCV में उपयोग किया जाता है)। नीचे दी गई छवि देखें
अतः यदि रेखा मूल बिन्दु के नीचे से गुजर रही है, तो उसका एक धनात्मक rho और कोण 180 से कम होगा। यदि वह मूल से ऊपर जा रहा है, तो 180 से अधिक कोण लेने के बजाय, कोण 180 से कम लिया जाता है, और rho ऋणात्मक लिया जाता है। किसी भी खड़ी रेखा में 0 डिग्री और क्षैतिज रेखाओं में 90 डिग्री होगी।
संचयक
इन दो पदों (ρ,ϴ) में किसी भी रेखा का प्रतिनिधित्व किया जा सकता है। तो पहले यह एक 2D सरणी या संचायक (दो मापदंडों के मान रखने के लिए) बनाता है और इसे प्रारंभ में 0 पर सेट किया जाता है। जहाँ पंक्तियाँ को दर्शाती हैं और स्तंभ को दर्शाते हैं। सरणी का आकार उस सटीकता पर निर्भर करता है जिसकी हमें आवश्यकता होती है, उदाहरण के लिए, यदि हमें कोणों की सटीकता 1 डिग्री होने की आवश्यकता है, तो आपको 180 कॉलम और ρ की आवश्यकता है, अधिकतम संभव दूरी छवि की विकर्ण लंबाई है और ρ अधिकतम संभव दूरी है छवि की विकर्ण लंबाई है। इसलिए एक पिक्सेल सटीकता और पंक्तियों की संख्या लेना छवि की विकर्ण लंबाई हो सकती है।
विचार करें कि हमारे पास बीच में एक क्षैतिज रेखा के साथ 100*100 की छवि है। रेखा का पहला बिंदु लें, और हम इसके (x, y) मान जानते हैं। अब समीकरण में, =0,1,2,3…180 के मानों को दर्ज करें और प्राप्त होने वाले मान की जांच करें। प्रत्येक (ρ,ϴ) जोड़ी के लिए, एक द्वारा वृद्धि मूल्य इसके संबंधित (ρ,ϴ) कोशिकाओं में हमारा संचायक है। तो अब संचायक में, सेल (50,90) =1 कुछ अन्य कोशिकाओं के साथ। अब लाइन पर दूसरा स्थान लें। उसी प्रक्रिया को दोहराएं जैसा हमने पहले स्थान के लिए किया था। आपको प्राप्त होने वाले (ρ,ϴ) के अनुरूप कक्षों में मान बढ़ाएँ। इस बार, सेल (50,90)=2। तो हम वास्तव में (ρ,ϴ) मूल्यों को वोट कर रहे हैं। हम इस प्रक्रिया को लाइन पर हर बिंदु के लिए जारी रखते हैं। प्रत्येक स्थान पर, सेल (50,90) को बढ़ाया जाएगा या वोट दिया जाएगा, जबकि अन्य सेल को वोट नहीं दिया जा सकता है। इस तरह, अंत में, सेल (50,90) के पास अधिकतम वोट होंगे। इसलिए यदि आप अधिकतम वोटों के लिए संचायक की खोज करते हैं, तो आपको मान (50,90) मिलता है, जो कहता है, इस छवि में मूल से 50 की दूरी पर और 90 डिग्री के कोण पर एक रेखा है। लाइनों के लिए हॉफ ट्रांसफॉर्म इस तरह काम करता है।
OpenCV में हफ़ ट्रांसफ़ॉर्म
ऊपर बताया गया सब कुछ OpenCV फ़ंक्शन, cv2.HoughLines() में समझाया गया है। यह केवल (ρ,ϴ) मानों की एक सरणी देता है जहां ρ को पिक्सेल में मापा जाता है और ϴ को रेडियन में मापा जाता है।
नीचे ओपनसीवी और हफ लाइन ट्रांसफॉर्म का उपयोग करके लाइन डिटेक्शन का एक प्रोग्राम है।
नीचे एक पार्किंग स्थल की वास्तविक छवि है, और हम हफ़ लाइन ट्रांसफ़ॉर्म और ओपनसीवी लाइब्रेरी का उपयोग करके इस छवि पर लाइन डिटेक्शन करने जा रहे हैं।
उदाहरण
import cv2 import numpy as np img = cv2.imread("parkingLot1.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, 75, 150) lines = cv2.HoughLinesP(edges, 1, np.pi/180, 30, maxLineGap=250) for line in lines: x1, y1, x2, y2 = line[0] cv2.line(img, (x1, y1), (x2, y2), (0, 0, 128), 1) cv2.imshow("linesEdges", edges) cv2.imshow("linesDetected", img) cv2.waitKey(0) cv2.destroyAllWindows()
परिणाम
और लाइनों का पता चला-