2021-07-24

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值