2016-09-19 3 views
0

안녕하세요 지금까지이 코드를 가지고 있지만 그리드를 제거 할 수 없으므로 captcha에있는 문자 만 유지할 수 있습니다. applyfilters 함수는 묽게하고 침식합니다. 나는이 문제를 해결하는 방법에 대한 아이디어가 없다. 코멘트에서와 마찬가지로OpenCV C++ captcha에서 그리드를 제거

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

을의 숫자가 더 어둡고 그리드가 왜 글로벌 임계 값을 사용하지 않습니까? – PSchn

+0

또 다른 정교한 Approacj는 푸리에 변환으로 그리드를 제거하는 것일 수 있습니다! – PSchn

+0

thredshold를 시도 할 수있는 코드를 제공 할 수 있습니까? 그레이 스케일 이미지에 적용하고 있는데 작동하지 않습니다. –

답변

0

captcha example은 하나 개의 가능한 솔루션은 글로벌 임계 값을 사용하는 것입니다 언급 ... 나는 이미지 처리에 대한 책을 읽고 있어요하지만 여전히 나는 밖으로 아이디어입니다. 샘플 이미지의 난 (128)의 고정 된 임계 값 꽤 좋은 결과를 얻었다 :

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

당신은 또한 임계 값을 계산하는 오츠의 방법을 사용할 수 있습니다 : 당신의 예에서

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

enter image description here

+0

감사합니다. 완벽하게 작동합니다. 예를 들어 임의의 배경이나 텍스트에서 그림 등의 텍스트를 추출하는 것과 같이 혼합 된 색상 인 경우 배경을 제거 할 수있는 방법이 궁금합니다 –

+0

[여기] (http://stackoverflow.com/questions/23506105/) 읽을 수 있습니다. 추출 - 텍스트 - opencv) 예를 들면 – PSchn