依据矩阵的二维相关系数进行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);
字符模板:
识别结果输出:
依据矩阵的二维相关系数进行OCR识别的更多相关文章
- 牛客练习赛1 矩阵 字符串二维hash+二分
题目 https://ac.nowcoder.com/acm/contest/2?&headNav=www#question 解析 我们对矩阵进行二维hash,所以每个子矩阵都有一个额hash ...
- 【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都依照从左到右的递增的顺序排序,输入这种一个数组和一个数,推断数组中是否包括这个数
// 二维数组中的查找,杨氏矩阵在一个二维数组中.每行都依照从左到右的递增的顺序排序. // 每列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个数组和一个数.推断数组中是否包括这个数 #i ...
- Atitit zxing二维码qr码识别解析
Atitit zxing二维码qr码识别解析 1.1. qr码识别解析 by zxing1 1.2. 解码lib:qrcode.jar 2 1.3. atitit.二维码生成总结java zxing ...
- Python 实现二维码生成和识别
今天突然想给自己自己做个头像,然后还是二维码的形式,这样只要扫一扫就可以访问我的主页.然后就开始自己的苦逼之路... 其实实现二维码java,c#,C++等都可以实现:由于自己正在学python,所以 ...
- 计蒜客模拟赛D1T1 蒜头君打地鼠:矩阵旋转+二维前缀和
题目链接:https://nanti.jisuanke.com/t/16445 题意: 给你一个n*n大小的01矩阵,和一个k*k大小的锤子,锤子只能斜着砸,问只砸一次最多能砸到多少个1. 题解: 将 ...
- BZOJ.2462.[BeiJing2011]矩阵模板(二维Hash)
题目链接 序列上的Hash和前缀和差不多,二维Hash也和二维前缀和差不多了. 预处理大矩阵所有r*c的小矩阵hash值,再对询问的矩阵Hash. 类比于序列上\(s[r]-s[l-1]*pow[r- ...
- BZOJ2462[Beijing2011]矩阵模板(二维Hash)
二维矩阵匹配问题,至今不知道Q的范围是多少,反正是要求做到读入复杂度. 二维Hash:就是一维的等效拓展,注意两维的Base不能相同. 其余就是一维Hash和二维前缀和的结合,可以自然溢出,据说概率很 ...
- Book of Shaders 02 - 矩阵:二维仿射变换练习
0x00 一些废话 如果要深入学习 CG (Computer Graphics,计算机图形学),必然要学习相关的数学知识.CG 涉及到多个不同的领域,根据所研究领域的不同,也会涉及到不同的数学分支.但 ...
- 洛谷1527(bzoj2738)矩阵乘法——二维树状数组+整体二分
题目:https://www.luogu.org/problemnew/show/P1527 不难想到(?)可以用二维树状数组.但维护什么?怎么查询是难点. 因为求第k小,可以考虑记权值树状数组,把比 ...
随机推荐
- 题解报告:hdu 1863 畅通工程
Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可 ...
- android sqlite中判断某个表是否存在
<span style="font-size:18px;">sqlite 中判断某个表是否存在的方法,贴出来供大家参考 /** * 判断某张表是否存在 * @param ...
- 【百度之星】-IP聚合
问题描述: Problem Description 当今世界,网络已经无处不在了,小度熊由于犯了错误,当上了度度公司的网络管理员,他手上有大量的 IP列表,小度熊想知道在某个固定的子网掩码下,有多少个 ...
- 【转】Java 集合系列01之 总体框架
Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等.Java集合工具包位置是java.util.*Java集合主要可以划分为4个部分:List列表.Set集合 ...
- HTML 表单 存为EXCEL文件时 中文显示乱码
在做宣传品发放系统时,需求要把数据库查询的记录生成表单并转存excel文件. 在转存的EXCEL文件中文显示乱码,表格和其他字符正常,检查后发现是创建EXCEL文件打开模式不对 之前: myfile ...
- JS——样式获取的兼容写法
样式获取 普通获取属性方式div.style.width或者div.style["width"]无法获取内嵌和外链式,只能获取行内式 window.getComputedStyle ...
- javascript常用功能函数
特殊字符转义:将<, >, &, “进行转义 function escape(str){ return str.replace(/[<>"&]/g,f ...
- JS监听事件错误:Uncaught TypeError: xx(函数名)is not a function at HTMLInputElement.onclick
事件监听一直出错,提示已定义的函数名不是一个函数,折腾了好久才想到,原来是函数名和JS内部关键字重名造成的. 以前也遇到过这种情况,但因为发生的概率比较小,就没太在意,但是这次感觉这方面确实需要注意, ...
- 使用码云gitee.com托管代码
1.新建项目 可以看到团队资源管理器是这样的,已经在本地有存储库,所有更改可以保存本地 2.在码云上新建项目 项目名称必填,其它项根据情况填写 3.复制项目地址关联到本地存储库 填写码云的项目地址,发 ...
- Java 之jdbc连接mysql数据库
package jdbc; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; ...