某像差异在个别全家桶验证方便有使用,对于这种验证码类型如下:
首先还是目标检测,直接用 dddd 自带的detection 就足够了。
特征提取
其次经过观察,差异答案与其他三个无非就是颜色,字体,方向,所以余弦相似度也是一种解决办法。
- 通过检测框将图像先转为灰度图,然后提取出1D向量。(为什么要提取,因为后面要进行余弦计算,转灰度图是因为只包含亮度信息,特征提取足够了)
def extract_features(image):
resized_image = cv2.resize(image, (128, 128)) # 缩放到统一大小
gray_image = cv2.cvtColor(resized_image, cv2.COLOR_BGR2GRAY) # 转灰度
return gray_image.flatten()
features = [extract_features(img) for img in images]
提取特征结果如下:
features = [
[特征1, 特征2, 特征3, …], # 第一张图像
[特征1, 特征2, 特征3, …], # 第二张图像
…
]
特征降维(PCA)
提取出来的特征我们需要从中拿出最主要的特征,利用 pca 进行降维,保留主要特征,减少噪声干扰
n_components = min(len(features), len(features[0]))
pca = PCA(n_components=n_components)
reduced_features = pca.fit_transform(features)
相似度计算
将上面特征降维的图像列表传入进行余弦相似度计算
from sklearn.metrics.pairwise import cosine_similarity
similarity_matrix = cosine_similarity(reduced_features)
如何计算?
similarity_matrix = [
[1.0, 0.98, 0.85], # 第一张图像与第 1, 2, 3 张图像的相似度
[0.98, 1.0, 0.90], # 第二张图像与第 1, 2, 3 张图像的相似度
[0.85, 0.90, 1.0] # 第三张图像与第 1, 2, 3 张图像的相似度
ps:自己和自己对比永远是1,所以对角线永远是1,那么当差异大的图像和其他图像相比时,相似度必然下降
]
那么趁热打铁,直接计算平均相似度
average_similarity = np.mean(similarity_matrix, axis=1)
可能结果如下: array([ 0.33247589, 0.34121216, 0.29035055, -0.38125554])
谁是正确答案一目了然
直接用 np.argmin(average_similarity) 找到正确答案的索引,然后根据索引从dddd检测出来的框去找答案就行了,再就没有然后了。
这里就不得不提提某J逆向了,整那些没用的,花拳绣腿,啥成功率也敢发。
完整代码如下:
import ddddocr
import cv2
想啥呢 自己看文章组合吧