上期分割方法以失败告终(蟒盘纪念币系列二:身份验证码02)。问题总是要在这里解决,所以我想到了另外一个方法。第一种字符分割方法失败。再仔细看图,发现所有验证码图片中的字符大约占原图的1/4。有没有可能把原图均匀的切成四等份,让每个字符都在一个单独的块中?以下是算法步骤:将图像转为灰度图像cap=get_gif_first_frame('1.jpg')cap=cv2.cvtColor(cap,cv2.COLOR_BGR2GRAY)设置图像中所有像素点的像素值为零,有效减少干扰_,thresh=cv2.threshold(cap,150,255,cv2.THRESH_BINARY)把图片分成四份width=thresh.shape[1]chars=[thresh[:,0:int(width/4)],thresh[:,int(width/4):int(width/2)],thresh[:,int(width/2):int(3*width/4)],thresh[:,int(3*width/4):]]去掉字符块在水平和垂直方向上下左右的黑边。以垂直方向第一个字符块的处理方法为例,具体算法步骤如下:每行的像素值加上vertical=[sum(char_patch[index,:])forindexinrange(char_patch.shape[0])]取出非零元素的下标,根据三种情况得到字符块的边界。为了完全分割字符,特意将边界的上下界和下标放宽了一个像素item_cnt=len(vertical)zero_vertical_index=[indexforindex,valueinenumerate(vertical)ifvalue==0]if0不在zero_vertical_index:first_index=0last_index=zero_vertical_index[0]+1elifitem_cnt-1不在zero_vertical_index:first_index=zero_vertical_index[0]-1last_index=item_cnt-1else:target=[indexforindex,valueinenumerate(zero_vertical_index[if:-1])zero_vertical_index[index+1]-zero_vertical_index[index]!=1]first_index=zero_vertical_index[target[0]]-1last_index=zero_vertical_index[target[-1]+1]+1分割字符(v_f,v_l)=first_index,last_indextarget_char=char[v_f:v_l]保存字符。由于前期没有特别标注验证码图片,所以保存的时候需要告诉电脑要保存什么字符。另外观察到验证码字符的字体和大小基本没有变化,所以这个问题其实不需要太多的数据集,所以在实际操作中,我只解析了100个验证码(是算懒~)。class_names=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9','0']class_ords=[ord(class_name)forclass_nameinclass_names]class_cnt={class_name:0forclass_nameinclass_names}cv2.imshow('target_char',target_char)flag=cv2.waitKey(0)ifflaginclass_ords:class_name=class_names[class_ords.index(标志)]class_cnt[class_name]+=1cv2.imwrite(os.path.join(char_dir,'{}_{}.jpg'.format(class_name,str(class_cnt[class_name]))),target_patch)postscript至此,整个数据集的预处理到构建基本完成。本系列的所有源码都会放在下面的github仓库中,有需要的可以参考,有问题请指正,谢谢!https://github.com/TitusWongCN/AutoTokenAppointment接下来就是精彩的模型设计和训练,敬请期待。第一期:蟒盘纪念币系列一:简介第二期:蟒盘纪念币系列二:鉴定验证码01第三期:蟒盘纪念币系列二:鉴定验证码02
