[笔记]Python计算机视觉编程《一》 基本的图像操作和处理

news2024/11/24 1:04:39

文章目录

  • 前言
    • 环境搭建
  • 计算机视觉简介
  • Python和NumPy
  • 第一章 基本的图像操作和处理
  • 1.1 PIL:Python图像处理类库
    • 1.1.1 转换图像格式
      • 1.1.2 创建缩略图
      • 1.1.3 复制和粘贴图像区域
      • 1.1.4 调整尺寸和旋转
    • 1.2 Matplotlib
      • 1.2.1 绘制图像、点和线

前言

今天,图像和视频无处不在,在线照片分享网站和社交网络上的图像有数十亿之多。几乎对于任意可能的查询图像,搜索引擎都会给用户返回检索的图像。实际上,几乎所有手机和计算机都有内置的摄像头,所以在人们的设备中,有几 G 的图像和视频是一件很寻常的事。计算机视觉就是用计算机编程,并设计算法来理解在这些图像中有什么。计算机视觉的有力应用有图像搜索、机器人导航、医学图像分析、照片管理等。

本书旨在为计算机视觉实战提供一个简单的切入点,让学生、研究者和爱好者充分理解其基础理论和算法。本书中的编程语言是 Python,Python 自带了很多可以免费获取的强大而便捷的图像处理、数学计算和数据挖掘模块,可以免费获取。

写作本书的时候,我遵循了以下原则:

  • 鼓励探究式学习,让读者在阅读本书的时候,在计算机上跟着书中示例进行练习。
  • 推广和使用免费且开源的软件,设立较低的学习门槛。显然,我们选择了 Python。
  • 保持内容完整性和独立性。本书没有介绍计算机视觉的全部内容,而是完整呈现并解释所有代码。你应该能够重现这些示例,并可以直接在它们之上构建其他应用。
  • 内容追求广泛而非详细,且相对于理论更注重鼓舞和激励。

总之,如果你对计算机视觉编程感兴趣,希望它能给你带来启发。

环境搭建

环境:python2.7
依赖库:PIL

计算机视觉简介

计算机视觉是一门对图像中信息进行自动提取的学科。信息的内容相当广泛,包括三维模型、照相机位置、目标检测与识别,以及图像内容的分组与搜索等。本书中,我们使用广义的计算机视觉概念,包括图像扭曲、降噪和增强现实等①。计算机视觉有时试图模拟人类视觉,有时使用数据和统计方法,而有时几何是解决问题的关键。在本书中,我们试图对此进行全面介绍。

实用计算机视觉混合了编程、建模和数学技巧,有时很难掌握。本着“力求简单,又不影响理解”的精神,有意用最少的理论来展示这些内容。书中对于数学知识的介绍是为了帮助读者理解算法,有些章(主要是第 4 章和第 5 章)无法避免地涉及很多数学理论。只要读者愿意,可以跳过这些数学理论,直接使用示例代码。

注 1:这些例子生成新的图像,并且比实际地从图像中提取信息需要更多的图像处理。

Python和NumPy

Python 是一门编程语言,其使用贯穿了全书的示例代码。Python 是一种简洁明了的语言,对于输入 / 输出、数字、图像及绘图都具有良好的支持。这门语言的一些特性需要我们逐渐适应,比如缩进和紧凑语法。要运行代码示例,你需要安装 Python 2.6 或之后的版本,因为只有这些版本才提供本书中用到的很多工具包。Python 3.x 版本与 2.x 版本有很多语法差异,并且不兼容 2.x 版本,也不兼容我们所需的工具包。
熟悉一些基本 Python 操作会更容易理解这些内容。对于 Python 初学者,我建议读一下 Mark Lutz 的书 Learning Python[20] 和 http://www.python.org/ 上的在线文档。在进行计算机视觉编程的时候,我们需要在向量、矩阵的表示上进行操作,这可以通过 Python 的 NumPy 模块处理;在该模块中,向量和矩阵是用 array 类型表示的。对于图像,我们也将采用这种类型的表示。Travis Oliphant 的免费电子书 Guide to NumPy[24] 是一本不错的 NumPy 参考手册;http://numpy.scipy.org/ 上的文档对于刚接触 NumPy 的读者来说是一个很好的起点。对于结果的可视化,我们会用到Matplotlib 模块;而对于更高级的数学,我们会用到 SciPy 模块。这些就是你会用到的核心模块,详见第 1 章。除了这些核心模块,对于某些特殊目的,比如读取 JSON 或 XML、载入并保存数据、生成图、图形编程、Web 演示、分类器等,我们还会用到很多其他免费模块。
这些模块只有在特殊的应用和演示中才需要,如果你对于某种应用不感兴趣,可以跳过。这里有必要提一下 IPython,它是一个交互式 Python 壳,使调试和实验变得更简单。对应文档及下载地址见 http://ipython.org/。

