python处理验证码图片
2021/7/26 17:06:26
本文主要是介绍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处理验证码图片的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器
- 2024-11-16四种数据科学Web界面框架快速对比:Rio、Reflex、Streamlit和Plotly Dash
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门