PIL

PIL/Pillow/Imageio


PILPillow只提供最基础的数字图像处理,功能有限。
opencv实际上是一个c++库,提供了python接口。
scikit-image是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理,与matlab类似


PythonWare 公司提供了免费的图像处理工具包 PIL (Python Image Library), 该软件包提供了基本的图像处理功能,如:

改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等。虽然在这个软件包上要实现类似 MATLAB 中的复杂的图像处理算法并不太适合,但是 Python 的快速开发能力以及面向对象等等诸多特点使得它非常适合用来进行原型开发。

Pillow 是 PIL 的替代版本,PIL 软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等。

Pillow 为了解决 PIL 的两个问题:
1. 不兼容 setuptools
2. 报告的问题太多,而更新太慢


示例1:

下面代码,可以将gif动图中的每帧图片导出来、显示其中一帧图片的mode、size:

from PIL import Image, ImageSequence

im = Image.open("com/FY3E_first_wind.gif")

# 读取gif图片
img = ImageSequence.Iterator(im)
# 输出第11帧图片的mode、size
print(img[10].mode, "/", img[10].size)

# 建立图片缓存空间数组
image_list = []
index = 0
for frame in ImageSequence.Iterator(im):
index = index + 1
image_list.append(frame)  # 将每帧图片累加入数组里
# 保存每帧图片:
# frame.save("frame%d.png" % index)

# 输出第2帧图片的size、图片数组大小,即gif图片的帧数
print(image_list[1].size)
print(len(image_list))



示例2:读取gif动画信息


from PIL import Image

# 读取gif图片
im = Image.open("com/FY3E_first_wind.gif")

# 读取gif动图的信息
print(im.info)
# print((im.info)['duration'])

结果:{'version': b'GIF89a', 'background': 31, 'duration': 80, 'extension': (b'NETSCAPE2.0', 795), 'loop': 0}


示例3:PIL库中Image类thumbnail方法和resize方法的比较

resize()方法可以缩小也可以放大,而thumbnail()方法只能缩小;
resize()方法不会改变对象的大小,只会返回一个新的Image对象,而thumbnail()方法会直接改变对象的大小,返回值为none;
resize()方法中的size参数直接规定了修改后的大小,而thumbnail()方法按比例缩小,size参数只规定修改后size的最大值。


from PIL import Image

im = Image.open("img/ImageCover_result.png")
x, y = im.size
print("原图像im大小为:", x, y)

im.resize((128, 128))
print(im.size)
reim = im.resize((128, 128))
print("resize后的图像reim大小为:", reim.size)
print("resize后的图像im大小为:", im.size)

im.thumbnail((128, 128))
print("thumbnail后的图像im大小为:", im.size)


Imageio

imageio是一个处理图像的接口



示例:


import imageio.v3 as iio

# 直接读取imageio自带的图片库
im = iio.imread('imageio:chelsea.png')
print(im.shape)  # 结果:(300, 451, 3)

im_r = im.copy()
im_g = im.copy()
im_b = im.copy()

im_r[:, :, 1] = 0
im_r[:, :, 2] = 0

iio.imwrite('test-r.jpg', im_r)

im_g[:, :, 0] = 0
im_g[:, :, 2] = 0

iio.imwrite('test-g.jpg', im_g)

im_b[:, :, 0] = 0
im_b[:, :, 1] = 0

iio.imwrite('test-b.jpg', im_b)

结果:(300, 451, 3),指是图片的像素,高度是300像素,宽度是451像素,颜色通道是3,即RGB,分别为红色、绿色、蓝色,所以这张猫咪的图片数字化之后,存储的是每一个像素的RGB值。


skimage

skimage包的全称是scikit-image SciKit (toolkit for SciPy) ,它对scipy.ndimage进行了扩展,提供了更多的图片处理功能。它是由python语言编写的,由scipy 社区开发和维护。


OpenCV

OpenCV (Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。OpenCV的建立是为了为计算机视觉应用程序提供一个通用的基础设施,并加速在商业产品中使用机器感知。作为bsd许可的产品,OpenCV使企业可以很容易地利用和修改代码。

该库有超过2500个优化算法,其中包括经典和最先进的计算机视觉和机器学习算法的综合集。这些算法可以用来检测和识别人脸、识别物体、对视频中的人类动作进行分类、跟踪相机运动、跟踪移动的物体、提取物体的3D模型、从立体相机中生成3D点云、将图像拼接在一起生成整个场景的高分辨率图像、从图像数据库中查找相似的图像、从使用闪光灯拍摄的图像中去除红眼、跟踪眼球运动、识别风景并建立标记,以增强现实覆盖它等。


参考资料:

利用python对gif图片进行压缩处理,简单案例
PIL库中Image类thumbnail方法和resize方法的比较




BypInformation