zoukankan      html  css  js  c++  java
  • 依据矩阵的二维相关系数进行OCR识别

    我想通过简单的模板匹配来进行图像识别。

    把预处理好的字符图片,分别与A到Z的样本图片进行模板匹配。

    结果最大的表明相关性最大,就能够识别字符图片了。

    在实际应用中。我用了openCV的matchTemplate()函数,可是未达到我想要点的效果。

    matchTemplate()的功能是在图像中搜索出指定的模板,假设模板是从待搜索的图像中截取出来的,会有非常好的效果。可是假设模板不是待搜素图像的一部分,似乎达不到我想要的效果。

    在尝试了matlab的corr2()后。发现corr2能非常好的解决我的问题。



    double Card::corr2(Mat matA, Mat matB){
    	//计算两个同样大小矩阵的二维相关系数
    	double corr2 = 0;
    
    	double Amean2 = 0; 
    	double Bmean2 = 0;
    	for (int m = 0; m < matA.rows; m++) {  
    		uchar* dataA = matA.ptr<uchar>(m);  
    		uchar* dataB = matB.ptr<uchar>(m); 
    		for (int n = 0; n < matA.cols;n++) {  			
    			Amean2 = Amean2 + dataA[n];  
    			Bmean2 = Bmean2 + dataB[n];
    		}                    
    	}
    	Amean2 = Amean2 / (matA.rows * matA.cols);
    	Bmean2 = Bmean2 / (matB.rows * matB.cols);
    
    	double Cov = 0;
    	double Astd = 0;
    	double Bstd = 0;
    	for (int m = 0; m < matA.rows; m++) {  
    		uchar* dataA = matA.ptr<uchar>(m);  
    		uchar* dataB = matB.ptr<uchar>(m); 
    		for (int n = 0; n < matA.cols;n++) { 
    			//协方差
    			Cov = Cov + (dataA[n] - Amean2) * (dataB[n] - Bmean2);
    			//A的方差
    			Astd = Astd + (dataA[n] - Amean2) * (dataA[n] - Amean2);
    			//B的方差
    			Bstd = Bstd + (dataB[n] - Bmean2) * (dataB[n] - Bmean2);
    		}                    
    	}
    	corr2 = Cov / (sqrt(Astd * Bstd));
    
    	return corr2;
    }

    //待搜索图像
    Mat srcImage = imread("M:/图像处理实验/验证码/byx001.bmp",1);
    Mat resizeMat = Mat::zeros(25, 25, CV_8UC3);
    //缩放为25*25的矩阵。由于要相关匹配的模板大小为25*25
    resize(srcImage,resizeMat,resizeMat.size());
    
    //相关匹配	
    double ccorrVal[26] = {0};
    
    double max = 0;
    int count = 0;
    for (int m = 0; m < 26; m++){
    	char recogPath[100] = {1};
    	strcpy(recogPath,"M://图像处理实验//验证码//大写字母//");
    	char num[2] = {1};
    	num[0] = 65 + m;
    	strcat(recogPath, num);
    	strcat(recogPath,".bmp");
    
    	Mat img_display;
    	resizeMat.copyTo( img_display );
    	Mat std = imread(recogPath,0);
    
    	Mat resizeMatSTD = Mat::zeros(25, 25, CV_8UC3);
    	resize(std,resizeMatSTD,resizeMatSTD.size());
    
    	adaptiveThreshold(resizeMatSTD ,resizeMatSTD ,255 ,ADAPTIVE_THRESH_MEAN_C ,THRESH_BINARY,5,1);
    				
    	corr2Val[m] = corr2(resizeMatSTD,img_display);
    				
    	if (max <= corr2Val[m]){
    		max = corr2Val[m];
    		count = m;
    	}	
    }
    char pathname[100]={1};
    strcpy(pathname,"M://图像处理实验//验证码//test//字符_");
    char num[10];
    _itoa(i, num, 10);
    strcat(pathname, num);
    
    
    char C[2] = {1};
    C[0] = 65 + count;
    strcat(pathname, C);
    strcat(pathname,".bmp");
    imwrite(pathname, resizeMat);

    字符模板:


    识别结果输出:



  • 相关阅读:
    Hibernate sqlserver 的对象转成 Hibernate mysql 的对象时 需注意
    将绿色版Tomcat服务添加到系统服务并设为开机运行
    进程上下文和中断上下文
    关于上、下拉电阻的总结整理
    I2C设备驱动流程
    MTK6573的LDO控制
    iomem—I/O映射方式的I/O端口和内存映射方式的I/O端口
    Linux I2C子系统分析I2C总线驱动
    Camera读取ID方法总结
    Linux 信号signal处理机制
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7264073.html
Copyright © 2011-2022 走看看