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实现的解析crontab配置文件代码
Jun 30 Python
自己使用总结Python程序代码片段
Jun 02 Python
Python3中的真除和Floor除法用法分析
Mar 16 Python
PyChar学习教程之自定义文件与代码模板详解
Jul 17 Python
python+pandas生成指定日期和重采样的方法
Apr 11 Python
Python 实现中值滤波、均值滤波的方法
Jan 09 Python
浅析python 中大括号中括号小括号的区分
Jul 29 Python
Django 响应数据response的返回源码详解
Aug 06 Python
python3 selenium自动化 下拉框定位的例子
Aug 23 Python
浅谈python3 构造函数和析构函数
Mar 12 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
May 15 Python
教你怎么用Python实现多路径迷宫
Apr 29 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的ASCII码转换类
2013/07/05 PHP
php session_decode函数用法讲解
2019/05/26 PHP
BOOM vs RR BO5 第一场 2.14
2021/03/10 DOTA
jquery加载页面的方法(页面加载完成就执行)
2011/06/21 Javascript
仿百度输入框智能提示的js代码
2013/08/22 Javascript
js style动态设置table高度
2014/10/21 Javascript
再谈javascript原型继承
2014/11/10 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
2015/12/08 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
微信小程序实现音乐播放页面布局
2020/12/11 Javascript
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
[02:11]2016国际邀请赛中国区预选赛全程回顾
2016/07/01 DOTA
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
python的concat等多种用法详解
2018/11/28 Python
python3爬虫怎样构建请求header
2018/12/23 Python
Python中栈、队列与优先级队列的实现方法
2019/06/30 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
4款Python 类型检查工具,你选择哪个呢?
2020/10/30 Python
删除pycharm鼠标右键快捷键打开项目的操作
2021/01/16 Python
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
美国知名保健品网站:LuckyVitamin(支持中文)
2017/08/09 全球购物
美国酒店控股公司:Choice Hotels
2018/06/15 全球购物
美国高档帽子网上商店:Hats.com
2018/08/09 全球购物
总账会计岗位职责
2014/03/13 职场文书
党员个人整改方案及措施
2014/10/25 职场文书
电子商务实训报告总结
2014/11/05 职场文书
寒假安全保证书
2015/02/28 职场文书
周一早安温馨问候祝福语!
2019/07/15 职场文书
小程序后台PHP版本部署运行 LNMP+WNMP
2021/04/01 Servers
Python中tkinter的用户登录管理的实现
2021/04/22 Python
详解MySQL的Seconds_Behind_Master
2021/05/18 MySQL
SQL注入的实现以及防范示例详解
2021/06/02 MySQL
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis