本案例所用滑块图例如下:

执行效果如下:

由于博客存在水印,可能影响代码运行,可复制此链接: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()
本文介绍如何通过Python中的matplotlib、pandas和numpy库分析滑块图,确定其在图像中的位置,是向上、向下还是向左右凸起。代码示例展示了如何处理图片并提取关键数据以做出判断。

被折叠的 条评论
为什么被折叠?



