基本的图像操作和处理示例(Python语言)

本文使用Python的一些工具包(PIL、Matplotlib、Numpy以及SciPy)进行了简单的图像处理。下面会简单介绍这些工具包的功能及示例。

1.1 PIL:Python图像处理类库

PIL(Python Imaging Library)提供了通用的图像处理功能,以及大量有用的基本图像操作,如图像缩放、旋转、裁剪、颜色转换等。(PIL的下载地址:http://www.pythonware.com/products/pil/)

下面的例子是用PIL库实现将一张彩色图像转成灰度图像、复制图像并进行旋转变换再拷贝到原来的图像上、调整图像尺寸及旋转等基本的图像处理操作。

from PIL import Image
from pylab import *

# 显示原图
pil_im = Image.open('../Pictures/04.jpg')
subplot(231)
title('original image')
axis('off') #不显示图像的坐标轴
imshow(pil_im)

# 显示灰度图
pil_im = Image.open('../Pictures/04.jpg').convert('L')
gray()
subplot(232)
title('gray image')
axis('off')
imshow(pil_im)

#拷贝粘贴区域
pil_im = Image.open('../Pictures/04.jpg')
box = (100,100,400,400)
region = pil_im.crop(box) #将图像拷贝到指定区域
region = region.transpose(Image.ROTATE_180) #对图像进行旋转变换
pil_im.paste(region,box)
subplot(233)
title('copy image')
axis('off')
imshow(pil_im)

# 缩略图
pil_im = Image.open('../Pictures/04.jpg')
size = 32,64
pil_im.thumbnail(size) #将图像缩成指定大小
subplot(234)
title('thumbnail image')
axis('off')
imshow(pil_im)
pil_im.save('../Pictures/05.jpg') #保存缩略图

# 调整图像尺寸
pil_im = Image.open('../Pictures/04.jpg')
pil_im = pil_im.resize(size)
subplot(235)
title('resize image')
axis('off')
imshow(pil_im)

# 旋转图像45°
pil_im = Image.open('../Pictures/04.jpg')
pil_im = pil_im.rotate(45)
subplot(236)
title('rotate 45°')
axis('off')
imshow(pil_im)

show()

运行代码得到的结果如下:
基本的图像操作和处理示例(Python语言)_第1张图片

1.2 Matplotlib库

当在处理数学及绘图或在图像上描点、画直线、曲线时,Matplotlib是一个很好的绘图库,具有比PIL更强大的绘图功能。Matplotlib中的PyLab接口包含很多方便用户创建图像的函数。(Matplotlib的下载地址: http://matplotlib.sourceforge.net/)

下面是用Matplotlib库绘制出图像的轮廓和直方图。

from PIL import Image
from pylab import *

figure()
subplot(121)
im = array(Image.open('../Pictures/04.jpg').convert('L'))
gray()
contour(im, origin='image')
axis('equal')
axis('off')
title('image edge')

subplot(122)
hist(im.flatten(), 128)
plt.xlim([0,260])
plt.ylim([0,11000])

show()

运行上面代码,可以得到下面的结果:
基本的图像操作和处理示例(Python语言)_第2张图片

1.3 NumPy库

NumPy是Python一个流行的用于科学计算包。它包含了很多诸如矢量、矩阵、图像等其他非常有用的对象和线性代数函数。NumPy中的数组对象可以帮助你实现数组中重要操作,如矩阵乘积、转置、向量乘积和归一化等。(NumPy的下载地址:http://www.scipy.org/Download)

在前面载入图像的示例中,我们将图像用array()函数转为NumPy数组对象,但是并没有提到它表示的含义。数组就像列表一样,只不过它规定了数组中的所有元素必须是相同的类型。在读入图像到NumPy数组后,就可以对它进行任何我们想要的操作了。前面已经对图像进行了灰度变换,现在要举一个极其有用的例子——灰度变换后进行直方图均衡化。通过直方图均衡化可以增加图像对比度。下面是对图像直方图进行均衡化处理的例子:

from PIL import Image
from pylab import *
from numpy import *
from PCV.tools import imtools


im = array(Image.open('../Pictures/04.jpg').convert('L'))  # 打开图像,并转成灰度图像
im2, cdf = imtools.histeq(im)

figure()
subplot(2, 2, 1)
axis('off')
gray()
title('Original image')
imshow(im)

subplot(2, 2, 2)
axis('off')
title('Equalized image')
imshow(im2)

subplot(2, 2, 3)
title('Original histogram')
hist(im.flatten(), 128, normed=True)

subplot(2, 2, 4)
title('Equilibrium histogram')
hist(im2.flatten(), 128, normed=True)

show()

运行结果:
基本的图像操作和处理示例(Python语言)_第3张图片

1.4 SciPy库

SciPy是建立在NumPy的基础上,用于数值运算的开源工具包。它提供了很多有效的常规操作,包括数值综合、最优化、统计、信号处理以及图像处理。SciPy库包含了很多有用的模块,接下来只展示部分功能。(SciPy的下载地址:http://scipy.org/Download )

一个非常经典的图像卷积例子是对图像进行高斯模糊(即高斯滤波)。高斯模糊可以用于定义图像尺度、计算兴趣点以及很多其他的应用场合。下面是对图像进行高斯滤波的例子:

from PIL import Image
from pylab import *
from scipy.ndimage import filters


im = array(Image.open('../Pictures/04.jpg').convert('L'))

figure()
gray()
axis('off')
subplot(1, 4, 1)
axis('off')
title('original image')
imshow(im)

for bi, blur in enumerate([5, 10, 15]): #不同的标准差,模糊程度不同
  im2 = zeros(im.shape)
  im2 = filters.gaussian_filter(im, blur)
  im2 = np.uint8(im2)
  imNum=str(blur)
  subplot(1, 4, 2 + bi)
  axis('off')
  title('sigma = '+imNum)
  imshow(im2)

show()

运行上面代码,可得出下面的结果:
基本的图像操作和处理示例(Python语言)_第4张图片

Python的工具包介绍到这里就结束了。虽然内容不多,但还是希望对你有帮助。
学习笔记+1 :)

你可能感兴趣的:(python,python,图像处理)