第一章 基本的图像操作和处理

本章讲解操作和处理图像的基础知识,将通过大量示例介绍处理图像所需的 Python工具包,并介绍用于读取图像、图像转换和缩放、计算导数、画图和保存结果等的基本工具。这些工具的使用将贯穿本书的剩余章节。

1.1 PIL:Python图像处理类库

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

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

from PIL import Image
pil_im = Image.open('empire.jpg')

上述代码的返回值 pil_im 是一个 PIL 图像对象。
图像的颜色转换可以使用 convert() 方法来实现。要读取一幅图像,并将其转换成灰度图像,只需要加上 convert(‘L’),如下所示:

pil_im = Image.open('empire.jpg').convert('L')

在 PIL 文档中有一些例子,参见 http://www.pythonware.com/library/pil/handbook/
index.htm。这些例子的输出结果如图 1-1 所示。
在这里插入图片描述
完整代码:

from PIL import Image
pil_im = Image.open('data/empire.jpg')
# pil_im = Image.open('data/empire.jpg').convert('L')
pil_im.show()

1.1.1 转换图像格式

通过 save() 方法,PIL 可以将图像保存成多种格式的文件。下面的例子从文件名列
表(filelist)中读取所有的图像文件,并转换成 JPEG 格式:
(完整代码)

from PIL import Image
import os

filelist = ['data/empire.jpg']
for infile in filelist:
    outfile = os.path.splitext(infile)[0] + "_out.jpg"
    if infile != outfile:
        try:
            Image.open(infile).save(outfile)
        except IOError:
            print("cannot convert:"+ infile)

PIL 的 open() 函数用于创建 PIL 图像对象,save() 方法用于保存图像到具有指定文
件名的文件。除了后缀变为“.jpg”,上述代码的新文件名和原文件名相同。PIL 是
个足够智能的类库,可以根据文件扩展名来判定图像的格式。

PIL 函数会进行简单的检查,如果文件不是 JPEG 格式,会自动将其转换成 JPEG 格式;如果转换失败,它会在控制台输出一条报告失败的消息。

本书会处理大量图像列表。下面将创建一个包含文件夹中所有图像文件的文件名列
表。首先新建一个文件,命名为 imtools.py,来存储一些经常使用的图像操作,然
后将下面的函数添加进去:

