OpenCV图像缺口位置识别
-
- 1、背景
- 2、图像缺口位置识别原理
- 3、图像缺口位置识别实现
- 4、滑块验证码HTTP图像需要保存到本地吗
1、背景
在使用Selenium完成自动化爬虫时,许多网站为了防止机器人爬取数据会使用验证码(例如滑块验证码)。通过Selenium动作操作,爬虫可以模拟用户输入验证码或使用鼠标移动一定距离来处理验证码验证过程
完成这一流程的关键步骤有两步:识别出目标图像缺口的位置,操作滑块滑动到对应缺口位置
而识别目标图像缺口的位置可以通过OpenCV模块实现
OpenCV模块详解见文章:传送门
2、图像缺口位置识别原理
对于滑块验证码缺口图片(如下图):
主要步骤包括:
- 对滑块验证码图片进行高斯模糊滤波处理,消除部分噪声干扰
- 对滑块验证码图片应用边缘检测算法,通过调整相应阈值识别出滑块边缘
- 对上一步得到的各个边缘轮廓信息,通过对比面积、位置、周长等特征筛选出最可能的轮廓位置,得到缺口位置
3、图像缺口位置识别实现
3.1、导入所需模块
import cv2
import urllib.request as req
import numpy as np
3.2、高斯模糊与边缘检测
高斯滤波是用来去除图像中的一些噪声的,基本效果其实就是把一张图像变得模糊化,减少一些图像噪声干扰,从而为下一步的边缘检测做好铺垫。经过高斯滤波处理后,图像会变得模糊
由于验证码目标缺口通常具有比较明显的边缘,所以借助一些边缘检测算法并通过调整阈值可以找出它的位置。经过边缘检测算法处理后,一些比较明显的边缘信息会被保留下来
# 读取图像文件并返回一个image数组表示的图像对象
src1 = r'C:\Users\cc\Desktop\bg.png'
image = cv2.imread(url)
print("图像大小:", image.shape)
# GaussianBlur方法进行图像模糊化/降噪操作
# 它基于高斯函数(也称为正态分布)创建一个卷积核(或称为滤波器),该卷积核应用于图像上的每个像素点
blurred = cv2.GaussianBlur(image, (5, 5), 0)
# Canny方法进行图像边缘检测(轮廓)
# image: 输入的单通道灰度图像
# threshold1: 第一个阈值,用于边缘链接。一般设置为较小的值
# threshold2: 第二个阈值,用于边缘链接和强边缘的筛选。一般设置为较大的值
canny = cv2.Canny(blurred, 0, 100