Python教程

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')


 



  

 

这篇关于python处理验证码图片的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!