验证码识别部分代码(三)
来源:互联网 发布:京东怎么做淘宝客 编辑:程序博客网 时间:2024/06/05 14:51
点击(此处)折叠或打开
- int tagBITM::dajin( uint8_t pe[],int t,long *pg1)//大津法取阈值,pe为传入的保存有像素值的数组,pg1用来记录直方图分布曲线
- {
- int i, j, p;
- long pg[257];//保存每种像素的点数
- double A = 0.0, An= 0.0 ,B = 0.0, Bn= 0.0, u= 0.0, v= 0.0, qqq[256], max = 0.0, min= 0.0;
- for(i= 0; i < t - 1; i++)
- {
- pg[pe[i]]++;//计算每个像素点的个数
- }
- An = Bn = 0;
- for( i= 1; i < 256; i++)
- {
- An += pg[i];
- Bn +=(pg[i]* i);
- }
-
- for(j= 0; j < 256; j++)
- {
- A = B = 0;
- for( i= 0 ; i <= j ; i++)
- {
- A += pg[i];
- B +=(pg[i]* i);
- }
- if( A)
- u = B / A;
- else
- u = 0;
- if((An - A))
- v = ( Bn - B)/ ( An - A );
- else
- v = 0;
- qqq[j]= A * ( An -A )* ( u - v ) *( u - v ); //计算类间方差
- }
- max = min = qqq[0];
- p = 0;
- for( i= 1; i < 256; i++)//寻找判别函数最大值
- {
- if( qqq[i]> max )
- {
- max = qqq[i];
- p = i;
- }
- else if( qqq[i]< min)
- {
- min = qqq[i];
- }
- }
- cout<<"**** p"<<p<<endl;
- if( pg1!= 0)
- {
- for(i= 0 ; i < 256; i++)
- {
- pg1[i]= (long)(120*(qqq[i]- min)/(max- min));//判别函数坐标度转换
- }
- }
-
- return p; //取判别函数最大值的灰度为器阈值
- }
- 大津法所算的阈值不一定准确,所以说,算法有时也是不灵的..........
- //中值滤波求中值函数
- uint8_t medvalue(uint8_t buf[],int n, int m)
- {
- int i,j, k, f;
- for( i= 1; i < n; i++)
- {
- for(j= n-1, f= 0; j >= i; j--)
- {
- if( buf[j]> buf[j-1])
- {
- k = buf[i];
- buf[j]= buf[j-1];
- buf[j-1]= k;
- f = 1;
- }
- }
- if( f== 0 )
- break;
- }
- return (buf[m]);
- }
- //中值滤波去噪点
- int tagBITM::median( char image_name[])//传入的是图片的名字
- {
- FILE *fp;
- int i, j, flag= 9, n;
- uint8_t list1[30][72],list0[30][72];//30,70是图片的高度和宽度,70+2是因为,bmp图像每行字节数是4的倍数,不足会补零,
- uint8_t a[2], buff1[9];
- fp = fopen(image_name,"rb+");
- if( fp== NULL )
- {
- cout<<"图片打开失败!\n";
- return 1;
- }
- fseek(fp, 54, 0);
- for( i= 0; i < biheight; i++)
- {
- for(j= 0; j < biwidth; j++)
- {
- fread(&list1[i][j],1,1,fp);
- fseek(fp,2,SEEK_CUR);
- }
- if((biwidth * 3% 4) != 0)
- {
- fread(&a, 1, 2, fp);
- list1[i][j++]= a[0];
- list1[i][j]= a[1];
- }
- }
- for( i= 1; i < biheight-1; i++)
- {
- for(j= 1; j < biwidth-1;j++)
- {
- buff1[0]= list1[i-1][j];
- buff1[1]= list1[i][j];
- buff1[2]= list1[i+1][j];
- buff1[3]= list1[i][j-1];
- buff1[4]= list1[i][j+1];
- buff1[5]= list1[i-1][j-1];
- buff1[6]= list1[i-1][j+1];
- buff1[7]= list1[i+1][j-1];
- buff1[8]= list1[i+1][j+1];
-
- list0[i][j]= (uint8_t)medvalue(buff1, flag, flag/2);//函数调用
- }
- }
- for(i= 0; i < biwidth; i++)
- {
- list0[0][i]= list1[0][i];
- list0[biheight-1][i]= list1[biheight-1][i];
- }
- for(i= 0; i < biheight; i++)
- {
- list0[i][0]= list1[i][0];
- list0[i][biwidth-1]= list1[i][biwidth-1];
- list0[i][biwidth]= list1[i][biwidth];
- list0[i][biwidth+1]= list1[i][biwidth+1];
- }
-
- fseek(fp , 54, 0);
- for( i= 0; i < biheight; i++)
- {
- for( j= 0; j < biwidth; j++)
- {
- for(n= 0; n < 3; n++)
- {
- fwrite(&list0[i][j],1,1,fp);
- }
- // printf("i %d j %d %x **", i,j ,list0[i][j]);
- }
- fwrite(&list0[i][j++], 1, 1, fp);
- fwrite(&list0[i][j], 1, 1, fp);
- }
-
- fclose(fp);
- return 0;
- }
- 中值滤波算法可不是盖的。。。。。
- //二值化
- int tagBITM::binary( char image_name[],int p , uint8_t list[][weight]) //传入图片名,阈值,空的数组,用来带回二值化后的像素值
- {
- FILE *fp;
- int i, j, k= 0, n = 0;
- int num = 0;
-
- uint8_t a[2],*pext;
- fp = fopen(image_name,"rb+");
-
- if( fp== NULL )
- {
- cout<<"图片二值化失败!\n";
- return 1;
- }
- num = biwidth * biheight * 3 + 60;
- cout<<"num** = "<<num<<endl;
- pext = new uint8_t [num];//记录各像素转化后的灰度值
-
- fseek(fp, 54,0);
- for( i= 0 ; i < biheight; i++)//二值化过程
- {
- for(j= 0; j < biwidth; j++)
- {
- fread(&b,1,1,fp);//读把b像素单元
- fseek(fp, 2, SEEK_CUR);//跳过g,r像素
- for( n= 0; n < 3; n++)//循环3遍是因为灰度化后,每个像素的b,g,r相等。
- {
- if( b>= p )
- pext[k++]= 255 ;
- else
- {
- pext[k++]= 0;
- }
- }
- list[i][j]= pext[k-1];
- }
- if( biwidth* 3 % 4 != 0)
- {
- fread(&a, 1, 2, fp);
- pext[k++]= a[0];
- list[i][j++]= a[0];
- pext[k++]= a[1];
- list[i][j]= a[1];
- }
- }
- fseek( fp, 54, 0);
- for(i= 0; i < biheight; i++)
- fwrite( pext,1,k-1,fp);
- fclose(fp);
-
- delete [] pext;
- return 0;
- }
- //线条细化
- int tagBITM::hildich(char image_name[],uint8_t list0[][72])//传入图片名,二值化带出的像素矩阵
- {
- int i, k, j, m, n, flag;
- FILE *fp;
- int sum = 0, f[10];
- uint8_t list[30][70], b;
- fp = fopen(image_name,"rb+");
- if( fp== NULL)
- {
- cout<<"图片打开失败!\n";
- exit(1);
- }
- for( i= 0; i < biheight; i++)
- for( j= 0; j < biwidth; j++)
- {
- fread(&b, 1,1,fp);
- fseek(fp, 2, SEEK_CUR);
- if( b== 0 )
- {
- list[i][j]= 1;
- }
- else
- list[i][j]= 0;
- }
- i = 1;
- do
- {
- flag = 0;
- for( k= 1; k < biheight - 1; k++)
- {
- for(j= 1; j < biwidth - 1; j++)
- {
- if( list[k][j]!= 1 )
- continue;
- f[1]= list[k][j+1];
- f[2]= list[k-1][j+1];
- f[3]= list[k-1][j];
- f[4]= list[k-1][j-1];
- f[5]= list[k][j-1];
- f[6]= list[k+1][j-1];
- f[7]= list[k+1][j];
- f[8]= list[k+1][j+1];
-
- for(m= 1, n = 0; m <= 8; m++)
- {
- if( f[m]== -i ) //此点是在同一大循环中清除的
- {
- f[m]= 1; //计算中恢复原值
- n++;//记下此类点的点数
- }
- else if( f[m]< 0 )
- f[m]= 0; //此点已在前面处理中清除
- }
- sum = f[1]+ f[3]+ f[5]+ f[7]; //计算4邻点中的1的点数
- if( sum>= 4)
- continue; //4邻点全为1是不能去除
- f[9]= f[1];
- for( m= 1,sum = 0; m <= 8; m++)
- if( f[m]== 1)
- sum++;
- if((sum <= 1)|| (sum-n == 0))
- continue; //是孤立点,不能去除
- sum = cross( f);
- if( sum!= 1)
- continue;
- if( list[k-1][j]== -i)
- {
- f[3]= 0;
- sum = cross(f);
- if( sum!= 1)
- continue;
- }
- if( list[k][j-1]== -i)
- {
- f[5]= 0;
- sum = cross(f);
- if( sum!= 1)
- continue;
- }
- list0[j][k]= 255;
- list[k][j]= -i;
- flag = 1;
- }
- }
- i++;
- }while( flag== 1);
- fseek(fp, 54, 0);
- for(i= 0; i < biheight; i++)
- {
- for( j= 0; j < biwidth; j++)
- {
- for(n= 0; n < 3; n++)
- {
- fwrite(&list0[i][j],1,1,fp);
- }
- }
- fwrite(&list0[i][j++], 1, 1, fp);
- fwrite(&list0[i][j], 1, 1, fp);
- }
-
- fclose(fp);
- return 0;
- }
0
上一篇:验证码识别过程
下一篇:java用RandomAccessFile实现多线程下载
相关热门文章
- 修改hostname后,db2 无法启动...
- linux_3.0.1分析1--模块加载...
- kthreadd 分析
- 扩展easyui 的表单验证
- 自动创建WordPress管理员账号...
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- sql relay的c++接口
- 那一台服务器也没5T的存储空间...
- 公司有5T的数据用于下载,数据...
- CACTI监控ESXI中的虚拟机,监...
- 如何挂载一块以前做过LVM的硬...
- 做主主同步,只同步个别的几张...
评论热议
- 验证码识别部分代码(三)
- 验证码识别代码(Java)
- 自动投票系统【三】验证码识别
- 三种验证码的识别途径
- 简单的图形验证码识别代码
- 一个验证码识别的代码
- 一个验证码识别的代码
- CSDN图片验证码的识别代码
- 验证码识别思路及C#代码
- C#验证码识别代码分享
- VB的验证码识别与自动充值部分
- 验证码部分的java代码
- 图片验证码部分代码整理
- 身份证 验证、识别~后台代码
- 某网站验证码的识别笔记【三】
- 机器视觉学习系列三:验证码识别
- tensorflow(三):cnn验证码识别,开启tensorflow
- 史上最简单的图形验证码识别代码
- ZStack OSAL的事件(event)与消息(message)——part 2
- JSP页面中调用window.onload对IE8与IE10不同
- 验证码识别(一)
- Unity3d 截屏之后转换成Texture2d
- 验证码识别过程(二)
- 验证码识别部分代码(三)
- java用RandomAccessFile实现多线程下载
- How to install an SSH Server in Windows Server 2008
- java 中RandomAccessFile的使用
- Linux添加可执行文件/头文件/链接库的环境变量
- eclipse 快捷键
- java 中读取文件最后一行信息
- c 语言的一些知识
- html中meta标签的使用