# 顶象面积验证码识别思路
-------
注意,此方案非DNN方案。
且思路只保证在方案编写完成时(2020.11.21)仍有效,验证码这个东西更新会比较频繁,不保证在后续的时间中是否会失效。
且不保证后续更新。
----------
写在最前面:
> 本文只会讲思路,不会放代码,不会放代码,不会放代码,重要的事情说三遍。
>
> 因为这个事情还是比较敏感的,顶象在验证码方向做的也算是比较大的了,国内很多公司在用的验证码都是顶象的,代码就不放了,避免被人拿去做坏事了。
>
> 另外,也是为顶象的验证码做个简单的测试。如果有顶象的大佬看到,可以考虑把这个验证码更新一下啦~
>
> 纯一时手痒,仅为技术交流,请勿用于任何商业活动,也请勿对顶象的验证码进行攻击,感谢~
>
> 请不要进行任何违法行为,否则后果自负!
以下正文。
前两天有位大佬丢过来一张验证码图片,问我该如何处理。验证码它长这样,要求是点击图片中被分割出来的最大的区域:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127203723341.png)
哟吼,这验证码,有点东西啊~
但是大佬问的问题,说什么也得给搞定嘛~
于是,我思索了一下,一个想法慢慢成形,我觉得可以把任务拆解成几个小问题:
- 1.检测出图片中被标记出来的点
- 2.将检测出来的点连成一条线
- 3.根据线将图像切割成几个不连通的区域
- 4.计算各个区域的面积,获取面积最大的区域的一个点的坐标,即为结果
略微推敲了几遍,觉得想法可行,于是,开搞~
转载请注明来源:[https://blog.csdn.net/aaronjny/article/details/110245896](https://blog.csdn.net/aaronjny/article/details/110245896)
## 一、检测出图片中被标记出来的点
先来解决第一个问题,怎么检测出图片中被标记出来的点。
我最直接的想法是使用目标检测算法,因为这些点还是挺明显的,目标检测模型(比如yolo)应该是可以奏效的。但是一张图片上的点比较多,标注数据集感觉很麻烦,虽然觉得可行,但真心不想费那么大功夫。
又看到标记点的颜色和正常图片的颜色还是有一定差别的,于是,我决定先尝试直接在图片的像素和色值上下些功夫。
### 1、BGR图像上的、基于离群值筛选的检测方法
考虑到标记点和正常图片的颜色上的差别,可以初步判断一个标记点和周围的其他像素点在色值上是有一定偏离的,我们可以考虑把色值与相邻局部区域整体色值有一定大小偏离的点,认为是标记点。
emmm,话比较绕是吧?感觉不太好理解?那我来举个例子:
> 有一只哈士奇混在了一群狼里面,虽然都是犬科,但是长得还是不太一样的,我们需要把二哈揪出来~
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127203808359.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Fhcm9uam55,size_16,color_FFFFFF,t_70)
我们以前面的示例图片为例,解释一下这个问题,请看:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127203828877.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Fhcm9uam55,size_16,color_FFFFFF,t_70)
以蓝色框圈起来的绿色点群(实际上是很多绿色点聚在一起了,不只是一个点)为例,在蓝色框选中的图片区域里可以看到,虽然已经有不少绿色点了,但这个点的数量占蓝色框里的全部点的比例还是偏少的,更多的是正常的点。
假如说把蓝色框扩大,变成红色框,会发现,虽然绿色点数量增加了,但正常点的数量增加的更多,绿色点的比例进一步降低了。
那么,相对于正常点来说,标记点的色值就是离群值了(偏离了周围正常点的色值范围)。那么,我们就可以先设定一个框框,然后滑动这个窗口,遍历整张图片,计算窗口在每个位置检测出离群值的点,这些点就可以作为标记点。
那么,具体该怎么做呢?
其实检测离群点的算法有很多,我这里介绍一种,绝对中位差法。
①对于一个h*w的矩阵M,先统计其中位数,即为`median`。
②对于矩阵M中的每一个值,都是用它减去 `median`,并取绝对值,获得新的矩阵N。
③对N求中位数,即中位差,我们记为`mad`。
④我们认为在区间 `[median-x*mad,median+x*mad]` 内的点属于正常点,超出则为离群点,x看情况设置,我们这里取3。
如果使用 `numpy` 来描述这个过程的话,如果要检测点(row,col)是否为离群值,可以表示如下:
```python
median = np.median(M)
mad = np.median(np.abs(M - median))
lower_limit = median - 3 * mad
upper_limit = median + 3 * mad
if lower_limit <= im[row][col] <= upper_limit:
print('正常值')
else:
print('离群值')
```
有几点要注意的是:
- 1.这里的矩阵M实际上并不是整张图片,按前面的描述应该也能看出来,M指的实际上是要检测点(row,col)向周围等距离扩散出来的一个小矩阵。
- 2.我这里也只是针对矩阵举例的,实际上BGR图片是(h,w,3)的,而不是(h,w)的,所以这里实际处理的时候是分别对3个图像信道做了绝对中位差法筛选(即调用3次,每次处理一个信道,均在正常范围内才认为是正常点)。
如果还不明白的话,我再举个具体的例子,我随便编了一个小矩阵,5*9的,如下图蓝色框所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127203852512.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Fhcm9uam55,size_16,color_FFFFFF,t_70)
假设我们取影响距离k为1(表示只关注距离待检测点不超过1个格子的点),那么滑动窗口(感受野)的大小就是1*2+1=3。假设我们要检测的点时第3行第3列的点,则窗口可以用红色框表示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127203911651.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Fhcm9uam55,size_16,color_FFFFFF,t_70)
还记得中位数是什么吗?把一组数按照从小到大的顺序排列,最中间的数就是中位数。对于这个红色框来说,从小到大排列为:
```
[1,2,2,2,2,3,4,4,5]
```
一共9个数,最中间的数是第5个,数值是2,即 `median = 2`。
然后计算出矩阵N,即让矩阵M(红色框)中的每个数都减去 `median` ,并取绝对值 :
```
[
[3,1,2],
[0,1,0],
[2,0,0]
]
```
然后计算N的中位数,`[0,0,0,0,1,1,2,2,3]`,得到 `mad=1`。
根据 `[median-x*mad,median+x*mad]`,当x取3时,可以计算出正常区间为`[2-3*1,2+3*1]`,即`[-1,5]`。第3行第3列的数字刚好为3,在这个区间里,不是离群值。
接着我们判断第3行第4列的数字是否为离群值:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020112720394515.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Fhcm9uam55,size_16,color_FFFFFF,t_70)
简单计算一下:
```
median=3
N=array([[ 2., 1., 0.],
[ 0., 1., 17.],
[ 1., 1., 3.]])
mad=1
区间为[3-1*3,3+1*3]=[0,6]
```
第3行第4列的数字2在这个区间里,是正常值。
再将窗口右移一格:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127204006633.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Fhcm9uam55,size_16,color_FFFFFF,t_70)
计算一下:
```
median=5
N=array([[ 1., 2., 1.],
[ 3
没有合适的资源?快使用搜索试试~ 我知道了~
一些深度学习中的小例子,适合新手学习使用
共79个文件
jpg:37个
py:25个
txt:7个
需积分: 5 0 下载量 95 浏览量
2024-05-01
08:56:16
上传
评论
收藏 25.97MB ZIP 举报
温馨提示
使用TensorFlow 2.0 编写的、基于循环神经网络的古诗生成器 使用Keras + BERT 模型编写的古诗生成器 从零开始编写一个宠物识别系统(爬虫、模型训练和调优、模型部署、Web服务) 深度学习下的目标检测算法——TensorFlow 2.0下的YOLOv3实践 使用TensorFlow 2.0 编写的图片神经风格迁移 使用Keras + BERT 模型编写的情感分析Demo 使用TensorFlow 2.0 编写的、基于循环神经网络的情感分析Demo xyolo:YOLOv3的高度封装版本,几行代码实现模型的训练和调用 使用xyolo+孪生神经网络解决点选式验证码
资源推荐
资源详情
资源评论
收起资源包目录
DeepLearningExamples-code.zip (79个子文件)
DeepLearningExamples-code
.DS_Store 10KB
keras-bert-emotional-classifier
eval.py 1KB
requriments.txt 44B
dataset.py 4KB
models.py 2KB
weibo_senti_100k.csv 18.79MB
settings.py 725B
train.py 1KB
README.MD 3KB
tf2-rnn-emotional-classifier
dataset.py 7KB
models.py 2KB
requirements.txt 31B
settings.py 485B
train.py 2KB
README.MD 1KB
keras-bert-poetry-generator
utils.py 4KB
eval.py 634B
poetry.txt 9.71MB
requriments.txt 62B
dataset.py 4KB
model.py 979B
settings.py 853B
train.py 1KB
README.MD 2KB
tf2-neural-style-transfer
utils.py 1KB
.DS_Store 6KB
samples
style.jpg 1.47MB
dog_gen.jpg 106KB
city_gen.jpg 108KB
dog.jpg 46KB
city.jpg 188KB
output
2.jpg 102KB
10.jpg 105KB
13.jpg 106KB
14.jpg 106KB
6.jpg 104KB
15.jpg 106KB
16.jpg 106KB
1.jpg 100KB
17.jpg 106KB
12.jpg 106KB
5.jpg 104KB
8.jpg 105KB
20.jpg 106KB
18.jpg 106KB
11.jpg 105KB
19.jpg 106KB
3.jpg 103KB
7.jpg 105KB
9.jpg 105KB
4.jpg 104KB
model.py 2KB
requirements.txt 44B
images
style.jpg 1.47MB
content.jpg 46KB
settings.py 836B
train.py 5KB
README.MD 3KB
tf2-rnn-poetry-generator
utils.py 3KB
eval.py 580B
poetry.txt 9.71MB
requriments.txt 35B
dataset.py 6KB
model.py 982B
settings.py 602B
train.py 1KB
README.MD 2KB
README.MD 604B
counter-dingxiang-area-captcha
samples
fb03bafd-0cd5-4387-aac2-297afd185986.jpg 9KB
e9e35bb6-5b5f-42bd-8fce-1f1fa463f1cc.jpg 9KB
47ae80cd-24d8-456f-9160-b39fd1949e00.jpg 11KB
0462f829-9ec9-4b0e-9274-02b1edd8f7b2.jpg 8KB
133c9d95-b64e-40c0-853a-6b3c38c519c1.jpg 12KB
2c73b2d7-9e0a-4df7-8213-e5da0a8bbbbe.jpg 11KB
8c04a9e1-5b56-4e2e-95f4-128fa021da92.jpg 10KB
306af64e-958f-4381-b7a4-47a1a12048c4.jpg 9KB
550f1212-dd68-4d44-8dfe-439667b6aadc.jpg 11KB
49d550dd-46c2-4a6d-9c24-e6c56ea2d1d3.jpg 8KB
README.MD 32KB
共 79 条
- 1
资源评论
MarcoPage
- 粉丝: 2953
- 资源: 3005
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- vscode配置c/c 环境教程
- vscode配置c/c 环境教程
- 基于matlab实现电磁优化计算功能,进行线型规划优化电磁设计.rar
- 基于matlab实现带精英策略的非支配排序遗传算法matlab 源码.rar
- 基于matlab实现差分进化算法,最新的用于替代遗传算法,是以后的主要发展方法.rar
- VSCode配置c/c++环境教程.md
- 基于matlab实现标准合作型协同进化遗传算法matlab源程序
- 七下人教.zip
- 基于matlab实现本份代码能对图像进行gabor滤波处理,结合指纹方向图以及指纹沟壑频率特性,对指纹图像进行增强.rar
- 基于matlab实现RBM神经网络实现了手写数字体识别的GUI程序.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功