中国知网(CNKI)验证码识别

摘要:
中国知网是最重要的中文学术资源数据库,收录绝大多数中文学术刊物。在CNKI检索结果翻页10次以上,用户需要手动输入验证码才能继续。最终,基于Eugu.CV实现验证码识别,正确率在70%以上,能保证自动化导出过程的连贯。CNKI验证码识别主要分为四个步骤:1去掉灰色干扰线2去掉干扰点3二值化4基于Tesseract识别CNKI验证码是长这个样子。vargray=newImage;varimage=gray.CopyBlank();CvInvoke.Threshold;最后,就是用Eugu.CV集成的Tesseract-OCR识别二值化图片。Tesseract是非常强大的OCR开源库,Eumu.CV集成了Tesseract4.0,可以用lstm识别模式提供识别效率。

中国知网(CNKI)是最重要的中文学术资源数据库,收录绝大多数中文学术刊物。我们可以检索论文,也可以导出检索结果前6000条论文的题录数据。

在CNKI检索结果翻页10次以上,用户需要手动输入验证码才能继续。为了实现自动化题录数据导出,我们就需要通过程序识别验证码。最终,基于Eugu.CV实现验证码识别,正确率在70%以上,能保证自动化导出过程的连贯。

CNKI验证码识别主要分为四个步骤:

1 去掉灰色干扰线

2 去掉干扰点

3 二值化

4 基于Tesseract识别

CNKI验证码是长这个样子。

中国知网(CNKI)验证码识别第1张

首先,要去掉验证码图片的灰色干扰线,如图:

中国知网(CNKI)验证码识别第2张

去掉干扰线的思路:干扰线都是灰色,而灰色的RGB三色的值相对来说都比较大,所以将RGB三色值均大于150的点的颜色设置成白色。代码如下:

            Bitmap bmp = (Bitmap)Image.FromFile(imagePath);

            for (int i = 0; i < bmp.Width; i++)
            {
                for (int j = 0; j < bmp.Height; j++)
                {
                    Color color =bmp.GetPixel(i, j);
                    int threshold = 150;
                    if (color.R > threshold && color.G > threshold && color.B >threshold)
                    {
                        Color newColor = Color.FromArgb(255, 255, 255);
                        bmp.SetPixel(i, j, newColor);
                    }
                }
            }

然后,去掉干扰点,如图:

中国知网(CNKI)验证码识别第3张

去掉干扰点的思路很简单,遍历每个点,如果它上下左右8个邻居点,有6个以上是白色的点,就把这个点也设置成白色。

for (int i = 0; i < bmp.Width; i++)
            {
                for (int j = 0; j < bmp.Height; j++)
                {
                    var colorList =GetColorList(bmp, i, j);

                    var count = colorList.Count(x => x.R == 255 && x.G == 255 && x.B == 255);

                    if (count >= 6)
                    {
                        bmp.SetPixel(i, j, Color.FromArgb(255, 255, 255));
                    }
                }
            }

图片识别前需要二值化,也就是把图片变成黑白两色,即把所有的点都变成黑色。

中国知网(CNKI)验证码识别第4张

Eugu.CV提供了二值化的方法。

           var gray = new Image<Gray, Byte>(bmp);
            var image =gray.CopyBlank();
            CvInvoke.Threshold(gray, image, 120, 255, ThresholdType.Triangle);

最后,就是用Eugu.CV集成的Tesseract-OCR识别二值化图片。

中国知网(CNKI)验证码识别第5张

Tesseract是非常强大的OCR开源库,Eumu.CV集成了Tesseract 4.0,可以用lstm识别模式提供识别效率。

            Emgu.CV.OCR.Tesseract ocr = new Emgu.CV.OCR.Tesseract(path, "eng", Emgu.CV.OCR.OcrEngineMode.LstmOnly, whitelist, true);
ocr.PageSegMode
=Emgu.CV.OCR.PageSegMode.SingleLine;
var gray
= new Image<Gray, Byte>(image);
ocr.SetImage(gray);
if (ocr.Recognize() != 0) throw new Exception("Failed to recognizer image"); var list = ocr.GetCharacters().Select(x =>x.Text); textBox.Text = string.Join("", list);

如果你对识别结果的精确度不够满意,还可以通过Tesseract自己训练提高识别精度。

免责声明:文章转载自《中国知网(CNKI)验证码识别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇大型网站技术架构,架构师领导艺术iOS -- MBProgressHUB下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

opencv4nodejs 在 mac 上的安装

一直报错 RPC, 通过以下办法解决的: brew install git //更新git版本 git config --global http.postBuffer 524288000 //增大git缓存 brew unlink tesseract // 如果没有tesseract可以忽略这个命令 然后执行npm -g install opencv4no...

图形验证码的识别

OCR 技术: (1) 在爬虫过程中,难免会遇到各种各样的验证码,而大多数验证码还是罔形验证码,这时候我们可以直接用 OCR 来识别(2) OCR ,即 Optical Character Recognition ,光学字符识别, 是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程(3) tesserocr 是 Python 的一个OCR 识别库,但...

验证码识别,发票编号识别

update:排版 这个demo的初衷不是去识别验证码,是把验证的图像处理方式用到其他方面,车票,票据等。 这里最后做了一个发票编号识别的的案例: 地址:http://v.youku.com/v_show/id_XMTI1MzUxNDY3Ng==.html 源代码:https://github.com/ccccccmd/ReCapcha demo中包含一个...

[置顶] 安卓图片OCR识别技术 tesseract研究文档20130328v1

针对安卓APP的OCR图片识别技术研究与DEMO: 通过近端时间的在网络上的学习,了解了俩个OCR的技术,包括tesseract和openCv这俩个技术 主要研究了tesseract的OCR技术,并通过模拟器做了个demo app下面与大家分享过程,希望共同进步。 Tesseract OCR引擎是1995年UNLVAccuracy大赛中的排名前三的引擎。...

【史上最强】英数验证码通杀识别

英数验证码通杀识别 重新选用当前泛化能力最强的网络进行训练,不过样本还是差点意思,种类跟打码平台还是有一定差距。希望强悍的生成样本可以弥补样本多样性的缺憾。 测试地址:http://152.136.181.66:19197/preview 训练过程 集合了上百种验证码: 外加生成样本(精选600+种字体): 欢迎大家来测一下他的泛化能力 比如0,o,i,...

黑客如何破解验证码机制

    所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息。   输入表单提交网站验证,验证成功后才能使用某项功能。不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了 验证码技术。   很多验证码实现都有问题。比如直接给出用验证码在网页和cookies中。   验...