目录什么的不存在的
PIL / pillow
学习初心(爬虫)
爬取如家网站信息价格时,价格尽然是精灵图实现的(通过显示图片的不能位置,看到不同的数字),而且,每个网站的价格精灵图数字排列方式不同
图一
图二
所以我选择学习了图像识别(ocr),安装了操作比较简单的tesseract软件,(我的文章里有一篇详细介绍)
随之而来问题,图片太小(300x28),识别不了。。。
特喵的,简直就像拼夕夕的邀请用户领现金一样。。。
我看学完图像处理后你这个网站能翻出什么浪花
简要介绍
PIL(Python Image Library)是python的第三方图像处理库,过去由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。
但是,PIL 只支持python2.x的版本。
pillow 是PIL为支持 python3 而出现的改进版,,其功能和 PI L几乎无二
下载安装:pip install pillow
完事。
常用语句
打开图片
# 注意,无论python2.x还是python3.x,虽然都是导入PIL库,但是实际的库是不同的
from PIL import Image
with Image.open('./test1.png') as im:
im.show() # 调用外部软件(电脑软件)打开图片
im.save('./test.jpeg') # 保存文件,可以转换图片格式
改变图像大小
with Image.open('./test1.png') as im:
print(im.format, im.size, im.mode) # PNG (300, 20) RGB
(width,height) = (im.width*2 , im.height*2) # resize方法让图片可大可小
im1 = im.resize((width,height))
im1.show() # 调用外部软件(电脑软件)打开图片
im1.save('./test1.png') # 保存文件
大了一倍(600x56)
图片模式调整(二值化处理)
先介绍图片的不同模式
# 先介绍图片的不同模式(涉及二值化处理,也就是黑白图)
# 定义所述图像中的像素的类型和深度的字符串。每个像素使用全范围的位深度。因此,1 位像素的范围为 0-1,8 位像素的范围为 0-255,依此类推。当前版本支持以下标准模式:
# 1 (1位像素,黑白,每字节一个像素存储)
# L (8 位像素,黑白)
# P 调色板模式,(8 位像素,使用调色板映射到任何其他模式)。使用调色板来定义每个像素的实际颜色。
# RGB (3x8 位像素,真彩色)
# RGBA (4x8 位像素,带透明蒙版的真彩色)
# CMYK (4x8 位像素,分色)
# YCbCr (3x8 位像素,彩色视频格式)
# 请注意,这是指 JPEG,而不是 ITU-R BT.2020 标准
模式间转换
from PIL import Image
with Image.open("./4k copy.jpg") as im1:
print(im1.format, im1.size, im1.mode) # PNG (600, 56) RGBA
# 模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。
im1 = im1.convert("L")
# im1 = im1.convert('1')
im1.show()
print(im1.format, im1.size, im1.mode) # None (600, 56) L
from PIL import Image
with Image.open("./4k copy.jpg") as im1:
print(im1.format, im1.size, im1.mode) # PNG (600, 56) RGBA
# im1 = im1.convert("L")
im1 = im1.convert('1')
im1.show()
print(im1.format, im1.size, im1.mode) # None (600, 56) 1
自定义二值化
from PIL import Image
with Image.open("./test1.png") as im1:
im1 = im1.covert('L')
# 自定义灰度界限,大于这个值为黑色,小于这个值为白色
threshold = 100
table = [0 for i in range(threshold)]+[1 for i in range(threshold,256)] # 创建一个256长度的list
# 图片二值化
im2 = im1.point(table, '1')
im2.show()
注意:试过了test.png,因为太小,变化后看不见了,所以,我们需要点手段让他变大大
我估计他妈都不认识他了
图像增强
方法一:使用点操作point方法
from PIL import Image
with Imag.open('./test1.png') as im1:
# 亮度增加可能是2倍~吧
im2 = im1.point(lambda i:i*2) # 这里涉及python 中的 lambda 关键字。(又要查资料)
im2.show()
你们看是不是变亮了,理论上是变亮了,¥_¥
from PIL import Image
with Imag.open('./test1.png') as im1:
# 亮度变为原来的0.5倍~吧
im2 = im1.point(lambda i:i*0.5)
im2.show()
方法二:使用ImageEnhance模块中的类
您可以通过这种方式调整对比度、亮度、色彩平衡和锐度。
from PIL import ImageEnhance
with Image.open('./test1.png') as im1:
enhancer = ImageEnhance.Sharpness(im1) # 调整图像清晰度
# ImageEnhance.Brightness(image) # 调整图像亮度
# ImageEnhance.Contrast(image) # 调整图像对比度。
# ImageEnhance.Color(image) # 调整图像色彩平衡
enhancer.enhance(5).show()
后面三个操作过程相同
j结果
方法三:逐个操作图像的通道(RGB格式有R(red)、G(green)、B(blue)三个通道)
from PIL import Image
with Image.open('./test1.png') as im1:
print(im1.format,im1.mode)
r,g,b,a = im1.split()
r.show()
g.show()
b.show()
a.show()
b.point(lambda i:i*2) # 改变单个通道的值
im2 = Image.merge(im.mode, (r, g, b)) # merge合并
im2.show()
与其他图像处理库的比较
opencv、scikit-image和PIL图像处理库比较
opencv
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 [1] 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。(摘自度娘)
应用领域: 1、人机互动、
2、物体识别
3、图像分割
4、人脸识别
5、动作识别
6、运动跟踪
7、机器人
8、运动分析
9、机器视觉
10、结构分析
11、汽车安全驾驶
总的一句话,很牛逼,功能非常强大(估计可以把pillow吊起来打,我没怎么用过)
相对来说,pillow功能少,简单
补充:lambda函数又叫做“匿名函数”
简要介绍
在Python中,定义函数使用的是def + 函数名。但是通过lambda关键字来定义的函数不需要提供名称,因此称之为“匿名函数”。(类似于JavaScript 中的匿名函数)
函数的语法如下:
lambda 参数: 表达式
im.point(lambda i: i*3)
函数用法如下:
①先写lambda关键字,②然后依次写匿名函数的参数,多个参数之间用逗号连接,③接着是一个冒号,④冒号后面写的是返回的表达式。
常见用法
# 函数调用
a = lambda i:i+3
a(2) # 5
# 也可以不要a
(lambda i:i+3)(2) # 5
# 多参数传入
a = lambda x,y: x*y
a(2,5) # 10
# 带分支的lambda函数
有时候我们可以根据给定的参数,来判断接下来需要做什么,这就需要匿名函数结合分支表达式使用了。
a = lambda x: x-1 if x > 5 else x+1
d(9) # 8
d(3) # 4
个人感受
可能是我不太熟悉的原因吧,感觉与python中的列表生成式有一点相似
# 例如
[x * x for x in range(1, 11)]
[x * x for x in range(1, 11) if x % 2 == 0]
# 比如说,前面说过的有关lambda的语句,我不熟悉point,所以不知道这是怎么传值的
im.point(lambda i: i*3)
# 改成下面这句
im。point([i*3 for i in range(256)])
嗯,确实还是不太一样的
明天开始写爬虫spider