import os
def get_imlist(path):
    """ 返回目录中所有 JPG 图像的文件名列表 """
    return [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.jpg')]

1.1.2 创建缩略图

使用 PIL 可以很方便地创建图像的缩略图。thumbnail() 方法接受一个元组参数(该
参数指定生成缩略图的大小),然后将图像转换成符合元组参数指定大小的缩略图。
例如,创建最长边为 128 像素的缩略图,可以使用下列命令:

pil_im.thumbnail((128,128))

完整代码

from PIL import Image
pil_im = Image.open('data/empire.jpg')
pil_im.thumbnail((128, 128))
pil_im.show()

效果
在这里插入图片描述

1.1.3 复制和粘贴图像区域

使用 crop() 方法可以从一幅图像中裁剪指定区域:

box = (100,100,400,400)
region = pil_im.crop(box)

该区域使用四元组来指定。四元组的坐标依次是(左,上,右,下)。PIL 中指定
坐标系的左上角坐标为(0,0)。

我们可以旋转上面代码中获取的区域,然后使用paste() 方法将该区域放回去,具体实现如下:

region = region.transpose(Image.ROTATE_180)
pil_im.paste(region,box)

完整代码:

from PIL import Image
pil_im = Image.open('data/empire.jpg')
box = (100,100,400,400)
region = pil_im.crop(box)
region = region.transpose(Image.ROTATE_180)
pil_im.paste(region, box)
pil_im.show()

在这里插入图片描述

1.1.4 调整尺寸和旋转

要调整一幅图像的尺寸,我们可以调用 resize() 方法。该方法的参数是一个元组,
用来指定新图像的大小:

out = pil_im.resize((128,128))

要旋转一幅图像,可以使用逆时针方式表示旋转角度,然后调用 rotate() 方法:

out = pil_im.rotate(45)

完整代码:

from PIL import Image
pil_im = Image.open('data/empire.jpg')
box = (100,100,400,400)
out = pil_im.resize((128,128))
out.show()
out = pil_im.rotate(45)
out.show()
pil_im.show()

在这里插入图片描述

1.2 Matplotlib

我们处理数学运算、绘制图表,或者在图像上绘制点、直线和曲线时,Matplotlib是个很好的类库,具有比 PIL 更强大的绘图功能。Matplotlib 可以绘制出高质量的图表,就像本书中的许多插图一样。Matplotlib 中的 PyLab 接口包含很多方便用户创建图像的函数。Matplotlib 是开源工具,可以从 http://matplotlib.sourceforge.net/免费下载。该链接中包含非常详尽的使用说明和教程。下面的例子展示了本书中需要使用的大部分函数。

1.2.1 绘制图像、点和线

尽管 Matplotlib 可以绘制出较好的条形图、饼状图、散点图等,但是对于大多数计
算机视觉应用来说,仅仅需要用到几个绘图命令。最重要的是,我们想用点和线来
表示一些事物,比如兴趣点、对应点以及检测出的物体。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python基础实战6-python字符串

1字符串的表达方式 字符串是 Python 中最常用的数据类型。我们可以使用引号 ( 或 " ) 来创建字符串。 字符串表达方式 a " I m Tom" #一对双引号 b ’Tom said:" I am Tom" #一对单引号 c ‘Tom said: " I\m Tom" #转义字符 d T…

python库,科学计算与数据可视化基础,知识笔记(numpy+matplotlib)

文章目录 1、numpyndarray对象,数组指定形状创建(要会)数组的索引,切片与遍历(要会)数组的相加,转置,展开(要会)数组元素增删改查(最好会&#xf…

当CRM遇见ChatGPT,AI如何帮销售打造“最强大脑”

导读:这一轮AI浪潮将对CRM企业带来哪些新机遇? ChatGPT诞生至今不过100多天,但它已经对很多行业产生了巨大影响。 企业直面市场的一线战场——销售、营销、客服等领域也是如此。以ChatGPT为代表的人工智能技术热潮正在改变着传统营销、销售的…

MySQL--group by--聚合函数--内置函数--0415 22

目录 1.聚合函数 1.1 count 1.2 sum 1.3 avg 1.4 max 和 min 2. group by 2.1 group by 的条件筛选——having 2.2 总结 3.日期函数 4.字符串函数 concat replace substring 以首字母大写,其余字母小写的方式显示员工的姓名 5.数学函数 format rand()…

C plus plus ——【继承与派生】

系列文章目录 C plud plus ——【面向对象编程】 C plus plus ——【继承与派生】 文章目录 系列文章目录前言一、继承1.1 类的继承1.2 继承后可访问性1.3 构造函数访问顺序1.4 子类隐藏父类的成员函数 二、重载运算符2.1重载运算符的必要性2.2重载运算的形式与规则2.3 转换运…

数字信号处理学习1

基本上算是没怎么学过数字信号处理这门课,因为本科的时候,专业方向用不上,现在没法子了,专业使然,只能自己自学了,但是我又不知道该从何学起,就买了一本现代数字信号处理,结果发现人…

数据结构/队列实现栈

前言 在学习数据结构的过程当中,我们会学到栈和队列,在本篇文章中,重点讲解的是队列实现栈,在上篇文章中已经简单介绍过栈和队列的使用说明,以及栈实现队列。(2条消息) 数据结构/栈实现队列_Y君的进化史的博客-CSDN博客…

吴恩达ChatGPT网课笔记Prompt Engineering——训练ChatGPT前请先训练自己

吴恩达ChatGPT网课笔记Prompt Engineering——训练ChatGPT前请先训练自己 主要是吴恩达的网课,还有部分github的prompt-engineering-for-developers项目,以及部分自己的经验。 一、常用使用技巧 prompt最好是英文的,如果是中文的prompt&am…

Day961.老城区前端改造 -遗留系统现代化实战

老城区前端改造 Hi,我是阿昌,今天学习记录的是关于老城区前端改造的内容。 什么是“改造老城区”。改造老城区模式 是指对遗留系统内部的模块进行治理,让模块内部结构合理、模块之间职责清晰的一系列模式。 也就是说,在遗留系统…

【Redis】聊一下Redis基础架构

我们知道学习一个技术,最好的方式就是从全局观出发,然后针对不同的点进行拆分,一个个破解。既可以将学到的和已有的知识联系起来,又可以有一定的深度和目的性。 Redis基础架构 对于一个中间件来说,一个是使用层面&…

GO数组切片-线性数据结构

数据结构 类型 什么是类型 ? 内存中的二进制数据本身没有什么区别,就是一串0或1的组合。 内存中有一个字节内容是0x63,他究竟是深恶 字符串?字符?还是整数? 本来0x63表示数字 但是文字必须编码成为0和1的组合 才能记…

【C++】红黑树源码剖析

目录 概述 算法 调整策略 源码 RBTree.h test.cpp 概述 红黑树,是一种二叉搜索树,每一个节点上有一个存储位表示节点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一…

ChatGPT、文心一言、New Bing到底哪个更AI?

Hello 各位小伙伴,要说今年最火爆的 IP 有哪些,那一定少不了人工智能(AI),市面上已经相继出现了我们熟知的 ChatGPT(OpenAI)、ChatGPT 国外镜像网站、文心一言(百度)、Ne…

MySQL --- DDL图形化工具表结构操作

一. 图形化工具 1. 介绍 前面我们讲解了DDL中关于数据库操作的SQL语句,在我们编写这些SQL时,都是在命令行当中完成的。大家在练习的时候应该也感受到了,在命令行当中来敲这些SQL语句很不方便,主要的原因有以下 3 点:…

redis的介绍和安装

文章目录 一、redis的介绍和安装1.1 初识redis1.1.1 redis是什么?1.1.2 redis能做什么? 1.2 redis的安装配置 一、redis的介绍和安装 1.1 初识redis 1.1.1 redis是什么? Redis是一个开源的内存数据存储系统,也可以被用作数据库、…

阿里云服务器vCPU和CPU有区别吗?

阿里云服务器vCPU是什么?vCPU和CPU有什么区别?CPU是指云服务器的中央处理器,一个CPU可以包含若干个物理核,一台云服务器ECS实例的CPU选项由CPU物理核心数和每核线程数决定,通过超线程HT(Hyper-Threading&am…

探索三维世界【3】:Three.js 的 Geometry 几何体 与 Material 材质

探索三维世界【3】:Three.js 的 Material 材质 1、Geometry几何体2、Material 材质3、创建平面与材质4、多平面渲染 1、Geometry几何体 Three.js中的几何体Geometry是构成3D模型的基本单元之一,它定义了一个物体的形状和大小。Geometry包含了物体的顶点…

RK3568平台开发系列讲解(网络篇)网络包的接收过程

🚀返回专栏总目录 文章目录 一、内核接收网络包过程二、用户态读取网络包过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们一起来梳理下网络包的接收过程。 一、内核接收网络包过程 硬件网卡接收到网络包之后,通过 DMA 技术,将网络包放入 Ring Buffer;…

PyTorch数据加载工具:高效处理常见数据集的利器

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

HTTP 缓存新鲜度 max-age

新鲜度 理论上来讲,当一个资源被缓存存储后,该资源应该可以被永久存储在缓存中。由于缓存只有有限的空间用于存储资源副本,所以缓存会定期地将一些副本删除,这个过程叫做缓存驱逐。另一方面,当服务器上面的资源进行了更…