OpenCV के साथ क्षैतिज रेखा का पता लगाने




image-processing hough-transform (4)

आप हौफ लाइन पहचान को छोड़ने पर विचार कर सकते हैं क्योंकि यह विधि "ग्लोबल" लाइनों की तलाश में है, जरूरी नहीं कि लाइन सेगमेंट। मैंने हाल ही में एक ऐसे अनुप्रयोग को कार्यान्वित किया जिसने "समांतरोग्राम" की पहचान की - अनिवार्य रूप से वर्गों को घुमाया जा सकता है और दृश्य कोण के कारण परिप्रेक्ष्य को पूर्व-छोटा किया जा सकता है। आप कुछ समान मान सकते हैं। मेरी पाइपलाइन थी:

  1. आरजीबी से ग्रेस्केल में कनवर्ट करें (सीवीसीवीटी रंग)
  2. चिकना (सीवीएसमुथ)
  3. थ्रेसहोल्ड (सीवी थ्रेसहोल्ड)
  4. किनारों का पता लगाएं (सीवी कैनी)
  5. समोच्च खोजें (cvFindContours)
  6. रैखिक सुविधाओं के साथ लगभग समोच्च (cvApproxPoly)

आपके आवेदन में, परिणामी समोच्च सूची बड़ी होगी (चिकनाई की "आक्रामकता" और कैनी एज डिटेक्टर की सुविधा में वृद्धि के आधार पर। आप इस सूची को विभिन्न मानकों से छीन सकते हैं: समोच्च खोजक से लौटे गए अंकों की संख्या , समोच्च का क्षेत्र (cvContourArea), आदि। मेरे अनुभव से, मैं उम्मीद करता हूं कि आपके आवेदन में "मान्य" रेखाओं में अच्छी तरह से परिभाषित क्षेत्र और कशेरुक गिनती गुण होंगे। इसके अतिरिक्त, आप अंत- अंक, अंत-बिंदुओं को जोड़ने वाली लाइन द्वारा परिभाषित कोण, इत्यादि।

आपके पास कितनी सीपीयू "समय" है, इस पर निर्भर करते हुए, आप हौग एल्गोरिदम को हमेशा एल्गोरिदम के साथ जोड़ सकते हैं जैसे ऊपर क्षैतिज और लंबवत रेखाओं को मजबूत रूप से पहचानने के लिए।

मैं एक छवि से क्षैतिज और ऊर्ध्वाधर रेखाओं को खोजने की कोशिश कर रहा हूं जो "दस्तावेज़" से आया था। दस्तावेज़ अनुबंध से पृष्ठों को स्कैन कर रहे हैं और इसलिए लाइनें आप किसी तालिका में या अनुबंध ब्लॉक में जो दिखाई देगी, उसके समान दिखती हैं।

मैं नौकरी के लिए ओपनसीवी की कोशिश कर रहा हूं। ओपनसीवी में हफ़ ट्रांसफॉर्म कार्यान्वयन नौकरी के लिए उपयोगी लग रहा था, लेकिन मुझे पैरामीटर का कोई संयोजन नहीं मिला जो इसे लंबवत और क्षैतिज रेखाओं को साफ़ करने की अनुमति देगा। मैंने किनारे का पता लगाने के बिना और बिना कोशिश की। कोई भाग्य नहीं। अगर किसी ने कुछ भी किया है तो मुझे यह जानने में दिलचस्पी है कि कैसे।

OpenCV में HoughP के साथ प्रयोग करने से पहले और बाद में मेरी एक छवि यहां देखें। यह सबसे अच्छा मैं कर सकता था, http://dl.dropbox.com/u/3787481/Untitled%201.png

तो अब मैं सोच रहा हूं कि एक और प्रकार का परिवर्तन है जिसका उपयोग मैं कर सकता हूं जो मुझे क्षैतिज और ऊर्ध्वाधर रेखाओं (और अधिमानतः धराशायी रेखाओं) को विश्वसनीय रूप से खोजने की अनुमति देगा।

मुझे पता है कि यह समस्या हल करने योग्य है क्योंकि मेरे पास Nuance और ABBYY OCR उपकरण हैं जो विश्वसनीय रूप से क्षैतिज और ऊर्ध्वाधर रेखाओं को निकाल सकते हैं और मुझे लाइनों के बाध्यकारी बॉक्स को वापस कर सकते हैं।

धन्यवाद! पैट्रिक।


यदि आप सिर्फ "लाइन" चाहते हैं और "लाइन सेगमेंट" नहीं चाहते हैं, तो यदि आप अपने कोड में अधिक गति चाहते हैं तो मैं कैनी, हफ़, फाइंडकंटोर या किसी अन्य ऐसे फ़ंक्शन का उपयोग करने से बचूंगा। यदि आपकी छवियों को घुमाया नहीं गया है और आप जो खोजना चाहते हैं वह हमेशा लंबवत या क्षैतिज होता है, तो मैं केवल सीवी :: सोबेल (लंबवत के लिए एक और क्षैतिज के लिए) का उपयोग करता हूं और कॉलम और पंक्तियों के लिए संचय सरणी बना देता हूं। फिर आप इस तरह के संचय या प्रोफाइल में अधिकतमता की खोज कर सकते हैं, उदाहरण के लिए थ्रेसहोल्ड सेट करके, और आपको पंक्ति या कॉलम पता चलेगा जिसमें लंबवत या क्षैतिज किनार रेखाएं होंगी।


आरजीबी को ग्रेस्केल में परिवर्तित न करें। कभी-कभी, आरजीबी में अलग-अलग रंगों को उसी ग्रेस्केल मान में विलय किया जा सकता है, इसलिए यह कुछ रूपों को याद कर सकता है। आपको अलग-अलग आरजीबी चैनलों का विश्लेषण अलग-अलग करना चाहिए।


क्या आपने HoughLinesP फ़ंक्शन दस्तावेज़ से कोड नमूना देखा है?

मुझे लगता है कि आप इसे अपने एल्गोरिदम के लिए शुरुआती बिंदु के रूप में उपयोग कर सकते हैं। क्षैतिज लंबवत रेखाओं को चुनने के लिए आपको लाइन कोण से अन्य लाइनों को फ़िल्टर करने की आवश्यकता है।

अद्यतन करें:

जैसा कि मैंने देखा है कि आपको लाइनों को क्षैतिज पृष्ठ पर क्षैतिज किनारों को खोजने की आवश्यकता नहीं है। इस कार्य के लिए आपको अच्छे परिणाम प्राप्त करने के लिए कई प्रसंस्करण चरणों को गठबंधन करने की आवश्यकता है।

आपकी छवि के लिए मैं HoughLinesP के साथ कैनी एज डिटेक्शन को जोड़कर अच्छे परिणाम प्राप्त करने में सक्षम हूं। यहां मेरा कोड है (मैंने अजगर का उपयोग किया है, लेकिन मुझे लगता है कि आप विचार देखते हैं):

img = cv2.imread("C:/temp/1.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 80, 120)
lines = cv2.HoughLinesP(edges, 1, math.pi/2, 2, None, 30, 1);
for line in lines[0]:
    pt1 = (line[0],line[1])
    pt2 = (line[2],line[3])
    cv2.line(img, pt1, pt2, (0,0,255), 3)
cv2.imwrite("C:/temp/2.png", img)

परिणाम इस तरह दिखता है:





straight-line-detection