[python opencv 计算机视觉零基础到实战] 三、numpy与图像编辑

一、学习目标

  1. 了解图片的通道与数组结构
  2. 了解使用numpy创建一个图片
  3. 了解使用numpy对图片的一般操作方法

目录

[python opencv 计算机视觉零基础到实战] 一、opencv的helloworld

[【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的helloworld

[[python opencv 计算机视觉零基础到实战] 三、numpy与图像编辑] 一、opencv的helloworld

[[python opencv 计算机视觉零基础到实战] 四、了解色彩空间及其详解] 一、opencv的helloworld

[[python opencv 计算机视觉零基础到实战] 五、对象追踪] 一、opencv的helloworld

如有错误欢迎指出~

二、了解numpy对图像的编辑

2.1 了解zeros方法的使用方法并且输入了解uint8类型

在前两节中,我们对图像的属性进行了查看,得到了宽、高以及通道,但是我们对整体的图片数据结构还是存在一定的不理解;这一节将加深对图片数据结构上的理解,方便我们接下来的学习。

首先我们需要使用numpy创建一张图片,从最基本的操作逐步对图像数据结构进行了解。我们先在代码头部引入所需库:

import cv2
import numpy as np

引入之后,我们可以使用numpy创建一个指定大小以及通道数的图片数据;可以使用numpy的zeros方法。zeros方法可以把数组转换为我们所需要的矩阵,并且这个数组将会以0这个元素进行填充。zeros接收3个参数,第一个参数为shape形状,这个形状指你这个数组需要的维度;第二个接收的参数为dtype,表示该数组的数据类型,默认为numpy.float64;第三个接收的参数为order,这个参数是可选参数,有2个默认选项,分别是C与F,表示是行优先还是列优先,由于我们现在用不到所以暂时不做过多讲解。

搞明白了zeros方法的参数后,我们可以简单的创建一个一位数组:

data=np.zeros(3)
print(data)

以上代码是创建了有3个元素的一维数组,用0进行填充,并且将值进行输出,结果如下:

那如何创建一个二维数组呢?很简单,但很多人会写错,以下是个错误示例:

data=np.zeros(3,2)

以上使用逗号进行间隔后,2作为了第二个参数dtype,但是dtype中并没有该类型,所以导致了错误,将会提示:

这是进行传参应该使用方括号或者圆括号将参数进行说明,代码如下:

data=np.zeros([3,2])

data=np.zeros((3,2))

运行结果如下:

我们已知第二个参数dtype,接下来我们尝试一下使用uint8类型对创建进行指定:

data=np.zeros((3,2),np.uint8)
print(data)

得到结果为:

由于在第一节中,我们已了解uint8的数据范围就是0-255,我们将创建的3行2列的数组第0列第0个做加法运算,增加258,查看是否将会数据溢出:

data=np.zeros((3,2),np.uint8)
data[0][1]=data[0][1]+258
print(data[0][1])

运行结果如下:

结果正确,数据并没有超过258,通过这个示例我们更加的了解了uint8该类型的取值范围。

2.2 了解使用numpy创建与图片数据结构一致的数据类型

我们已知一张图片的数据类型为uint8,并且是3通道的,那么我们这时将可以通过zeros创建一张与图片数据结构类似的图片。现在我们创建一张长宽都为3,通道为3的数组矩阵:

data=np.zeros((3,3,3),np.uint8)
print(data)

这个查看数据:

以上结构很方便我们了解整个结构,接下来修改数据创建一个200*200,有3个通道的矩阵:

data=np.zeros((200,200,3),np.uint8)

创建完毕后我们可以使用显示我们创建的一张“图片”,并且需要添加等待,不然整个程序将会一闪而过:

data=np.zeros((200,200,3),np.uint8)
cv2.imshow("dataImg",data)

运行结果如下:

这个时候将会得到一张纯黑色的图片。我们现在可以通过搜索引擎查看对应纯黑色的RGB值是多少,我通过搜索引擎查看,得到了0 0 0 为黑色;恰好,我们的数据都是以0作为填充的,所以结果为正确。查询结果如下:

从以上图片得知,颜色为白色则是255 255 255的RGB值,那么这时我们可以对该矩阵进行值的改变,即可得到一张白色图片。那我们是否可以这样编写呢?

data=np.zeros((200,200,3),np.uint8)*255

以上的编写方式是不对的,该方式是0成0,永远等于0,不过以上方式可以使每个元素都乘上255。这个时候我们可以把数组的创建方法改为ones,ones与zeros类似,我们可以从方法名上可以得知,zeros是创建数组时填充0,那ones必定是填充1了。我们写一个简单代码进行尝试:

data=np.ones((3,3,3),np.uint8)
print(data)

运行结果如下:

修改之前的代码将zeros方法改为ones方法,完整代码如下:

import cv2
import numpy as npdata=np.ones((200,200,3),np.uint8)*255
cv2.imshow("dataImg",data)
cv2.waitKey (0)
cv2.destroyAllWindows()

这时将会得到一张白色的图片:

2.3 使用OpenCV对图片进行生成

其实我们在创建这些数据时,就已经是创建了一张图片。我们的所有文件资源在计算机中都是以数字存储,而我们所见的这些图片只不过是以人类较为习惯的方式去进行呈现;即使我们操作Photoshop对图片进行更改,那也是以一种人类较为习惯的方式去对一张图片进行修改,但本质上是对数据的编辑。

那既然我们是创建了一张图片,那我们就去保存这一张图片。使用OpenCV的imwrite方法可以对图片数据进行保存。imwrite接收两个参数,第一个是path路径,表示图片存储的位置,但是需要注意的是一定不能够使用中文路径,否则有可能会出现错误;第二个参数为一个数组类型的参数,也就是我们的图像数据。那么我们就可以将自己生成的图像数据传入第二个参数。代码如下:

import cv2
import numpy as npdata=np.ones((200,200,3),np.uint8)*255
cv2.imwrite(r"C:\Users\mx\Desktop\dataImg.png",data)
cv2.imshow("dataImg",data)
cv2.waitKey (0)
cv2.destroyAllWindows()

我所存储的位置是桌面,运行程序后将会在桌面生成一个dataImg名称的白色图片。

我们以上代码使用ones创建后,乘上255,这行代码可以更改为:

data=np.zeros((200,200,3),np.uint8)
data.fill(255)

使用fill方法可以将一个数组内填充一个值。

2.4 了解通道到底指的是什么

有一些同学不了解图像或者numpy,可能会对一些名称有一定的不理解。什么是通道对于这一部分同学来说可能听得还是有点糊涂的;很简单,我们直接使用代码来看通道是啥。

我们已经了解了numpy创建3个通道的图片数据如下:

data=np.zeros((200,200,3),np.uint8)

那此时,我们将该代码编程简单直观的方式,以便我们观察,分别更改创建的数组为3,3与3,3,3以及3,3,4 :

data=np.zeros((3,3),np.uint8)
data=np.zeros((3,3,3),np.uint8)

这时候查看数据:

其实从3,3到3,3,3明显的注意到是厚度增加了;我们之前说过,图像是由3张单通道图像组成,每一张表示一种色彩,其实就可以理解为我们所看见的图像是由3张通道图像叠加而成,这时就理解了该通道的含义。

注:文章首发于ebaina

三、总结

  1. 了解图片的通道与数组结构
  2. 了解使用numpy使用zeros,ones创建图像结构的数据
  3. 了解使用numpy使用fill对数据进行填充
  4. 了解了使用OpenCV 的imwrite方法保存数据

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

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

相关文章

java 常用类库_JAVA(三)JAVA常用类库/JAVA IO

成鹏致远 |lcw.cnblog.com|2014-02-01JAVA常用类库1.StringBufferStringBuffer是使用缓冲区的,本身也是操作字符串的,但是与String类不同,String类的内容一旦声明之后则不可改变,改变的只是其内存地址的指向,而StringB…

Android之国际化部分文字生效而部分文字没有生效的坑

1 问题 Android国际化我们知道只要在res目录下面,创建不同国家的文件夹然后,把不同国家对于的语言以键值对的方式写进strings.xml文件就行,这是一个非常简单的操作,但是今天遇到了一个很奇葩的问题,在部分手机&#x…

【中间件】c#/.net使用GZY.Quartz.MUI搭建可视化的定时任务面板

GZY.Quartz.MUI是在github上开源的aspnetcore项目, 它旨在帮助开发人员通过面板来设置定时任务,主要想做的就是:像swaggerUI一样,项目入侵量小,仅需要在Startup中注入的UI组件官方地址:https://www.cnblogs.com/GuZhenYin/p/15745002.html主要功能1.增加本地json持久…

iOS UI基础-7.0 UIScrollView

概述 移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也相当有限.当展示的内容较多,超出一个屏幕时,用户可通过滚动手势来查看屏幕以外的内容,普通的UIView不具备滚动功能,不能显示过多的内容。UIScrollView是一个能…

【ArcGIS风暴】缓冲区分析、叠置分析综合实验案例:购房区域的选择

实验平台:ArcGIS 9.3实验目的:熟练掌握A rcGIS缓冲区分析和叠置分析操作,综合利用各项空间分析工具解决实际问题。实验要求:对每个条件进行缓冲区分析,运用空间叠置分析对多个图层叠加,并分等级,确定合适的区域。实验数据:ArcEx8实验步骤打开ArcMap,加载数据ArcEx8,如…

[python opencv 计算机视觉零基础到实战] 四、了解色彩空间及其详解

一、学习目标 了解什么是色彩空间了解opencv中色彩空间的转换 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的helloworld [[python opencv 计算机视觉零基…

java gui 按键 数组_java GUI分配数组值

好的,所以这是一个非常基本的例子.它需要更多的工作和优化,但应该让你朝着正确的方向前进import java.awt.Color;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Point;import java.awt.Shape;im…

poj1189 简单dp

http://poj.org/problem?id1189 Description 有一个三角形木板,竖直立放。上面钉着n(n1)/2颗钉子,还有(n1)个格子(当n5时如图1)。每颗钉子和周围的钉子的距离都等于d,每一个格子的宽度也都等于d,且除了最左端和最右端…

WPF|如何在 WPF 中设计漂亮的社交媒体信息仪表板

1. 效果展示先来直接欣赏效果:2. 准备创建一个WPF工程,比如站长使用 .NET 7[1] 创建名为 Dashboard3 的WPF项目,添加一些图片资源,项目目录如下:2.1 图片资源可在网站 iconfont[2] 下载 关闭、最小化 图标,…

CentOS 设置服务开机启动的方法

为什么80%的码农都做不了架构师?>>> CentOS设置服务开机启动的两种方法 1、利用 chkconfig 来配置启动级别 在CentOS或者RedHat其他系统下,如果是后面安装的服务,如httpd、mysqld、postfix等,安装后系统默认不会自动启…

【ArcGIS风暴】水文分析模块实验:山脊线和山谷线提取

实验平台:ArcGIS 9.3实验目的:学习和掌握山脊线和山谷线提取的原理及方法实验要求:利用ArcGIS水文分析模块提取样区的山脊线和山谷线实验数据:Ex1实验步骤:1.正负地形的提取 (1)打开Arcmap,加载数据EX1,如图 (2)平滑处理(均值滤波)。加载Spatial Analyst模块,单击…

[python opencv 计算机视觉零基础到实战] 五、对象追踪

一、学习目标 了解为什么色彩空间的转换那么重要了解opencv中进行对象跟踪的方法 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的helloworld [[python op…

【ArcGIS风暴】在ArcGIS中实现将一个圆16等分

本文实现在ArcGIS中画一个圆,然后将其16等分。 步骤一:生成圆(多边形图层) (1)创建一个点图层(图名Center),如果需要精确定位该点,建议通过输入坐标点的方式来创建,这一步比较简单,不再详述; (2)利用Buffer命令创建缓冲区(图名Circle_2km),因为要处理的对象…

[python opencv 计算机视觉零基础到实战] 六、图像运算

一、学习目标 了解opencv中图像运算的方法了解opencv中图像运算的运用 如有错误欢迎指出~ 二、了解OpenCV中图像运算的运用 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头…

【ArcGIS风暴】实验:公路建设成本的计算

实验平台:ArcGIS 9.3实验目的:学习和掌握公路建设成本的计算方法实验要求:熟练掌握如何生成通行成本层、计算成本距离,并学会计算最佳路径,且对成本距离与直线距离进行比较。实验数据:ArcEx7实验步骤:生成通行成本层1.打开Arcmap,加载数据ArcEX7,如图 2.执行spatial …

合并Spark社区代码的正确姿势

原创文章,转载请保留出处 最近刚刚忙完Spark 2.2.0的性能测试及Bug修复,社区又要发布2.1.2了,国庆期间刚好有空,过了一遍2.1.2的相关JIRA,发现有不少重要修复2.2.0也能用上,接下来需要将有用的PR合到我们内…

.NET 中 GC 的模式与风格

垃圾回收(GC)是托管语言必备的技术之一。GC 的性能是影响托管语言性能的关键。我们的 .NET 既能写桌面程序 (WINFROM , WPF) 又能写 web 程序 (ASP.NET CORE),甚至还能写移动端程序。。。不同使用场景的程序对 GC 的风格也有不同的要求&#…

[python opencv 计算机视觉零基础到实战] 七、逻辑运算与应用

一、学习目标 了解opencv中图像的逻辑运算了解opencv中逻辑运算的应用 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的helloworld [[python opencv 计算机…

【ArcGIS风暴】数字化实验:数据采集与编辑完整操作流程

一.实验平台:ArcGIS 9.3 二.实验目的:对甘肃省的十四个地级市进行图像配准、数据采集。 三.实验要求:掌握地理数据采集方法,图像配准及坐标投影,选择主要的点、线、面进行投影。 四.实验数据:甘肃省统计数据,甘肃省行政区划图。 (一).影像配准 第一步:加载…

loadrunner java 参数化_LoadRunner 参数化详解

LoadRunner,是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试。通过使用 LoadRunner,企业能最大限度地缩短测试时间,优化性…