人工神経ネットワークに基づくデジタル文字認識システムdemo(一):文字ノイズ除去、分割


最近ニューラルネットワークを利用してデジタル文字認識を試みていますが、一応やってみました.全体が粗末で、まずテスト画像を前処理し、それから再サンプリングによって特徴を抽出し、最後にニューラルネットワークを通じて訓練と識別を行う.興味がある人はここをクリックして理解して、どうぞよろしくお願いします.
ここでは、複数の文字を含む画像をノイズ除去処理して単一の文字に分割する方法について概説します.opencvでANNをどのように使用するかについては、OpencvでのANNニューラルネットワークの使用例を参照してください.
元の図:効果図:
処理手順について説明します.
1.画像を読み込む階調化2.二値化して反転処理を行う.外郭4を抽出する.輪郭の大きさに応じてノイズ5を除去する.輪郭を再検索し、輪郭に基づいてboundingRect 6を見つける.boundingRectをそれぞれ画像として保存すればよい.
はい、これでほぼ終わります.直接ソース:
//--------------------------------------【    】-------------------------------------------
//          :  ANN         
//          :
//                : Windows 7 64bit
//            IDE  :Visual Studio 2010
//            OpenCV  : 2.4.8
//------------------------------------------------------------------------------------------------

#include   //   
using namespace cv;  //  cv    
//#include 
//using namespace std;  


void main( )
{    
    //      
    Mat srcImage = imread("scanDigit.bmp");
    imshow("【   】",srcImage);//       
    //   
    Mat grayImage;
    cvtColor(srcImage, grayImage, CV_RGB2GRAY);//RGB      
    imshow("【   】",grayImage);
//  imwrite("grayImage.jpg",grayImage);//    
    //   
    Mat biImage;
    threshold(grayImage, biImage, 200, 255, CV_THRESH_BINARY_INV ); //           ,       findContours()        
    imshow("【    】",biImage);
//  imwrite("biImage.jpg",biImage);
/*
    //      
    ofstream outImage("imagedata.txt", ios::out | ios::binary);    
    for( unsigned int nrow = 0; nrow < srcImage.rows; nrow++)  
    {  
        for(unsigned int ncol = 0; ncol < srcImage.cols; ncol++)  
        {  
            uchar val = srcImage.at(nrow,ncol);    
            outImage << (int(val) > 200 ? 1 :0) ; //File3<
    //    
    Mat contourImage(biImage.rows, biImage.cols, CV_8UC1, Scalar(0, 0, 0)); 
    Mat noiseRemoveImage = biImage.clone(); 
    vector<vector > contours;
    vector hierarchy;
    findContours( biImage, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE );
    for(int i = 0; i< contours.size(); i++ )
    {
        Scalar color( 255, 255, 255 );
        drawContours( contourImage, contours, i, color, 1, 8, hierarchy, 1);//    
//      printf("  [%d]   : %.2f
", i, contourArea(contours[i]));
if (contourArea(contours[i]) < 20) // 20 { drawContours( noiseRemoveImage, contours, i, Scalar(0, 0, 0), -1, 8, hierarchy, 0); } } imshow( " ", contourImage ); imshow( " ", noiseRemoveImage ); /* // Mat dstImage; bitwise_not(srcImage, dstImage); imshow( " ", dstImage ); */ /* // Mat rotMat(2, 3, CV_32FC1); Mat rotateImage(noiseRemoveImage.rows, noiseRemoveImage.cols, noiseRemoveImage.type(), Scalar(0, 0, 0)); Point center = Point(noiseRemoveImage.cols/2, noiseRemoveImage.rows/2); double angle = 2.1;// // double angle = slopeImage(noiseImage); double scale = 1; rotMat = getRotationMatrix2D(center, angle, scale); warpAffine(noiseRemoveImage, rotateImage, rotMat, rotateImage.size(),INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0)); imshow( " ", rotateImage ); */ /* // Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));// Mat dilateImage = srcImage.clone(); morphologyEx(srcImage, dilateImage, MORPH_DILATE, element); imshow( " ", dilateImage); */ // Mat SegmentationImage = noiseRemoveImage.clone(); vector<vector > segcontours; vector seghierarchy; findContours( noiseRemoveImage, segcontours, seghierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); Mat characterImage; Mat dstImage; char name[50]; for (int i = 0; i < segcontours.size(); i++) { Rect rect = boundingRect(Mat(segcontours[i])); // rectangle(SegmentationImage, rect.tl(), rect.br(), Scalar(255, 0, 0)); // // Mat roi = SegmentationImage(rect); resize(roi,characterImage,Size(32, 64 ),(0,0),(0,0),INTER_NEAREST); // bitwise_not(characterImage, dstImage); sprintf(name, "TestData\\%d.jpg", i); imwrite(name,dstImage); } imshow( " ", SegmentationImage); // waitKey(0); }

プロジェクト全体を知りたい場合は、ようこそhttps://github.com/NodYoung/ANNDigitRec.