2012-07-07 20 views
5

में थ्रेसहोल्ड समायोजित करना मैं टेक्स्ट पहचान पर अपना हाथ देखना चाहता था, इसलिए मैंने ढलानों, वक्र आदि को खोजने के लिए किनारों और सी ++ का पता लगाने के लिए ओपनसीवी का उपयोग किया है, किनारे एल्गोरिदम बड़े और अनियमित सेट पर अच्छी तरह से काम करता है पात्रों के लेकिन जब यह छोटे मुद्रित पाठ या टेक्स्ट के साथ आता है, तो कैप्चा में एम्बेडेड जैसे कई पृष्ठभूमि शोर के साथ यह संघर्ष होता है और अपूर्ण दिखता है, मेरा अनुमान था कि मैंने थ्रेसहोल्ड वैल्यू सही तरीके से सेट नहीं किया था और सफलता के बिना अलग-अलग मूल्यों का प्रयास किया था।कैनी एज एल्गोरिदम

enter image description here

enter image description here

यहाँ मेरी कोड है:

#include "cv.h" 
#include "highgui.h" 
using namespace cv; 
const int low_threshold = 50; 
const int high_threshold = 150; 


int main() 
{ 

    IplImage* newImg; 
    IplImage* grayImg; 
    IplImage* cannyImg; 

    newImg = cvLoadImage("ocv.bmp",1); 

    grayImg = cvCreateImage(cvSize(newImg->width, newImg->height), IPL_DEPTH_8U, 1); 

    cvCvtColor(newImg, grayImg, CV_BGR2GRAY); 
    cannyImg = cvCreateImage(cvGetSize(newImg), IPL_DEPTH_8U, 1); 

    cvCanny(grayImg, cannyImg, low_threshold, high_threshold, 3); 
    cvNamedWindow ("Source", 1); 
    cvNamedWindow ("Destination",1); 
    cvShowImage  ("Source", newImg); 
    cvShowImage  ("Destination", cannyImg); 
    cvWaitKey(0); 
    cvDestroyWindow ("Source"); 
    cvDestroyWindow ("Destination"); 
    cvReleaseImage (&newImg); 
    cvReleaseImage (&grayImg); 
    cvReleaseImage (&cannyImg); 

return 0; 

} 

मैं शुद्ध भर में देखा है और इस साइट से इस कोड में जैसे कुछ जटिल थ्रेशोल्डिंग की स्थिति को देखा है:

% Set direction to either 0, 45, -45 or 90 depending on angle. 
[x,y]=size(f1); 
for i=1:x-1, 
    for j=1:y-1, 
     if ((gradAngle(i,j)>67.5 && gradAngle(i,j)<=90) || (gradAngle(i,j)>=-90 && gradAngle(i,j)<=-67.5)) 
      gradDirection(i,j)=0; 
     elseif ((gradAngle(i,j)>22.5 && gradAngle(i,j)<=67.5)) 
      gradDirection(i,j)=45; 
     elseif ((gradAngle(i,j)>-22.5 && gradAngle(i,j)<=22.5)) 
      gradDirection(i,j)=90; 
     elseif ((gradAngle(i,j)>-67.5 && gradAngle(i,j)<=-22.5)) 
      gradDirection(i,j)=-45; 
     end 
    end 
end 

यदि यह टी नहीं है वह समाधान किसी को मुझे इस एल्गोरिदम के समतुल्य सी ++ प्रदान कर सकता है, अगर ऐसा नहीं है तो मैं और क्या कर सकता हूं?

उत्तर

5

कैनी एज डिटेक्टर हिस्ट्रेसिस थ्रेसहोल्डिंग (यह एक के बजाय दो थ्रेसहोल्ड का उपयोग करता है) का उपयोग करके एक बहु-चरण डिटेक्टर है, और एज ट्रैकिंग (आपका अंतिम स्निपेट इस चरण का हिस्सा है)। मैं पहले wikipedia प्रविष्टि पढ़ने का सुझाव देता हूं। एक संभावित समाधान उच्च दहलीज चुनना हो सकता है, उदाहरण के लिए 70% छवि पिक्सेल को किनारे के रूप में वर्गीकृत किया जाएगा (आरंभ में - आप इसे हिस्टोग्राम का उपयोग करके जल्दी से कर सकते हैं), कम थ्रेसहोल्ड को चुनने के बजाय उदा। उच्च दहलीज का 40%। पूरी छवि के बजाए छवि ब्लॉक पर किनारे का पता लगाने का प्रयास करना एक अच्छा विचार हो सकता है, इसलिए आपका एल्गोरिदम विभिन्न क्षेत्रों के लिए अलग-अलग थ्रेसहोल्ड की गणना कर सकता है।

ध्यान दें कि कैप्चा-एस को सेगमेंट के लिए कठिन बनाने के लिए डिज़ाइन किया गया है, और किनारे को तोड़ने वाले शोर को जोड़ने के लिए एक तकनीक है (आपको पहले छवि को चिकनी करने की आवश्यकता हो सकती है)।

+0

मैंने ओपनसीवी का उपयोग नहीं किया है, लेकिन आप पहले कैनी एज डिटेक्टर के सिग्मा पैरामीटर के साथ भी खेल सकते हैं। – WebMonster

+0

आपको इन मानों को ढाल परिमाण छवि के हिस्टोग्राम से गणना करना होगा, है ना? –