编程语言
首页 > 编程语言> > python处理验证码图片

python处理验证码图片

作者:互联网

在web测试和开发爬虫的时候总是会遇到验证码如何识别的问题,验证码总是会有各种各样的线条增加了识别的难度,所以需要对验证码进行预处理,在进行识别,进而提高识别成功的概率。

那么我接触的就有两种方法:1.九宫格  2.去掉背景噪声

1.九宫格

a.先对图片进行灰度处理和二进制处理,以下是实现的代码

import pytesseract
from PIL import Image
def huiduchuli():
im=Image.open(r'C:\Users\23647\Desktop\1.jpg')
#进行置灰处理
im=im.convert('L')
#这个是二值化阈值
threshold=150
table=[]
for i in range(256):
if i<threshold:
table.append(0)
else:
table.append(1)

#通过表格转换成二进制图片,1的作用是白色,0就是黑色
im=im.point(table,"1")

b.接着对图片进行九宫格的处理

rows, cols = im.size
print(rows,cols)
change_pos = []
#遍历图片中的每个点,除掉边缘
for i in range(1,rows-1):
for j in range(1,cols-1):
# 用来记录该点附近的黑色像素的数量
pixel_set = []
# 取该点的领域为以该点为中心的九宫格
for m in range(i-1, i+2):
for n in range(j-1, j+2):
if im.getpixel((m,n)) !=1: #1为白,0为黑
pixel_set.append(im.getpixel((m,n)))

#如果该位置的九宫格的黑色数量小于等于6,则判断为噪声
if len(pixel_set) <= 6:
change_pos.append((i,j))
#对相应位置进行像素修改,将噪声处的像素置为1
for pos in change_pos:
im.putpixel(pos, 1)

    灰度和二进制后成为这样像这样灰度和二进制后图片被线条所干扰,并且线条的周围比较多空白,那么就可以对图片做

“九宫格”处理。以每个像素点作为中心画出九宫格,若九宫格内的黑点小于等于n(n为实际场景的值,通过多次调整就可以得到适合的,就是上面的6),则判定为噪点。

下面是完整代码:

import pytesseract
from PIL import Image
def huiduchuli():
im=Image.open(r'C:\Users\23647\Desktop\1.jpg')
#进行置灰处理
im=im.convert('L')
#这个是二值化阈值
threshold=150
table=[]
for i in range(256):
if i<threshold:
table.append(0)
else:
table.append(1)

#通过表格转换成二进制图片,1的作用是白色,0就是黑色
im=im.point(table,"1")
rows, cols = im.size
print(rows,cols)
change_pos = []
#遍历图片中的每个点,除掉边缘
for i in range(1,rows-1):
for j in range(1,cols-1):
# 用来记录该点附近的黑色像素的数量
pixel_set = []
# 取该点的领域为以该点为中心的九宫格
for m in range(i-1, i+2):
for n in range(j-1, j+2):
if im.getpixel((m,n)) !=1: #1为白,0为黑
pixel_set.append(im.getpixel((m,n)))

#如果该位置的九宫格的黑色数量小于等于6,则判断为噪声
if len(pixel_set) <= 6:
change_pos.append((i,j))
#对相应位置进行像素修改,将噪声处的像素置为1
for pos in change_pos:
im.putpixel(pos, 1)


im.save(r'C:\Users\23647\Desktop\test1.png')

huiduchuli()

 

 

2.去掉背景噪声,以下是实现代码

a. 对图片进行分析

 

该图片字符是统一黑色的,所以可以先对其进行背景去噪。

from PIL import Image
import matplotlib.pyplot as plt
import os
#字典转list
def dict2list(dic:dict):
keys = dic.keys()
vals = dic.values()
list = [(key, val) for key,val in zip(keys,vals)]
return list
img = Image.open(r'C:\Users\23647\Desktop\ycbk.png')#打开图片转成RGB格式
"""分析图像颜色分布"""

w,h = img.size
print(w,h)
a = {}

"""统计颜色出现的次数"""
for i in range(w):
for j in range(h):
r,g,b = img.getpixel((i,j))
t = r*255*255 + g *255 +b
if t in a.keys():
a[t] = a[t] + 1
else:
a[t] = 1
l = sorted(dict2list(a),key=lambda x:x[1], reverse=True)
print(l)
dic = {}
"""画图显示颜色分布"""
plt.figure(1,figsize=(20,5))
plt.scatter(a.keys(), a.values(), linewidths=1)
plt.show() #==================>这里打印出一张二维图,对颜色的阈值进行分析,取一个较为合适的阈值

 

 


改图一开始看很懵逼,其实也可以一个个试一下,也能试出来。 这里的1e7就是1千万的意思,也就是x轴的刻度要乘于1千万。


b.对图片进行背景去噪。

"""新增与原图一样的图片,用白色背景"""
newImg = Image.new("RGB",img.size,(255,255,255,255))
for i in range(w):
for j in range(h):
if (i==0 or i==w or i==w or j==0 or j==h or j==h-1):
img.putpixel((i,j),(255,255,255))
r,g,b = img.getpixel((i,j))
t = r * 255 * 255 + g * 255 + b
if(t<3000000):
newImg.putpixel((i,j),(r,g,b))

 

完整代码就是:
from PIL import Image
import matplotlib.pyplot as plt
import os
#字典转list
def dict2list(dic:dict):
keys = dic.keys()
vals = dic.values()
list = [(key, val) for key,val in zip(keys,vals)]
return list
img = Image.open(r'C:\Users\23647\Desktop\ycbk.png')#打开图片转成RGB格式
"""分析图像颜色分布"""

w,h = img.size
print(w,h)
a = {}

"""统计颜色出现的次数"""
for i in range(w):
for j in range(h):
r,g,b = img.getpixel((i,j))
t = r*255*255 + g *255 +b
if t in a.keys():
a[t] = a[t] + 1
else:
a[t] = 1
l = sorted(dict2list(a),key=lambda x:x[1], reverse=True)
print(l)
dic = {}
"""画图显示颜色分布"""
plt.figure(1,figsize=(20,5))
plt.scatter(a.keys(), a.values(), linewidths=1)
plt.show()

"""新增与原图一样的图片,用白色背景"""
newImg = Image.new("RGB",img.size,(255,255,255,255))
for i in range(w):
for j in range(h):
if (i==0 or i==w or i==w or j==0 or j==h or j==h-1):
img.putpixel((i,j),(255,255,255))
r,g,b = img.getpixel((i,j))
t = r * 255 * 255 + g * 255 + b
if(t<3000000):
newImg.putpixel((i,j),(r,g,b))
newImg.convert('L').convert('1').save(r'C:\Users\23647\Desktop\hello.jpg')



 




  

 

标签:img,python,九宫格,验证码,pos,range,im,图片,255
来源: https://www.cnblogs.com/shuai-shuai-yang/p/15062020.html