Python图像处理入门_python ax(1)

在这里插入图片描述

感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:

① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

1.1.3 图像处理的应用

图像处理的典型应用包括医学/生物领域(如X射线和CT扫描)、计算摄影(Photoshop)、指纹认证、人脸识别等。

1.2 图像处理流程

图像处理流程的基本步骤如下。

**(1)图像的获取与存储。**获取图像(如使用相机获取),并以文件的形式(如JPEG文件)存储在某些设备(如硬盘)上。

**(2)加载至内存并存盘。**从磁盘读取图像数据至内存,使用某种数据结构(如numpy ndarray)作为存储结构,之后将数据结构序列化到一个图像文件中,也可能是对图像上运行了算法之后。

**(3)操作、增强和复原。**需运行预处理算法完成如下任务。

① 图像转换(采样和操作,如灰度转换);

② 图像质量增强(滤波,如图像由模糊变清晰);

③ 图像降噪,图像复原。

**(4)图像分割。**为了提取感兴趣的对象,需要对图像进行分割。

**(5)信息提取/表示。**图像需以其他形式表示,如表示为以下几项。

① 一些可从图像中计算出来的手工标识的特征描述符(如HOG描述符、经典图像处理)。

② 一些可自动从图像中学习的功能(例如,在深度学习神经网络的隐藏层中学到权重和偏差值)。

③ 以另一种表示方法表示图像。

**(6)图像理解/图像解释。**以下表示形式可用于更好地理解图像。

① 图像分类(例如,图像是否包含人类对象)。

② 对象识别(例如,在带有边框的图像中查找car对象的位置)。

图像处理流程如图1-3所示。

img

图1-3 图像处理流程

用于各种图像处理任务的不同模块如 图1-4所示。除此之外,还会用到以下图像处理模块:

  • (1)scipy.ndimage和opencv用于不同图像处理;
  • (2)scikit-learn用于经典的机器学习;
  • (3)tensorflow和keras用于深度学习。

img

图1-4 用于图像处理任务的不同模块

1.3 在Python中安装不同的图像处理库

后续将介绍如何安装不同的图像处理库,并为用Python经典图像处理技术进行图像处理编程设置环境。在本书的最后一些章节使用基于深度学习的方法时,需要使用不同的设置。

1.3.1 安装pip

用pip(或pip3)工具安装图像处理库。因此,如果还没安装它,先安装pip。如果使用从http://python.org下载的Python 3 >=3.4,或者已工作在由virtualenv或pyvenv创建的虚拟环境中,则说明pip已经安装好了,只需要确保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
from skimage.transform 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 <class 'PIL.PngImagePlugin.PngImageFile'>
im.show() # display the image

运行上述代码,输出结果如图1-5所示,从文件中读取图像,然后再将图像显示在屏幕上。

img

图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所示,输出的是鹦鹉的灰度图像。

img

图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 <class 'numpy.ndarray'>
plt.figure(figsize=(10,10))
plt.imshow(im) # display the image
plt.axis('off')
plt.show()

运行上述代码,输出结果如图1-7所示。

img

图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所示。

img

图1-8 较暗的山峰图像

使用matplotlib imshow()在显示时插值

matplotlib中的imshow()函数提供了多种不同类型的插值方法用以对图像进行绘制。当被绘制的图像很小时,这些方法特别有用。通过图1-9所示的尺寸为50×50的Lena图像来查看用不同插值方法绘制图像的效果。

img

图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)
plt.tight_layout()
plt.show()

运行上述代码,输出结果如图1-10所示。

img

图1-10 使用不同插值方法对Lena图像进行处理的效果

1.4.3 使用scikit-image读取、保存和显示图像

以下代码演示了如何用scikit-image中的imread()函数读取numpy ndarray中的图像。图像类型为uint8(8位无符号整数),因此图像像素值是介于0和255之间的数。然后,用hsv2rgb()函数从Image.color模块将彩色RGB图像转换为HSV图像(更改图像类型或模式,本书稍后讨论)。接下来,将所有像素点的饱和度(色彩)更改为常量值,但色调和值通道保持不变。这样,图像就被rgb2hsv()函数转换回了RGB模式,以创建新图像,并保存和显示图像。

im = imread("../images/parrot.png") # read image from disk, provide the
correct path
print(im.shape, im.dtype, type(im))
# (362, 486, 3) uint8 <class 'numpy.ndarray'>
hsv = color.rgb2hsv(im) # from RGB to HSV color space
hsv[:, :, 1] = 0.5 # change the saturation
im1 = color.hsv2rgb(hsv) # from HSV back to RGB
imsave('../images/parrot_hsv.png', im1) # save image to disk
im = imread("../images/parrot_hsv.png")
plt.axis('off'), imshow(im), show()

运行上述代码,输出结果如图1-11所示,这是一张饱和度发生变化的鹦鹉新图像。

img

图1-11 饱和度发生了变化的鹦鹉新图像

还可以用scikit-image的viewer模块在弹出窗口中显示图像,代码如下:

viewer = viewer.ImageViewer(im)
viewer.show()

使用scikit-image的astronaut数据集

以下代码显示了如何使用data模块从scikit-image库的图像数据集中加载(宇航员astronaut)图像。该模块包含一些其他流行的数据集,如cameraman数据集,可以用类似的方法加载。

im = data.astronaut()
imshow(im), show()

运行上述代码,输出结果如图1-12所示。

img

图1-12 使用data模块加载宇航员图像

一次性同时读取和显示多个图像

可以用scikit-image的io模块中的imread_collection()函数将文件名中具有特定模式的所有图像加载到一个文件夹中,并用imshow_collection()函数同时显示它们。具体代码实现留给读者作为练习。

1.4.4 使用SciPy的misc模块读取、保存和显示图像

SciPy的misc模块也可用于图像的输入/输出和显示。下面将演示如何使用misc模块的函数。

使用misc的face数据集

以下代码展示了如何显示misc模块的face数据集:

im = misc.face() # load the raccoon's face image
misc.imsave('face.png', im) # uses the Image module (PIL)
plt.imshow(im), plt.axis('off'), plt.show()

运行上述代码,输出结果如图1-13所示,即显示了misc模块的face图像。

img

如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值