休息了一个月,从今天开始继续更新文章!希望大家喜欢。最近在研究怎么破解验证码,其中就要利用到Python识别像素颜色的技术。你也可以用PS慢慢地进行取样记录,但那样效率非常低下,而且麻烦。识别验证码需要我们高效地提取出像素,并将其转换成黑白二色,这样才好进行矢量对比。
工具:
如果你有PyCharm的话,可以在Preferences内的Project Interpreter中安装pillow.
若你没有PyCharm.请上网查阅安装流程,非常简单。
几个要用到的比较重要的函数(你可以先跳过,遇到不认识的函数再回来查看):
建议直接阅读PIL的英文文档:http://effbot.org/imagingbook/image.htm
image.new(mode,size,color)
使用给定的变量mode和size生成新的图像。mode是图片模式,如”RGB”、”P”。Size是给定的宽/高二元组,这是按照像素数来计算的。对于单通道图像,变量color只给定一个值;对于多通道图像,变量color给定一个元组(每个通道对应一个值)。
im.convert(mode)
将你打开的图片转化为某种格式。
im.getpixel(xy)
返回给定位置的像素。
im.putpixel(xy,color)
修改给定位置的像素。
im.size()
返回两个元素,宽和高。im.size ⇒ (width, height)
若是变量名.size[0]则便是是宽,size[1]则表示是高。
使用的图片:
from PIL import Image im = Image.open("1.jpg") for y in range(im.size[1]): for x in range(im.size[0]): pix = im.getpixel((x,y)) print(pix)
运行结果很长,我们截取一部分:
不得不说Python实在很强大。不过这样看实在很麻烦,因为像素这么多,我们不可能手动地去分析数据。
如果我们要算出RGB各个位低于100的数量,我们可以这样做:
from PIL import Image im = Image.open("1.jpg") count = 0 for y in range(im.size[1]): for x in range(im.size[0]): pix = im.getpixel((x,y)) if(pix[0] < 100 and pix[1] < 100 and pix[2] < 100): count = count + 1 print(count)
结果是265743.我们甚至可以把它们转换成别的颜色。
最好是不在原图上操作,我们new一个一样大小的图片即可。
im2 = Image.new(“RGB”,im.size,255)
意思是新建一个跟它一样大的RGB图片,背景颜色为红色。
我们把刚刚各个位低于100的像素转化为白色。
from PIL import Image im = Image.open("1.jpg") im2 = Image.new("RGB",im.size,255) count = 0 for y in range(im.size[1]): for x in range(im.size[0]): pix = im.getpixel((x,y)) if(pix[0] < 100 and pix[1] < 100 and pix[2] < 100): im2.putpixel((x,y),(255,255,255)) im2.show()
结果:
如果我们对原图进行修改颜色:
嘛,还是可以接受的。
源代码已经上传到公众号的github项目。以后公众号的源代码及图片都能在这里找到:https://github.com/Ckend/GongZhongHao
欢迎关注微信公众号:Python实用宝典https://pythondict.com