依据矩阵的二维相关系数进行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小,可以考虑记权值树状数组,把比 ...
随机推荐
- 【Codeforces866E_CF866E】Hex Dyslexia(Structure & DP)
It's my first time to write a blog in EnglishChinglish, so it may be full of mistakes in grammar. Pr ...
- [转]我是蒟蒻,但我有我的OI信仰
我想最大的浪漫莫过于有人陪你征战OI吧 有多少无眠的夜晚?我总是在想, 到底是为了什么? 为了自招?为了省队?为了签约? 这条路很艰难,不可谓不凶险, 当你第一次踏上复试, 你肯定有看到过那些很厉害很 ...
- Objective-C——Runtime理解
动态语言 OC是一门不折不扣的动态语言,所以它的很多机制都是动态运行时决定的.这点和C语言不一样,C语言是静态绑定,也就是编译后所有的一切都已经决定了.这一点和C语言的函数指针有些类似,很多时候函数指 ...
- C#——反射动态创建类的实例
“反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 若要反射当前项目中的类(即当前项目已经引用它了),可以使用下面的写法. ...
- JS——设置cookie
cookie 用来识别用户. <html> <head> <script type="text/javascript"> function ge ...
- CSS3利用box-shadow实现相框效果
CSS3利用box-shadow实现相框效果 <style> html { overflow: hidden; background-color: #653845; background- ...
- HDU_1026_Ignatius and the Princess I_BFS(保存路径)
Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- ICMP,ARP协议
ICMP ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消息.控制 ...
- Vue ui 大法哪家强?
Element iView Vuex Mint UI Vant cube-ui,对比六大 vue ui 组件库,选中最适合的那个. Element(pc) 介绍 & 版本 饿了么前端团队开发的 ...
- Linux - 用户管理与文件权限
目录 Linux - 用户管理与文件权限 创建普通用户 切换用户 userdel删除用户 sudo 命令 文件与目录权限 Linux权限的解读 目录权限 查看用户权限的命令 文件权限 修改权限的命令 ...