自学内容网 自学内容网

图像匹配验证码自动检测:基于YOLOv10和传统图像匹配算法

图像匹配验证码自动检测:基于YOLOv10和传统图像匹配算法

引言

再来更新一下我们的验证码识别算法,这次解决的是图像匹配点选验证码,如图所示
在这里插入图片描述
,
在这里插入图片描述

还是先给出逻辑,人眼选择步骤:

  1. 首先是看到下面的图像是什么样
  2. 看看上面大图中的四个小的图形
  3. 匹配上面观察到的二者图像,选择正确的

所以对应到用算法进行自动点选,简化为:

  1. 用YOLOv10算法检测出图像中所有的图像文件
  2. 利用位置关系区分上方图像文件和下方图像文件(需要点选的图像通常都在图像y坐标最下方)
  3. 把下面的图像文件和上面的一一匹配,寻找相似度最高的,返回即可

图像采集

在这里插入图片描述
在这里插入图片描述
为了满足泛化性,收集了3w+张图像,如果需要请看我的个人主页获取。
在这里插入图片描述
标注方法如上图所示

YOLOv10目标检测

基于标注好的数据集文件,使用YOLOv10模型检测验证码中的图像元素,提取出它们的位置和特征。检测结果如下:
在这里插入图片描述
YOLO(You Only Look Once)是一种实时目标检测模型,具有非常高的检测精度和速度。YOLOv10作为YOLO系列中的最新版本,针对图像中的目标进行全局性预测,相比传统方法具有更好的准确性和计算效率。
在验证码识别中,YOLOv10通过以下方式发挥了重要作用:

目标检测:YOLOv10能够识别验证码中的各类目标(如数字、字母、特殊符号等),并且能够有效地处理图像的旋转、缩放等变化。
多尺度检测:YOLOv10支持多尺度检测,可以在不同分辨率下提取图像特征,适应各种验证码图像的变化。
高效推理:YOLOv10具有极高的推理速度,在处理实时验证码图像时,可以迅速提取有效信息。

图像匹配

图像匹配:结合传统的图像匹配算法(如模板匹配或特征匹配),根据YOLOv10提取出的特征进一步细化和优化识别结果。

博主主要采用传统图像中的基于直方图的相似度计算、感知哈希(pHash)、均值哈希(aHash)和差值感知哈希(dHash),以及计算汉明距离的方法来对图像进行匹配,代码如下:

1.计算两张图像的灰度直方图相似性

功能:此函数计算两张图像的灰度直方图的相似度,具体步骤如下:
cv2.calcHist:计算图像的灰度直方图,[0]表示计算单通道(灰度)直方图,[256]表示分成256个桶,每个桶对应一个灰度级别(0-255)。
degree:相似度度量,通过遍历两个直方图的每个值计算相似度,若对应的灰度值相同,则相似度增加;若不同,则计算差异并对其做反向处理,使得差异越小,相似度越大。
最终返回两个图像的相似度得分。
应用:该方法用于基于灰度直方图计算两张图像的相似度,适用于图像的对比度或亮度变化不大的场景。

def calculate(image1, image2):
    # 灰度直方图算法
    # 计算单通道的直方图的相似值
    hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0])
    hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])
    # 计算直方图的重合度
    degree = 0
    for i in range(len(hist1)):
        if hist1[i] != hist2[i]:
            degree = degree + (1 - abs(hist1[i] - hist2[i]) / max(hist1[i], hist2[i]))
        else:
            degree = degree + 1
    degree = degree / len(hist1)
    return degree

2. RGB通道分离后的直方图相似度计算

功能:该函数计算两张RGB图像每个通道(R、G、B)的灰度直方图相似度:

首先将输入的两张图像调整到指定大小(默认是256x256)。
cv2.split(image):分离图像的三个RGB通道。
然后分别计算每个通道的灰度直方图相似度(调用前面定义的calculate函数)。
最后返回三个通道的相似度平均值。
应用:该方法适用于彩色图像的相似度计算,通过分别计算每个通道的直方图相似度来评估两张图像在RGB各通道上的一致性。

