- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python图像常规操作由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
使用python进行基本的图像操作与处理 。
前言:
与早期计算机视觉领域多数程序都是由 C/C++ 写就的情形不同。随着计算机硬件速度越来越快,研究者在考虑选择实现算法语言的时候会更多地考虑编写代码的效率和易用性,而不是像早年那样把算法的执行效率放在首位。这直接导致近年来越来越多的研究者选择 Python 来实现算法.
今天在计算机视觉领域,越来越多的研究者使用 Python 开展研究,所以有必要去学习一下十分易用的python在图像处理领域的使用,这篇博客将会介绍如何使用Python的几个著名的图像处理库完成最基本的图像操作与处理.
使用PIL进行基本图像操作 。
PIL简介:
PIL(Python Imaging Library Python,图像处理类库)提供了通用的图像处理功能,以及大量有用的基本图像操作,比如图像缩放、裁剪、旋转、颜色转换等.
PIL读取与存储图像:
利用 PIL 中的函数,我们可以从大多数图像格式的文件中读取数据,然后写入最常见的图像格式文件中。PIL 中最重要的模块为 Image .
下面这个程序我使用PIL读取一张jpg图片将其灰度化之后存为一个png文件:
1
2
3
4
5
6
7
8
9
10
11
12
|
# -*- 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 。
Test.png 。
PIL生成缩略图:
1
2
3
4
5
6
7
8
9
10
11
12
|
# -*- 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 。
PIL调整尺寸与旋转:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# -*- 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 。
PIL复制粘贴图像区域:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# -*- 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 。
元组的使用中,坐标原点为左上角,区域划分如下图所示 。
使用Matplotlib进行基本图像操作 。
Matplotlib简介:
我们处理数学运算、绘制图表,或者在图像上绘制点、直线和曲线时, Matplotlib是个很好的类库,具有比 PIL 更强大的绘图功能。Matplotlib 可以绘制出较好的条形图、饼状图、散点图等,但是对于大多数计算机视觉应用来说,仅仅需要用到几个绘图命令。比如,我们想用点和线来表示一些事物,比如兴趣点、对应点以及检测出的物体.
使用Matplotlib绘制图像、点、线 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# -*- 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')命令使坐标轴不显示.
运行结果 。
在绘图时,有很多选项可以控制图像的颜色和样式.
如:
1
2
3
4
|
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获得轮廓图像 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# -*- 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()
|
运行结果 。
使用Matplotlib绘制直方图 。
图像的直方图用来表征该图像像素值的分布情况。用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。(灰度)图像的直方图可以使用 hist() 函数绘制
hist() 函数的第二个参数指定小区间的数目。需要注意的是,因为 hist() 只接受一维数组作为输入,所以我们在绘制图像直方图之前,必须先对图像进行压平处理。flatten() 方法将任意数组按照行优先准则转换成一维数组.
1
2
3
4
5
6
7
8
9
|
# -*- coding: utf-8 -*-
from
PIL
import
Image
from
pylab
import
*
# 读取图像到数组中,并灰度化
im
=
array(Image.
open
(
'./source/test.jpg'
).convert(
'L'
))
# 直方图图像
hist(im.flatten(),
128
)
# 显示
show()
|
运行结果 。
使用Matplotlib进行交互式标注 。
PyLab 库中的 ginput() 函数可以实现交互式标注,用来标记一些点或者是一些训练数据.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# -*- 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 列表里.
运行结果 。
1
|
you clicked: [(
295.22704081632651
,
210.72448979591837
), (
405.43112244897952
,
66.846938775510239
), (
439.1045918367347
,
180.11224489795921
)]
|
总结 。
本篇博客介绍了一些python基本的图像操作,除了上述的PIL和Matplotlib,还经常会使用numpy直接操作图像数组来达到操作图像的目的,使用scipy完成更多更复杂的计算,我会把我的学习过程记录下来,希望对大家有所帮助~ 。
以上就是本文关于python图像常规操作的全部内容,希望对大家有所帮助.
有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持! 。
原文链接:http://blog.csdn.net/sunmc1204953974/article/details/50586819 。
最后此篇关于python图像常规操作的文章就讲到这里了,如果你想了解更多关于python图像常规操作的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
当给定两个 bool 参数时,^ 运算符执行异或,例如 true ^ true == false true ^ false == true false ^ true == true false ^ f
我需要下载一个文件(例如: https://www.betaseries.com/srt/391160 )所以我在网上找到了不同的方法: def download(String remoteUrl,
可以说,我们正在计算考试成绩的平均值: 起始考试成绩:75、80、92、64、83、99、79 平均值= 572/7 = 81.714 ... 现在给出81.714,如果您不知道初始测试分数,是否可以
我和一个 friend 正在争论线程池中的线程数应该是处理器计数+ 1还是仅仅是处理器计数。 我之所以选择处理器数量,是因为每个处理器可以分配偶数个线程,而他选择处理器数量+ 1是因为他认为这将帮助他
我已经养成了尽可能使用闭包来代替常规方法的习惯,即使我不需要访问自由变量。所以,我将使用这个: def addNumbers = { 左、右 -> 左 + 右 } ..而不是这个: def addNu
我对 Groovy 非常陌生,我正在尝试《Groovy in Action》书中的这个示例。我有这个 fibonacci.groovy 程序,当尝试使用 java 命令运行该程序时,我收到 NoCla
我有 3 个 TextView 。我需要将它们的权重设置为 Light、Regular 和 Condensed。有人可以帮助我了解如何在 Android 中实现这一点吗? 最佳答案 在 TextVie
如果用户启动我的应用程序并最初选择不允许位置服务,我想通过 UIAlertMessage 提示用户重新考虑(“更新”和“不,谢谢。”)。 “不,谢谢。”这将是一个简单的取消,我希望“更新”将它们直接链
如何在 groovy 中显示一个值是真还是假?我使用 Eclipse 作为我的 IDE。 assert 4 * ( 2 + 3 ) - 6 == 14 //integers only 而且我也
我的问题与“多处理器编程的艺术”一书有关。第4章介绍安全/常规/原子寄存器及其实现。 以下是安全多读取器单写 boolean 寄存器的以下实现,该寄存器基于安全单读取器单写 boolean 寄存器,被
使用下面的代码来保存 float 的值 domainInstance.standardScore = params["standardScore"] as float 在这种情况下,我的输入是 17.
使用下面的代码来保存 float 的值 domainInstance.standardScore = params["standardScore"] as float 在这种情况下,我的输入是 17.
在iOS的about部分中,它具有有关设备的大量信息。 我和我可以访问此信息吗? 我想快速获取settings -> General -> About的数据。在iOS中获得相同的价格是否可行? 最佳答
我正在开发Windows服务,它将承载两件事: WCF服务 用于定期作业执行的“常规” Windows服务(使用Quartz.net) 因此,基本上,一个应用程序(可执行)承载这两种服务类型。 这两种
在mysql中,我有一个名为users的表,其中包含系统中的用户列表... id | name | surname | active ____________________________ 1
所以我在 Debian 服务器上设置了一个 MySQL 数据库,并且它在 phpMyAdmin 客户端上运行良好。我目前正在开发一个项目,编写一个 Java 服务器,该服务器能够通过 JDBC 连接使
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
前两天考试了,其中一道题是把@前面的字母换成新的名字 所以在试卷中我们有 array = "toto@yahoo.com","mimi@yahoo.com".soso@yahoo.com"所以我们应该
大家好 如果字符串语法如下,我如何从字符串中获取数字(正数): t_def_type_id_2 t_def_type_id_22 t_def_type_id_334 所以,在第一个字符串中我想得到 1
我正在寻找不会在内核中阻塞的文件描述符类型。我知道我可以使用 fstat(2) 但 fstat 还会给我各种元数据信息(访问时间等),这些信息可能会阻塞任意时间(特别是在网络文件系统上)。 编辑:我正
我是一名优秀的程序员,十分优秀!