滑块验证之缺口为单一颜色的坐标轴确定(pandas实现方式)

本文介绍如何通过Python中的matplotlib、pandas和numpy库分析滑块图,确定其在图像中的位置,是向上、向下还是向左右凸起。代码示例展示了如何处理图片并提取关键数据以做出判断。

本案例所用滑块图例如下:
在这里插入图片描述

执行效果如下:
在这里插入图片描述

由于博客存在水印,可能影响代码运行,可复制此链接:https://cszg.mca.gov.cn/biz/ma/csmh/filter/slideCaptchaindex.html
下载滑块图片,替换掉代码图片路径即可

代码如下:

import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import image as maping
import matplotlib
import numpy as np

# 指定matplotlib后端制图模式
matplotlib.use('TkAgg')
# 设置显示的列数,将数字设置为你想要显示的最大列数
pd.set_option('display.max_rows', None)
img_path = r"C:\Users\cerebrumWeaver\Desktop\下载 (2).png"  # 路径 修改完后 代码 直接 运行
img = maping.imread(img_path)
df = pd.DataFrame(img.reshape(-1, 3))  # 图片三维空间存入pandas,其中的-1代表图片宽和高的乘积,后续将该乘积值作除以(得到y坐标)或者取模操作(得到x坐标)
result = df[(df[0].round(6) == 0.960784) & (df[1].round(6) == 0.980392) & (df[2].round(6) == 1.000000)]  # 这三个值的设定可通过matplotlib绘图后,鼠标悬停到图片处可查看该值
result_rev = df[~((df[0].round(6) == 0.960784) & (df[1].round(6) == 0.980392) & (df[2].round(6) == 1.000000))]
df_copy = df.copy()
df_copy.loc[result_rev.index] = 0
img_foreground = df_copy.values.reshape((-1, 300, 3))
index = result.index
df_index = pd.Series(data=index, index=index)  # series对象的值和索引都取index,保持二者一致
diff38_index = df_index.diff(38)  # 设置偏移量
diff38_counts = diff38_index.value_counts().loc[38]  # 偏移量作为索引,查看38值个数,用于后续判断图片为上下凸起还是左右凸起
diff38_index = diff38_index[diff38_index.values == 38]  # 用于求点的x或者y坐标

if diff38_counts < 51:  # 滑块凸起部分在上下方,该阈值的设定取图片宽高二者的大值
    x = diff38_index.index.to_list()[0] % 300 - 38  # 减去上方设置的偏移量
    y_upper = diff38_index.index.to_list()[0] / 300  # 垂直方向最上边点y坐标
    y_lower = diff38_index.index.to_list()[-1] / 300  # 垂直方向最下边点y坐标
    y_point = df_index.apply(lambda item: item / 300)  # 计算所有滑块点的y坐标
    print(x)
    if len(y_point[y_point.values < y_upper]) > len(y_point[y_point.values > y_lower]):  # 判断滑块凸起的位置
        print("滑块凸起在上↑")
    else:
        print("滑块凸起在下↓")
else:  # 滑块凸起部分在左右方
    x_right = diff38_index.index.to_list()[0] % 300  # 水平方向最右边点X坐标
    x_left = diff38_index.index.to_list()[0] % 300 - 38  # 水平方向最左边点X坐标
    x_point = df_index.apply(lambda item: item % 300)  # 计算所有滑块点的x坐标
    if len(x_point[x_point.values < x_left]) > len(x_point[x_point.values > x_right]):  # 判断滑块凸起的位置
        x = diff38_index.index.to_list()[0] % 300 - 38 - 10  # 减去左边凸起的10公分
        print(x)
        print("滑块凸起在左←")
    else:
        x = diff38_index.index.to_list()[0] % 300 - 38  
        print(x)
        print("滑块凸起在右→")
image = np.concatenate((img, img_foreground), axis=0)
plt.imshow(image)
plt.show()



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值