学习python计算机视觉编程,首先就要了解一下图像处理的一些基础知识,本文结合实例介绍一些图像处理的基础知识,如:读取图像、灰度变换、图像转换和缩放、PCA等,包含PIL、Matplotlib、NumPy库和SciPy模块。下面让我们一起来学习一下吧!
注:博主所用的是win10+python2.7
第1章 基本的图像操作和处理
1.1 PIL:Python图像处理类库
PIL(Python Imaging Library,图像处理库)提供了通用的图像处理功能,以及大量有用的基本图像操作,比如图像缩放、裁剪、旋转、颜色转换等。PIL库下载地址[www.pythonware.com/products/pil/]。
下面举一个利用PIL读取图像的例子:
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
figure()
pil_im = Image.open('d:/Eating.jpg')
gray()
subplot(121)
title(u'原图',fontproperties=font)
axis('off')
imshow(pil_im)
pil_im = Image.open('d:/Eating.jpg').convert('L')#将图像转化成灰度图
subplot(122)
title(u'灰度图',fontproperties=font)
axis('off')
imshow(pil_im)
show()
1.1.1 转换图像格式——save()
方法
利用save()
方法,PIL可以将图片保存为很多不同的图像格式。
下面举一个将一个文件夹的jpg图像转换成png图像的例子:
from PCV.tools.imtools import get_imlist #导入原书的PCV模块
from PIL import Image
import os
import pickle
filelist = get_imlist('D:/test/test1') #获取D:/test/test1文件夹下的图片文件名(包括后缀名)
imlist = file('D:/test/imlist.txt','w') #将获取的图片文件列表保存到imlist.txt中
pickle.dump(filelist,imlist) #序列化
imlist.close()
for infile in filelist:
outfile = os.path.splitext(infile)[0] + ".png" #分离文件名与扩展名
if infile != outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print ("cannot convert"), infile
1.1.2 创建缩略图——thumbnail()方法
利用PIL可以很容易的创建缩略图,设置缩略图的大小,并用元组保存起来,调用thumnail()方法即可生成缩略图。
1.1.3 拷贝并粘贴区域——crop()方法
调用crop()方法即可从一幅图像中进行区域拷贝,拷贝出区域后,可以对区域进行旋转等变换。。
1.1.4 调整尺寸及旋转——rotate()方法
要对一幅图像的尺寸进行调整,可以调用resize()方法,元组中放置的便是你要调整尺寸的大小。
下面举一个对图像进行灰度化、拷贝粘贴、缩略图、调整尺度、旋转90度的例子:
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
figure()
# 显示原图
pil_im = Image.open('d:\Eating.jpg')
print (pil_im.mode, pil_im.size, pil_im.format)
subplot(231)
title(u'原图', fontproperties=font)
axis('off')
imshow(pil_im)
# 显示灰度图
pil_im = Image.open('d:\Eating.jpg').convert('L')
gray()
subplot(232)
title(u'灰度图', fontproperties=font)
axis('off')
imshow(pil_im)
#拷贝粘贴区域
pil_im = Image.open('d:\Eating.jpg')
box = (100,100,200,200)
region = pil_im.crop(box)
region = region.transpose(Image.ROTATE_180)
pil_im.paste(region,box)
subplot(233)
title(u'拷贝粘贴区域', fontproperties=font)
axis('off')
imshow(pil_im)
# 缩略图
pil_im = Image.open('d:\Eating.jpg')
size = 64, 64
pil_im.thumbnail(size)
print (pil_im.size)
subplot(234)
title(u'缩略图', fontproperties=font)
axis('off')
imshow(pil_im)
pil_im.save('d:\Eating1.jpg') #保存缩略图
# 调整图像尺寸
pil_im = Image.open('d:\Eating.jpg')
pil_im = pil_im.resize(size)
print (pil_im.size)
subplot(235)
title(u'调整尺寸后的图像', fontproperties=font)
axis('off')
imshow(pil_im)
# 旋转图像90°
pil_im = Image.open('d:\Eating.jpg')
pil_im = pil_im.rotate(90)
subplot(236)
title(u'旋转90°后的图像', fontproperties=font)
axis('off')
imshow(pil_im)
show()
1.2 Matplotlib库
当在处理数学及绘图或在图像上描点、画直线、曲线时,Matplotlib是一个很好的绘图库,它比PIL库提供了更有力的特性。Matplotlib是开源的,可以在[matplotlib.sourceforge.net]上下载,并且它还提供了详细的文档及教程。。
1.2.1 画图、描点和线
虽然Matplotlib可以创建漂亮的条状图、饼图、散点图等,但是在很多计算机视觉应用场合,其实只用到了一些常用的命令。