验证码背景合成(多张残缺图合成一张完整图)

问题描述

有多张验证码图片,背景相同,如何获取完整的背景图?

已有条件:可以使用yolox检测出汉字的位置矩形框。

方法

输入:一个验证码图片文件夹

输出:包含所有的背景图片的文件夹

  1. 背景区分:假设相同的背景的验证码图片的背景部分是完全一致的的,那么可以比较边框的像素点来判断是否是同一个背景,把所有图片按照背景分类。
  2. 针对每一个分类,用yolox预测出汉字框,把汉字框部分像素点设置为黑色,以其中一张为基础,遍历它的黑色像素位置,在其他几张验证码图片上查找是否有不是黑色的像素点,如果有,则替换基础图片的对应像素点。
  3. 保存合成的背景图片。

效果

源代码

这里的yolox_predict.imagedemo()用于得到所有文字矩形框

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#coding=utf-8
#用于分析合成所有背景图
import os
import cv2
import numpy as np
import yolox_predict

#图片背景分类
def classify(dir):
dict={}
for fileName in os.listdir(dir):
filePath=os.path.join(dir,fileName)
img=cv2.imdecode(np.fromfile(filePath,dtype=np.uint8),-1)
x,y=img.shape[:2]
#提取四个角的像素值作为特征点,分类依据
feature = ''.join(str(i) for i in img[0,0])+''.join(str(i) for i in img[0,y-1])+''.join(str(i) for i in img[x-1,0])+''.join(str(i) for i in img[x-1,y-1])
print(feature)
if dict.__contains__(str(feature)):
dict[str(feature)].append(fileName)
else:
dict[str(feature)]=[fileName]
return dict

# inputDir="E:/Y1/验证码/数据集/VOC2007-网易/JPEGImages"
inputDir="C:/Users/Administrator/Desktop/test"
outputDir="C:/Users/Administrator/Desktop/result"
DICT=classify(inputDir)#图片背景分类
print(DICT)
print('分类完成...')
predictor,current_time= yolox_predict.init()#加载模型
index=0
for key,value in DICT.items():
imgs=[]#该分类下所有挖掉汉字后的背景图
rects=[]#最后一张图的三个矩形框
for fileName in value:#同一背景的验证码图片
filePath=os.path.join(inputDir,fileName)
rects=yolox_predict.image_demo(predictor, vis_folder=outputDir, path=filePath, current_time=current_time)
print(filePath+'预测完成...')
img=cv2.imdecode(np.fromfile(filePath,dtype=np.uint8),-1)
for rect in rects:
x1,y1,x2,y2=rect
img[y1:y2,x1:x2]=[0,0,0]
imgs.append(img)
if len(imgs)<5:#5张相同背景的验证码图片,被认为可以拼凑出完整背景
continue
for rect in rects:
x1,y1,x2,y2=rect
for x in range(x1,x2):
for y in range(y1,y2):#空缺的每个像素
for img in imgs[:-1]:#在其余几张图中找
if sum(img[y,x])>0:#不是黑的
imgs[-1][y,x]=img[y,x]#找到,替换
cv2.imwrite(os.path.join(outputDir,str(index)+'.jpg') ,imgs[-1])
print('合成背景图'+os.path.join(outputDir,str(index)+'.jpg'))
index+=1

验证码背景合成(多张残缺图合成一张完整图)
https://xinhaojin.github.io/2022/06/10/验证码背景合成(多张残缺图合成一张完整图)/
作者
xinhaojin
发布于
2022年6月10日
许可协议