2016-09-19 1 views
0

Hallo Ich habe diesen Code bis jetzt, aber kann das Raster nicht entfernen, so dass ich nur die Zeichen auf dem Captcha behalten kann. Die Funktion ApplyFilters verdünnt und erodiert. Ich habe keine Ideen, wie ich dieses Problem lösen kann. Ich Bücher über die Bildverarbeitung zu lesen, aber immer noch ich bin aus Ideen ... captcha exampleOpenCV C++ Gitter aus Captcha entfernen

cv::Mat imgTrainingNumbers;   // imazhi hyrje 
cv::Mat imgGrayscale;    // 
cv::Mat imgBlurred;     // transformime te imazhit 
cv::Mat imgThresh;     // 
cv::Mat imgThreshCopy;    // 

std::vector<std::vector<cv::Point> > ptContours;  // vektori me konturet 
std::vector<cv::Vec4i> v4iHierarchy;     // hierarkia e kontureve 

cv::Mat matClassificationInts;  // trajnimi i klasifikimeve, duhen bere disa konvertime para se te shkruajme ne skedar 

//imazhet e trajnimit, deklarohet si imazh tek dhe me pas shtojme tek ky imazh si te ishte nje vektor. Ne fund duhen ber konvertime para se te shkruhet ne skedar 
cv::Mat matTrainingImagesAsFlattenedFloats; 

//per te treguar konceptin, po lexoj dhe parashikoj vetem numrat me shkrim dore. Njesoj veprohet edhe per shkronjat 
std::vector<int> intValidChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; 

imgTrainingNumbers = cv::imread("data/19-09-16_091821.png");   // lexoj imazhin me bashkesine e trajnimit 

if (imgTrainingNumbers.empty()) {        
    std::cout << "error: Imazhi i trajnimit nuk u lexua\n\n";   
    return(0);             
} 


cv::cvtColor(imgTrainingNumbers, imgGrayscale, CV_BGR2GRAY);  // kthe ne greyscale 
cv::imshow("greyscale", imgGrayscale); 

//cv::Mat canny_output; 
// Detect edges using canny 
//cv::Canny(imgGrayscale, canny_output, 100, 100 * 2, 3); 
//cv::imshow("canny output", canny_output); 

cv::GaussianBlur(imgGrayscale,   // imazh hyrje 
    imgBlurred,        // imazh dajle 
    cv::Size(5, 5),       // zbut gjeresine dhe gjatesine e dritares ne pixel 
    0);          // vlera sigma tregon se sa blur do i vendoset imazhit, 0 e lejon algoritmin zgjedh menyr automatike vleren 

// nga grayscale kthejme ne bardhezi (binarizimi i imazhit) 
cv::adaptiveThreshold(imgBlurred,   // imazh hyrje 
    imgThresh,        // imazh dalje 
    255,         // pixelat qe kalojne limitin i bejme te bardhe te plota (255 rgb) 
    cv::ADAPTIVE_THRESH_GAUSSIAN_C,   // shperndarje gaussiane 
    cv::THRESH_BINARY_INV,     // backgroundi i zi, foregroundi i bardhe 
    11,          // vlera e pixelit fqinj e perdorur te llogaritet vlera thredsholdid 
    2);          // konstante e zbritur nga mesatarja e peshuar 

cv::imshow("Binarizimi i imazhit", imgThresh);   // shfaq imazhin e binarizuar per reference 

Mat afterFilter; 
afterFilter = applyFilters(imgThresh); 
cv::imshow("After Filters", afterFilter); 
//imgThresh = applyFilters(imgThresh); 
//cv::imshow("After Filters", imgThresh); 
+0

In Ihrem Beispiel der Zahlen sind dunkler als das Gitter, warum nicht einen globalen Schwellenwert verwenden? – PSchn

+0

Eine weitere ausgeklügelte Methode könnte sein, das Gitter mit Fourier-Transformation zu entfernen! – PSchn

+0

Kannst du mir den Code für drdshold geben? Ich bewerbe mich auf Graustufen Bild und es funktioniert nicht –

Antwort

0

Wie in den Kommentaren erwähnt eine mögliche Lösung ist es, eine globale Schwelle zu verwenden. Für Ihre Beispielbild bekam ich recht gute Ergebnisse mit einer festen Schwelle von 128:

threshold(imgBlurred,imgThresh,128,255, CV_THRESH_BINARY_INV) 

Sie können auch Otsu-Methode verwenden, um die Schwelle zu berechnen:

threshold(imgBlurred,imgThresh,0,255, CV_THRESH_BINARY_INV+CV_THRESH_OTSU) 

enter image description here

+0

Danke. Funktioniert perfekt. Ich frage mich, wie kann ich den Hintergrund entfernen, wenn es in gemischten Farben zum Beispiel zum Extrahieren von Text aus einem zufälligen Hintergrund oder Text aus einem Bild etc. –

+0

Sie könnten lesen [hier] (http://stackoverflow.com/questions/23506105/ extracting-text-opencv) zum Beispiel – PSchn