图像处理库PIL与OpenCV
多数图像处理与操作技术可以被两个库有效完成,它们是Python 图形库 (Python Imaging Library,PIL) 与 开源计算机视觉 (OpenSource Computer Vision,OpenCV)。
Python 图形库
Python Imaging Library ,或者叫PIL,简略来说, 是Python图像操作的核心库。不幸的是,它的开发陷入了停滞,最后一次更新是2009年。
幸运的是,存在一个活跃的PIL开发分支,叫做 Pillow 它很容易安装,运行在各个操作系统上,而且支持Python3。
###安装
$ pip install Pillow
###例子
from PIL import Image, ImageFilter
#读取图像
im = Image.open( 'image.jpg' )
#显示图像
im.show()
#过滤图像
im_sharp = im.filter( ImageFilter.SHARPEN )
#保存过滤过的图像到文件中
im_sharp.save( 'image_sharpened.jpg', 'JPEG' )
#分解图像到三个RGB不同的通道(band)中。
r,g,b = im_sharp.split()
PIL中所涉及的基本概念
通道(bands)、模式(mode)、尺寸(size)、坐标系统(coordinate system)、调色板(palette)、信息(info)和滤波器(filters)。
- 通道(bands)
每张图片都是由一个或者多个数据通道构成。PIL允许在单张图片中合成相同维数和深度的多个通道。
以RGB图像为例,每张图片都是由三个数据通道构成,分别为R、G和B通道。而对于灰度图像,则只有一个通道。
对于一张图片的通道数量和名称,可以通过getbands()来获取。getbands()是Image模块的方法,它会返回一个字符串元组(tuple)。该元组将包括每一个通道的名称。
>>>from PIL import Image
>>>im= Image.open('./test/img/1.jpg')
>>>im.getbands()
('R', 'G', 'B')
>>>im_bands = im.getbands()
>>>len(im_bands)
3
>>>im_bands[0]
R
>>>im_bands[1]
G
>>>im_bands[2]
B
- 模式(mode)
图像的模式定义了图像的类型和像素的位宽。
1:1位像素,表示黑和白,但是存储的时候每个像素存储为8bit。
L:8位像素,表示黑和白。
P:8位像素,使用调色板映射到其他模式。
RGB:3x8位像素,为真彩色。
RGBA:4x8位像素,有透明通道的真彩色。
CMYK:4x8位像素,颜色分离。
YCbCr:3x8位像素,彩色视频格式。
I:32位整型像素。
F:32位浮点型像素。
PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)。
可以通过mode属性读取图像的模式。其返回值是包括上述模式的字符串。
>>> from PIL import Image
>>> im =Image.open('./test/img/1.jpg')
>>> im.mode
'RGB'
- 尺寸(size)
通过size属性可以获取图片的尺寸。这是一个二元组,包含水平和垂直方向上的像素数。
>>>from PIL import Image
>>>im =Image.open('./test/img/1.jpg')
>>>im.size # w,h = im.size
(800, 450)
>>>im_size = im.size
>>>im_size[0] #width
800
>>>im_size[1] #height
450
- 坐标系统(coordinate system)
PIL使用笛卡尔像素坐标系统,坐标(0,0)位于左上角。
注意:坐标值表示像素的角;位于坐标(0,0)处的像素的中心实际上位于(0.5,0.5)。
坐标经常用于二元组(x,y)。长方形则表示为四元组,前面是左上角坐标。
例如,一个覆盖800x600的像素图像的长方形表示为(0,0,800,600)。 - 调色板(palette)
调色板模式 (“P”)使用一个颜色调色板为每个像素定义具体的颜色值。 - 信息(info)
使用info属性可以为一张图片添加一些辅助信息。这个是字典对象。加载和保存图像文件时,多少信息需要处理取决于文件格式。
>>>from PIL import Image
>>>im =Image.open('./test/img/1.jpg')
>>>im_info = im.info
>>>im_info
{'jfif_version':(1, 1), 'jfif': 257, 'jfif_unit': 1, 'jfif_density': (96, 96), 'dpi': (96, 96)}
>>>im_info['jfif_version']
(1, 1)
>>>im_info['jfif']
257
- 滤波器(filters)
对于将多个输入像素映射为一个输出像素的几何操作,PIL提供了4个不同的采样滤波器:
NEAREST:最近滤波。从输入图像中选取最近的像素作为输出像素。它忽略了所有其他的像素。
BILINEAR:双线性滤波。在输入图像的2x2矩阵上进行线性插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
BICUBIC:双立方滤波。在输入图像的4x4矩阵上进行立方插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
ANTIALIAS:平滑滤波。这是PIL 1.1.3版本中新的滤波器。对所有可以影响输出像素的输入像素进行高质量的重采样滤波,以计算输出像素值。在当前的PIL版本中,这个滤波器只用于改变尺寸和缩略图方法。
注意:在当前的PIL版本中,ANTIALIAS滤波器是下采样(例如,将一个大的图像转换为小图)时唯一正确的滤波器。BILIEAR和BICUBIC滤波器使用固定的输入模板,用于固定比例的几何变换和上采样是最好的。
Image模块中的方法resize()和thumbnail()用到了滤波器。
方法resize()的定义为:resize(size, filter=None)=> image
>>>from PIL import Image
>>> im= Image.open('./test/img/1.jpg')
>>>im.size
(800, 450)
>>>im_resize = im.resize((256,256))
>>> im_resize.size
(256, 256)
对参数filter不赋值的话,方法resize()默认使用NEAREST滤波器。如果要使用其他滤波器可以通过下面的方法来实现:
>>>im_resize0 = im.resize((256,256), Image.BILINEAR)
>>>im_resize0.size
(256, 256)
Image 类的 thumbnail() 方法可以用来制作缩略图
thumbnail ()的定义为:im.thumbnail(size, filter=None)
>>>from PIL import Image
>>> im= Image.open('./test/img/1.jpg')
>>>im.size
(800, 450)
>>>im.thumbnail((200,200))
>>>im.size
(200,112)
方法thumbnail()需要保持宽高比,对于size=(200,200)的输入参数,其最终的缩略图尺寸为(200, 112)。
对参数filter不赋值的话,方法thumbnail()默认使用NEAREST滤波器。如果要使用其他滤波器可以通过下面的方法来实现:
>>> im= Image.open('./test/img/1.jpg')
>>>im.size
(800, 450)
>>> im.thumbnail((200,200),Image.BILINEAR)
>>> im.size
(200, 112)
开源计算机视觉(OpenCv)
OpenSource Computer Vision,其更广为人知的名字是OpenCv,是一个在图像操作与处理上比PIL更先进的库。它可以在很多语言上被执行并被广泛使用。
###安装
在Python中,使用OpenCV进行图像处理是通过使用 cv2 与 NumPy 模块进行的。
OpenCV 安装指南
NumPy可以从Python Package Index (PyPI)中下载:
$ pip install numpy
例子
import cv2
#读取图像
img = cv2.imread('testimg.jpg')
#显示图像
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#Applying Grayscale filter to image 作用Grayscale(灰度)过滤器到图像上
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#保存过滤过的图像到新文件中
cv2.imwrite('graytest.jpg',gray)
版权声明:本文为LYKXHTP原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。