def classify_hist_with_split(image1, image2, size=(256, 256)):
    # RGB每个通道的直方图相似度
    # 将图像resize后,分离为RGB三个通道,再计算每个通道的相似值
    image1 = cv2.resize(image1, size)
    image2 = cv2.resize(image2, size)
    sub_image1 = cv2.split(image1)
    sub_image2 = cv2.split(image2)
    sub_data = 0
    for im1, im2 in zip(sub_image1, sub_image2):
        sub_data += calculate(im1, im2)
    sub_data = sub_data / 3
    return sub_data

3. 感知哈希算法

功能:感知哈希(pHash)是一种通过图像的频域信息来生成图像哈希的方法:

cv2.resize(image, (32, 32)):将图像缩小为32x32的尺寸。
cv2.cvtColor(image, cv2.COLOR_BGR2GRAY):将图像转换为灰度图。
cv2.dct(np.float32(image)):对图像进行离散余弦变换(DCT),DCT可以提取图像中的频率信息,去除低频部分(如大致形状和纹理),保留图像的重要特征。
取DCT变换后的左上角8x8区域,这部分代表图像的低频成分。
然后计算这些值的平均值,根据大于平均值的部分生成二进制哈希。
应用:感知哈希用于图像的指纹生成,适合图像相似度计算和图像去重,能有效应对图像压缩、缩放等变化。

# 感知哈希算法
def pHash(image):
    image = cv2.resize(image, (32, 32), interpolation=cv2.INTER_CUBIC)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    #     cv2.imshow('image', image)
    #     cv2.waitKey(0)
    #     cv2.destroyAllWindows()
    # 将灰度图转为浮点型,再进行dct变换
    dct = cv2.dct(np.float32(image))
    #     print(dct)
    # 取左上角的8*8,这些代表图片的最低频率
    # 这个操作等价于c++中利用opencv实现的掩码操作
    # 在python中进行掩码操作,可以直接这样取出图像矩阵的某一部分
    dct_roi = dct[0:8, 0:8]
    avreage = np.mean(dct_roi)
    hash = []
    for i in range(dct_roi.shape[0]):
        for j in range(dct_roi.shape[1]):
            if dct_roi[i, j] > avreage:
                hash.append(1)
            else:
                hash.append(0)
    return hash

3. 均值哈希算法 (aHash)

功能:均值哈希(aHash)通过将图像缩小并计算像素值的平均值,生成图像的哈希值:

cv2.resize(image, (8, 8)):将图像缩小为8x8的尺寸。
np.mean(image):计算图像所有像素的平均值。
根据每个像素值与平均值的比较,生成二进制哈希值。
应用:均值哈希是一种简单且高效的图像哈希方法,常用于图像去重和相似度计算,适合于图像尺寸变化较小的场景。

# 均值哈希算法
def aHash(image):
    # 缩放为8*8
    image = cv2.resize(image, (8, 8), interpolation=cv2.INTER_CUBIC)
    # 转换为灰度图
    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    avreage = np.mean(image)
    hash = []
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            if image[i, j] > avreage:
                hash.append(1)
            else:
                hash.append(0)
    return hash


# 差值感知算法
def dHash(image):
    # 缩放9*8
    image = cv2.resize(image, (9, 8), interpolation=cv2.INTER_CUBIC)
    # 转换灰度图
    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    #     print(image.shape)
    hash = []
    # 每行前一个像素大于后一个像素为1,相反为0,生成哈希
    for i in range(8):
        for j in range(8):
            if image[i, j] > image[i, j + 1]:
                hash.append(1)
            else:
                hash.append(0)
    return hash


# 计算汉明距离
def Hamming_distance(hash1, hash2):
    num = 0
    for index in range(len(hash1)):
        if hash1[index] != hash2[index]:
            num += 1
    return num

这些函数涵盖了不同类型的图像相似度计算方法,包括基于灰度直方图的相似度计算、感知哈希、均值哈希和差值感知哈希等。它们可以广泛应用于图像检索、去重、识别等领域,帮助快速高效地评估两张图像的相似性。

总结与展望

经过检测与匹配,能够较好实现验证码识别


原文地址:https://blog.csdn.net/weixin_46221106/article/details/143746568

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!