pythonimread函数_Python图像处理⼊门
图像处理,顾名思义,可以简单地定义为利⽤计算机算法(通过代码)对图像进⾏分析、操作的处理。它包括如下不同的⼏个⽅⾯:图像的存储、表⽰、信息提取、操作、增强、恢复和解释。本章将对图像处理技术的各个⽅⾯进⾏基本介绍,并介绍使⽤Python库进⾏图像处理实践编程。本书中的所有⽰例代码都基于Python 3编写。
本章⾸先定义什么是图像处理以及图像处理的应⽤是什么;其次介绍图像处理的基本流程,即在计算机上处理图像的⼀般步骤;再次介绍⽤于图像处理的不同Python库及如何在Python 3下安装它们;接下来介绍如何使⽤不同的库编写Python代码读写(存储)图像;之后介绍基于Python表⽰图像的数据结构以及如何显⽰图像;最后介绍不同的图像类型和不同的图像⽂件格式以及如何由Python执⾏基本的图像操作。
在本章的最后,要求读者能够概念化图像处理、图像处理步骤和图像处理应⽤;要求掌握能够从不同的Python图像处理库导⼊和调⽤函数;要求能够理解Python中存储不同图像类型的数据结构,使⽤不同的Python库读写图像⽂件,以及利⽤Python库编写Python代码来执⾏基本图像操作。
本章主要包括以下内容:什么是图像处理及图像处理的应⽤;
图像处理流程;
在Python中安装不同的图像处理库;
使⽤Python进⾏图像输⼊/输出和显⽰;
处理不同的图像类型、⽂件格式并执⾏基本的图像操作。
1.1 什么是图像处理及图像处理的应⽤
什么是图像?它是如何存储在计算机⾥的?⽤Python编程如何处理?
1.1.1 什么是图像以及图像是如何存储的
从概念上讲,形式最简单的图像(单通道,例如⼆值或单⾊,灰度或⿊⽩图像)是⼀个⼆维函数f(x,y),即将坐标点映射到表⽰亮度/颜⾊相关的整数/实数。点称为像素或图像基本单位(图像元素)。⼀幅图像可以有多个通道(例如,对于彩⾊RGB图像,可以使⽤颜⾊表⽰三通道——红、绿、蓝)。彩⾊RGB图像的像素点(x,y)可以表⽰为三元组(rx,y, gx,y, bx,y)。
为了能够在计算机上描述图像,对于图像f(x,y),必须在空间和振幅两⽅⾯进⾏数字化。空间坐标(x,y)的数字化称为图像抽样,振幅数字化称为灰度量化。在计算机中,通常将像素通道所对应的值表⽰为整数(0~255)或浮点数(0~1)。可以将图像存储为不同类型(格式)的⽂件。每个⽂件通常包括元数据和多维数
组的数据(例如,⼆值或灰度图像的⼆维数组,RGB和YUV彩⾊图像的三维数组)。图1-1描述了如何将图像数据存储为不同类型图像的数组,正如图中所⽰,对于灰度图像,⽤“宽度×⾼度”(⼆维数组)的模式⾜以存储,⽽对于RGB图像,则需要⽤“宽度×⾼度×3”(三维数组)的模式存储。
图1-1 图像的存储
⼆值、灰度和RGB图像如图1-2所⽰。
图1-2 ⼆值、灰度和RGB图像
本书重点讨论图像数据的处理,⽤Python库实现从图像中提取数据,并运⽤算法进⾏图像处理。样本图像均取⾃互联⽹——伯克利图像分割数据集、基准数据集,以及USC-SIPI图像数据库,其中⼤多都是⽤于图像处理的标准图像。
1.1.2 什么是图像处理
图像处理是指在计算机上使⽤算法和代码⾃动处理、操作、分析和解释图像,它⼴泛应⽤于诸多学科和领域,如电视、摄影、机器⼈、遥感、医学诊断和⼯业检验。像⼤众所熟知的Facebook和Instagram社交⽹站,⾯临⽤户每天都会上传⼤量图⽚的情况,它们是⾏业的典型案例,需要使⽤图像处理算法或对图像处理算法进⾏创新来处理上传的图⽚。
在本书中,我们⽤Python包来处理图像:⾸先,⽤⼀组库来做经典的图像处理——提取图像数据,⽤库函数的算法将数据转换为预处理、增强、复原、表⽰(⽤描述符)、分割、分类、检测和识别(对象),从⽽更好地分析、理解和解释数据;其次,我们⽤另⼀组库进⾏基于深度学习的图像处理——这种技术近年来变得⾮常热门。
1.1.3 图像处理的应⽤
图像处理的典型应⽤包括医学/⽣物领域(如X射线和CT扫描)、计算摄影(Photoshop)、指纹认证、⼈脸识别等。
1.2 图像处理流程
图像处理流程的基本步骤如下。
(1)图像的获取与存储。获取图像(如使⽤相机获取),并以⽂件的形式(如JPEG⽂件)存储在某些设备(如硬盘)上。
(2)加载⾄内存并存盘。从磁盘读取图像数据⾄内存,使⽤某种数据结构(如numpy ndarray)作为存储结构,之后将数据结构序列化到⼀个图像⽂件中,也可能是对图像上运⾏了算法之后。
(3)操作、增强和复原。需运⾏预处理算法完成如下任务。
① 图像转换(采样和操作,如灰度转换);
② 图像质量增强(滤波,如图像由模糊变清晰);
③ 图像降噪,图像复原。
(4)图像分割。为了提取感兴趣的对象,需要对图像进⾏分割。
(5)信息提取/表⽰。图像需以其他形式表⽰,如表⽰为以下⼏项。
① ⼀些可从图像中计算出来的⼿⼯标识的特征描述符(如HOG描述符、经典图像处理)。
② ⼀些可⾃动从图像中学习的功能(例如,在深度学习神经⽹络的隐藏层中学到权重和偏差值)。
③ 以另⼀种表⽰⽅法表⽰图像。
(6)图像理解/图像解释。以下表⽰形式可⽤于更好地理解图像。
① 图像分类(例如,图像是否包含⼈类对象)。
② 对象识别(例如,在带有边框的图像中查car对象的位置)。
图像处理流程如图1-3所⽰。
图1-3 图像处理流程
⽤于各种图像处理任务的不同模块如 图1-4所⽰。除此之外,还会⽤到以下图像处理模块:(1)scipy.ndimage和opencv⽤于不同图像处理;
(2)scikit-learn⽤于经典的机器学习;
(3)tensorflow和keras⽤于深度学习。
图1-4 ⽤于图像处理任务的不同模块
1.3 在Python中安装不同的图像处理库
后续将介绍如何安装不同的图像处理库,并为⽤Python经典图像处理技术进⾏图像处理编程设置环境。在本书的最后⼀些章节使⽤基于深度学习的⽅法时,需要使⽤不同的设置。
1.3.1 安装pip
1.3.2 在Python中安装图像处理库
Python有许多库可⽤于图像处理,如numpy、scipy、scikit-image、PIL(Pillow)、OpenCV、scikit-learn、SimpleITK和matplotlib。
matplotlib库主要⽤于图像显⽰,⽽numpy主要⽤于图像存储,scikit-learn库构建⽤于图像处理的机器学习模型,scipy主要⽤于图像增强,scikit-image、mahotas和opencv库⽤于不同的图像处理算法。
以下代码展⽰了通过Python提⽰符(交互模式),如何下载安装所需的库:
>>> pip install numpy
>>> pip install scipy
>>> pip install scikit-image
>>> pip install scikit-learn
>>> pip install pillow
>>> pip install SimpleITK
>>> pip install opencv-python
>>> pip install matplotlib
如果操作系统平台不同,可能还会⽤到⼀些附加的安装说明。读者应该浏览⽂档站点来获取每个库在特定平台详细安装库的说明。此外,读者应该熟悉stack overflow等⽹站,以解决不同平台依赖安装库的问题。
最后,可以通过Python提⽰符导⼊库来验证库是否安装正确。如果库成功导⼊(没有抛出错误消息),那么安装没有问题。可以将安装的库的版本打印到控制台。
scikit-image和PIL Python库的版本如下⾯的代码所⽰:
>>> import skimage, PIL, numpy
>>> print(skimage.__version__)
# 0.14.0
>>> PIL.__version__
# 5.1.0
>>> numpy.__version__
# 1.14.5
要确保所有库为最新版本。
1.3.3 安装Anaconda发⾏版
请下载并安装最新版本的Anaconda发⾏版,以免去直接安装众多的Python包的⿇烦。
1.3.4 安装Jupyter笔记本
如果⽤Jupyter笔记本来编写Python代码,需要先通过python提⽰符安装jupyter包,即⾸先使⽤>>>pip install jupyter,然后使⽤
>>>jupyter notebook,在浏览器中启动Jupyter Notebook应⽤程序。在应⽤程序中就可以创建新的Python笔记本并选择内核了。如果使⽤的是Anaconda,就不需要显式安装Jupyter,因为最新的Anaconda发⾏版本附带了Jupyter。
1.4 使⽤Python进⾏图像输⼊/输出和显⽰
由于图像是作为⽂件存储在磁盘上的,因此从⽂件中读取和写⼊图像是磁盘输⼊/输出操作。可以通过多种⽅式使⽤不同的库完成这些任务,本节给出了其中⼀些⽅式。从导⼊所有必需的包开始,代码如下。
# for inline image display inside notebook
# % matplotlib inline
import numpy as np
from PIL import Image, ImageFont, ImageDraw
from PIL.ImageChops import add, subtract, multiply, difference, screen
import PIL.ImageStat as stat
from skimage.io import imread, imsave, imshow, show, imread_collection,
imshow_collection
from skimage import color, viewer, exposure, img_as_float, data
ansform import SimilarityTransform, warp, swirl
from skimage.util import invert, random_noise, montage
import matplotlib.image as mpimg
import matplotlib.pylab as plt
from scipy.ndimage import affine_transform, zoom
from scipy import misc
1.4.1 使⽤PIL读取、保存和显⽰图像
PIL的open() 函数⽤于从Image对象的磁盘读取图像,如下⾯的代码所⽰。图像作为PIL.PngImagePlugin.PngImageFile类的对象加载,读者可以⽤宽度、⾼度和模式等属性来查图像的⼤⼩[宽度×⾼度(像素)或分辨率]和模式。
im = Image.open("../images/parrot.png") # read the image, provide the correct path
print(im.width, im.height, im.mode, im.format, type(im))
# 453 340 RGB PNG
im.show() # display the image
运⾏上述代码,输出结果如图1-5所⽰,从⽂件中读取图像,然后再将图像显⽰在屏幕上。
图1-5 读取的鹦鹉图像
⽤PIL函数convert()将彩⾊RGB图像转换为灰度图像,代码如下:
im_g = im.convert('L') # convert the RGB color image to a grayscale image
im_g.save('../images/parrot_gray.png') # save the image to disk
Image.open("../images/parrot_gray.png").show() # read the grayscale image from disk and show
运⾏上述代码,结果如图1-6所⽰,输出的是鹦鹉的灰度图像。
图1-6 输出鹦鹉的灰度图像
提供磁盘上图像的正确路径
建议创建⼀个⽂件夹(⼦⽬录)来存储要处理的图像(例如,对于Python代码⽰例,建议读者使⽤名为images的⽂件夹来存储图像),然后提供⽂件夹的路径以访问图像,以免出现“不到⽂件”的异常。
1.4.2 使⽤matplotlib读取、保存和显⽰图像
接下来演⽰如何使⽤matplotlib.image中的imread()函数来读取浮点numpy ndarray中的图像,其中,像素值表⽰为介于0和1之间的真值。代码如下:
im = mpimg.imread("../images/hill.png") # read the image from disk as a
numpy ndarray
print(im.shape, im.dtype, type(im)) # this image contains anα
channel, hence num_channels= 4
# (960, 1280, 4) float32
python 定义数组plt.figure(figsize=(10,10))
plt.imshow(im) # display the image
plt.axis('off')
plt.show()
运⾏上述代码,输出结果如图1-7所⽰。
图1-7 ⽤imread()函数读取的⼭峰图像
接下来展⽰如何将图像更改为较暗的图像。⾸先将所有像素值设置为0~0.5之间的数,然后将numpy ndarray保存到磁盘。保存的图像将重新加载并显⽰。代码如下:
im1 = im
im1[im1 < 0.5] = 0 # make the image look darker
plt.imshow(im1)
plt.axis('off')
plt.tight_layout()
plt.savefig("../images/hill_dark.png") # save the dark image
im = mpimg.imread("../images/hill_dark.png") # read the dark image
plt.figure(figsize=(10,10))
plt.imshow(im)
plt.axis('off') # no axis ticks
plt.tight_layout()
plt.show()
运⾏上述代码,输出结果为较暗的⼭峰图像,如图1-8所⽰。
图1-8 较暗的⼭峰图像
使⽤matplotlib imshow()在显⽰时插值
matplotlib中的imshow()函数提供了多种不同类型的插值⽅法⽤以对图像进⾏绘制。当被绘制的图像很⼩时,这些⽅法特别有⽤。通过图1-9所⽰的尺⼨为50×50的Lena图像来查看⽤不同插值⽅法绘制图像的效果。
图1-9 Lena图像
如下代码演⽰了如何通过imshow()使⽤不同的插值⽅法:
im = mpimg.imread("../images/lena_small.jpg") # read the image from disk as
a numpy ndarray
methods = ['none', 'nearest', 'bilinear', 'bicubic', 'spline16', 'lanczos']
fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(15, 30),subplot_kw={'xticks': [],
'yticks': []})
fig.subplots_adjust(hspace=0.05, wspace=0.05)
for ax, interp_method in zip(axes.flat, methods):
ax.imshow(im, interpolation=interp_method)
ax.set_title(str(interp_method), size=20)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。