验证码汉字图二值化处理

需求

把下图中汉字图片标准化处理,与背景分离,白字黑底

转为灰度图

emmm,勉强还是看得清的

灰度图直方图如下

直方图均衡化

均衡化后的直方图

对应灰度图

二值化

二值化之后遇到一个问题,白字or黑字?需要统一一下

黑字白底的情况下,需要进行反色处理

判别条件:边界像素中,白色像素比黑色像素少

根据条件反色后的灰度图如下

代码

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
#coding=utf-8
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt


def invert(img):
y,x=img.shape
left=[[[]
right=[[[]
for i in range(y):
left.append(img[[i,0[])
right.append(img[[i,x-1[])
blackPoints=list(img[[0[]).count(0)+list(img[[y-1[]).count(0)+left.count(0)+right.count(0)
blackRate=float(blackPoints/(x[*2+y[*2-4))
if blackRate<0.5:#边界黑像素比例
for i in range(y):#反色
for j in range(x):
img[[i,j[] = 255 - img[[i,j[]
return img

path='D:[[[[Desktop[[[[2022[_03[_08[_15[_04[_37[[[['
files=os.listdir(path)
for i in range(40):
img=cv2.imdecode(np.fromfile(path+files[[i[], dtype=np.uint8),-1)

# B,G,R = cv2.split(img) #get single 8-bits channel
# EB=cv2.equalizeHist(B)
# EG=cv2.equalizeHist(G)
# ER=cv2.equalizeHist(R)
# img=cv2.merge([[EB,EG,ER[]) #merge it back

img=cv2.cvtColor(img,cv2.COLOR[_BGR2GRAY)#灰度图
#img=cv2.GaussianBlur(img,(3,3),0,)#高斯平滑
img=cv2.equalizeHist(img)#直方图均衡化
r,img=cv2.threshold(img,127,255,cv2.THRESH[_BINARY)#二值化
img=invert(img)#如果字体是黑的,反色处理
plt.subplot(5,8,i+1)
plt.imshow(img,cmap='gray')
plt.axis('off')
plt.savefig('均衡化+二值化+白字[_灰度图.jpg',dpi=800)
plt.show()

总结

1.基本达到要求,但部分图片肉眼可见无法识别

2.在彩色图像上比较好区分,但第一步就转为了灰度图,丢失了很多信息,这里应该还有很大的提升空间


验证码汉字图二值化处理
https://xinhaojin.github.io/2022/03/09/验证码汉字图二值化处理/
作者
xinhaojin
发布于
2022年3月9日
许可协议