用 Python 处理这种验证码有没好的点子?

2018-11-18 18:29:14 +08:00
 snoopy1024

验证码

验证码字符只有 英文加数字; 我的思路:转为灰度,二值化处理,除去干扰横线(正在做),然后用 pytesseract 识别。干扰线除去有点儿复杂 正在做还不知道识别率有多大...

干掉干扰线 你们有没有啥头绪? 干扰线纵向都是 3 个像素,我目前的想法就是:纵向检测 3 像素的黑线

这是简单处理后的 还没有解决干扰线

7144 次点击
所在节点    Python
31 条回复
snoopy1024
2018-11-19 10:29:19 +08:00
@SeaRecluse 老哥 求个链接
sigmaxp
2018-11-19 10:31:13 +08:00
把高为 3 个像素的黑点都去掉,然后正常的字母中间会有白色的空白线,然后在把上线都有黑色像素点且空白宽度为 3 的空白像素点置为黑色,这样字母部分就补齐了。不知道行不行
crawl3r
2018-11-19 10:51:34 +08:00
pytesseract 不能识别这种会变形的文字,所以还是上 cnn 吧
Marsss
2018-11-19 12:40:40 +08:00
好的点子就是悬赏。。。出个 500、800 的,问题就解决了。。。
Destiny97
2018-11-19 12:48:51 +08:00
腐蚀再膨胀说不定能去掉
loryyang
2018-11-19 12:57:04 +08:00
有个问题,你能写出生成这种验证码的代码吗?可以的话,就可以用 CNN 开心的训练了
数据量足够的话,这种的 case 肯定能解决的
loryyang
2018-11-19 12:59:05 +08:00
kuangwinnie
2018-11-20 09:29:41 +08:00
@snoopy1024 那我就爱莫能助了
Marsss
2018-11-21 13:00:14 +08:00
你或许需要一些 hacker 思维,寻找干扰线与正常字符之间的差别规律,然后针对这个规律写处理代码。其实还挺有意思的,这是测试效果:





只要能做到有效分割,也就基本意味着破解成功了,分割之后大概只需要标注 100 张左右,这点体力活比起直接用 CNN 撸(需要标注上万张)还是很容易接受的,后面再随便在 sklearn 里挑一个算法来训练就行了。
Marsss
2018-11-21 13:04:22 +08:00
对了,对于你这种验证码,如上图连在一起的,直接从中间分开就行了,不会差很多,对于单个字符,只要你人能认出来,多层感知器训练后认出来没问题。大不了就跳过,从新刷新一张。识别成功率能到 50%就能用了。
ChangHaoWei
2018-12-06 14:40:42 +08:00
@Marsss 思路很棒,谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/509000

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX