python图像常规操作


Posted in Python onNovember 11, 2017

使用python进行基本的图像操作与处理

前言:

与早期计算机视觉领域多数程序都是由 C/C++ 写就的情形不同。随着计算机硬件速度越来越快,研究者在考虑选择实现算法语言的时候会更多地考虑编写代码的效率和易用性,而不是像早年那样把算法的执行效率放在首位。这直接导致近年来越来越多的研究者选择 Python 来实现算法。

今天在计算机视觉领域,越来越多的研究者使用 Python 开展研究,所以有必要去学习一下十分易用的python在图像处理领域的使用,这篇博客将会介绍如何使用Python的几个著名的图像处理库完成最基本的图像操作与处理。

使用PIL进行基本图像操作

PIL简介:

PIL(Python Imaging Library Python,图像处理类库)提供了通用的图像处理功能,以及大量有用的基本图像操作,比如图像缩放、裁剪、旋转、颜色转换等。

PIL读取与存储图像:

利用 PIL 中的函数,我们可以从大多数图像格式的文件中读取数据,然后写入最常见的图像格式文件中。PIL 中最重要的模块为 Image 。

下面这个程序我使用PIL读取一张jpg图片将其灰度化之后存为一个png文件:

# -*- coding: utf-8 -*-
from PIL import Image
import os
#打开图像得到一个PIL图像对象
img = Image.open("./source/test.jpg")
#将其转为一张灰度图
img = img.convert('L')
#存储该张图片
try:
  img.save("test.png")
except IOError:
  print "cannot convert"

Test.jpg

python图像常规操作

Test.png

python图像常规操作

PIL生成缩略图:

# -*- coding: utf-8 -*-
from PIL import Image
import os
#打开图像得到一个PIL图像对象
img = Image.open("./source/test.jpg")
#创建最长边为128的缩略图
img.thumbnail((128,128))
#存储该张图片
try:
  img.save("test.png")
except IOError:
  print "cannot convert"

Test.png

python图像常规操作

PIL调整尺寸与旋转:

# -*- coding: utf-8 -*-
from PIL import Image
import os
#打开图像得到一个PIL图像对象
img = Image.open("./source/test.jpg")
#修改图片大小,参数为一元组
img = img.resize((100,200))
#使图片逆时针选择45度
img = img.rotate(45)
#存储该张图片
try:
  img.save("test.png")
except IOError:
  print "cannot convert"

Test.png

python图像常规操作

PIL复制粘贴图像区域:

# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
from PIL import Image
import os
#打开图像得到一个PIL图像对象
img = Image.open("./source/test.jpg")
#从img中裁剪指定区域
region = img.crop((300,300,500,500))
#使裁剪部分逆时针选择145度
region = region.rotate(145)
#将该区域粘贴至指定区域
img.paste(region,(100,100,300,300));
#存储该张图片
try:
  img.save("test.png")
except IOError:
  print "cannot convert"

Test.png

python图像常规操作

元组的使用中,坐标原点为左上角,区域划分如下图所示

python图像常规操作

使用Matplotlib进行基本图像操作

Matplotlib简介:

我们处理数学运算、绘制图表,或者在图像上绘制点、直线和曲线时, Matplotlib是个很好的类库,具有比 PIL 更强大的绘图功能。Matplotlib 可以绘制出较好的条形图、饼状图、散点图等,但是对于大多数计算机视觉应用来说,仅仅需要用到几个绘图命令。比如,我们想用点和线来表示一些事物,比如兴趣点、对应点以及检测出的物体。

使用Matplotlib绘制图像、点、线

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
#打开图像得到一个PIL图像对象
img = Image.open("./source/test.jpg")
# 读取图像到数组中
im = array(img)
# 绘制图像
imshow(im)
# 一些点
x = [100,100,400,400]
y = [200,500,200,500]
# 使用红色星状标记绘制点
plot(x,y,'r*')
# 绘制连接前两个点的线
plot(x[:2],y[:2])
# 添加标题,显示绘制的图像
title('Plotting: "Test.jpg"')
show()

show() 命令首先打开图形用户界面(GUI),然后新建一个图像窗口。该图形用户界面会循环阻断脚本,然后暂停,直到最后一个图像窗口关闭。在每个脚本里,你只能调用一次 show() 命令,而且通常是在脚本的结尾调用。

也可以使用axis(‘off')命令使坐标轴不显示。

运行结果

python图像常规操作

在绘图时,有很多选项可以控制图像的颜色和样式。

如:

plot(x,y)      #默认为蓝色实线
plot(x,y,'r*')   #红色星状标记
plot(x,y,'go-')   #带有圆圈标记的绿线
plot(x,y,'ks:')   #带有正方形标记的黑色虚线

标记 颜色
‘b' 蓝色
‘g' 绿色
‘r' 红色
‘c' 青色
‘m' 品红
‘y' 黄色
‘k' 黑色
‘w' 白色

标记 线型
‘-‘ 实线
‘?' 虚线
‘:' 点线

标记 形状
‘.'
‘o' 圆圈
's' 正方形
‘*' 星形
‘+' 加号
‘x' 叉号

使用Matplotlib绘制图像轮廓

绘制图像的轮廓(或者其他二维函数的等轮廓线)在工作中非常有用。因为绘制轮廓需要对每个坐标 [x, y] 的像素值施加同一个阈值,所以首先需要将图像灰度化,之后使用contour获得轮廓图像

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 读取图像到数组中,并灰度化
im = array(Image.open('./source/test.jpg').convert('L'))
#显示时抛弃颜色信息
gray()
# 显示轮廓图像
contour(im, origin='image')
# 在原点的左上角显示
axis('equal')
#关闭坐标轴
axis('off')
show()

运行结果

python图像常规操作

使用Matplotlib绘制直方图

图像的直方图用来表征该图像像素值的分布情况。用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。(灰度)图像的直方图可以使用 hist() 函数绘制:

hist() 函数的第二个参数指定小区间的数目。需要注意的是,因为 hist() 只接受一维数组作为输入,所以我们在绘制图像直方图之前,必须先对图像进行压平处理。flatten() 方法将任意数组按照行优先准则转换成一维数组。

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 读取图像到数组中,并灰度化
im = array(Image.open('./source/test.jpg').convert('L'))
# 直方图图像
hist(im.flatten(),128)
# 显示
show()

运行结果

python图像常规操作

使用Matplotlib进行交互式标注

PyLab 库中的 ginput() 函数可以实现交互式标注,用来标记一些点或者是一些训练数据。

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 读取图像到数组中
im = array(Image.open('./source/test.jpg'))
# 显示图像
imshow(im)
print 'Please click 3 points'
#获取点击并将点击坐标保存在[x,y]列表中
x = ginput(3)
#输出保存的数据
print 'you clicked:',x
show()

上面的脚本首先绘制一幅图像,然后等待用户在绘图窗口的图像区域点击三次。程 序将这些点击的坐标 [x, y] 自动保存在 x 列表里。

运行结果

you clicked: [(295.22704081632651, 210.72448979591837), (405.43112244897952, 66.846938775510239), (439.1045918367347, 180.11224489795921)]

总结

本篇博客介绍了一些python基本的图像操作,除了上述的PIL和Matplotlib,还经常会使用numpy直接操作图像数组来达到操作图像的目的,使用scipy完成更多更复杂的计算,我会把我的学习过程记录下来,希望对大家有所帮助~

以上就是本文关于python图像常规操作的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

Python 相关文章推荐
Python中的高级函数map/reduce使用实例
Apr 13 Python
Python装饰器基础详解
Mar 09 Python
Python+Opencv识别两张相似图片
Mar 23 Python
浅析python实现scrapy定时执行爬虫
Mar 04 Python
使用anaconda的pip安装第三方python包的操作步骤
Jun 11 Python
python 返回列表中某个值的索引方法
Nov 07 Python
numpy.where() 用法详解
May 27 Python
django foreignkey(外键)的实现
Jul 29 Python
python3正则模块re的使用方法详解
Feb 11 Python
python 用Matplotlib作图中有多个Y轴
Nov 28 Python
pytorch 使用半精度模型部署的操作
May 24 Python
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
May 25 Python
python中实现k-means聚类算法详解
Nov 11 #Python
Python编程之基于概率论的分类方法:朴素贝叶斯
Nov 11 #Python
Python内存管理方式和垃圾回收算法解析
Nov 11 #Python
Python实现的人工神经网络算法示例【基于反向传播算法】
Nov 11 #Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 #Python
python基础练习之几个简单的游戏
Nov 10 #Python
Python实现购物车功能的方法分析
Nov 10 #Python
You might like
PHP脚本数据库功能详解(下)
2006/10/09 PHP
php中根据变量的类型 选择echo或dump
2012/07/05 PHP
php发送get、post请求的6种方法简明总结
2014/07/08 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
PHP 7.4中使用预加载的方法详解
2019/07/08 PHP
9个javascript语法高亮插件 推荐
2009/07/18 Javascript
利用JS解决ie6不支持max-width,max-height问题的方法
2014/01/02 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
javascript中HTMLDOM操作详解
2014/12/11 Javascript
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
2016/09/21 Javascript
jQuery中 bind的用法简单介绍
2017/02/13 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
bootstrapvalidator之API学习教程
2017/06/29 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
JS装饰器函数用法总结
2018/04/21 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
Python的ORM框架SQLObject入门实例
2014/04/28 Python
在ironpython中利用装饰器执行SQL操作的例子
2015/05/02 Python
利用python爬取散文网的文章实例教程
2017/06/18 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
Python利用splinter实现浏览器自动化操作方法
2018/05/11 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
Django获取model中的字段名和字段的verbose_name方式
2020/05/19 Python
Python爬虫UA伪装爬取的实例讲解
2021/02/19 Python
Linux内核产生并发的原因
2012/07/13 面试题
土木工程专业个人求职信
2013/12/05 职场文书
素质拓展感言
2014/01/29 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
小学教育见习报告
2014/10/31 职场文书
2014工程部年度工作总结
2014/12/17 职场文书
2016年校园重阳节广播稿
2015/12/18 职场文书
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android