百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

「python opencv 视觉入门到实战」 三、图像编辑

toyiye 2024-08-13 11:31 13 浏览 0 评论

一、学习目标

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

如有错误欢迎指出~

二、了解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 np

data=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 np

data=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方法保存数据

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码