wp做购物网站,广东东莞最近出什么事了,一键搭建wordpress,网站建设的实验心得文章目录 一、实验目的二、实验内容三、实验过程Numpy1.NumPy 操作2.NumPy Ndarray 对象3.NumPy 基本类型4.NumPy 数组属性ndarray.ndimndarray.shapendarray.itemsizendarray.flags 5.NumPy 创建数组numpy.emptynumpy.zerosnumpy.ones 6.NumPy 从已有的数组创建数组numpy.asar… 文章目录 一、实验目的二、实验内容三、实验过程Numpy1.NumPy 操作2.NumPy Ndarray 对象3.NumPy 基本类型4.NumPy 数组属性ndarray.ndimndarray.shapendarray.itemsizendarray.flags 5.NumPy 创建数组numpy.emptynumpy.zerosnumpy.ones 6.NumPy 从已有的数组创建数组numpy.asarraynumpy.frombuffernumpy.fromiter 7.NumPy 从数值范围创建数组numpy.arangenumpy.linspacenumpy.logspace 8.NumPy 切片和索引9.NumPy 高级索引整数数组索引布尔索引 10.NumPy 迭代数组修改数组中元素的值使用外部循环 11.Numpy数组操作修改数组形状numpy.reshapenumpy.ndarray.flattennumpy.ravelnumpy.transposenumpy.rollaxisnumpy.swapaxes 准备工作小插曲numpy包 图像处理颜色转换画矩形画圆画椭圆画线段画和填充多边形绘制文字为图像添加边框轮廓检测和画出轮廓 四、实验结果五、实验结论 一、实验目的
本实验是利用python中的numpy库中的函数对数组进行各种各样的操作和对图像进行各种操作。对数组进行的操作包括熟悉numpy的基本操作——学习如何创建、访问和修改NumPy数组了解数组的属性和方法学习如何改变数组的形状例如改变维度、转置数组、重塑数组等还有学习如何使用NumPy的索引和切片操作对数组进行元素的访问和修改。对图像的操作包括学习如何实现颜色变换、画基本图形、文字绘制、为图像添加边框以及在图像中查找轮廓。通过该实验可以帮助我们掌握numpy的基本操作和常用函数理解数组的概念和运算;同时可以深入了解OpenCV图像处理模块的功能和应用并对不同的图像处理算法和技术有所了解实验过程也可以帮助我更加熟悉OpenCV提供的函数和方法为将来在计算机视觉和图像处理领域的实际应用中打下基础。
二、实验内容
1.numpy基本操作
2.基本图形的绘制
三、实验过程
Numpy
NumPy - 简介
NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。
Numeric即 NumPy 的前身是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray 它拥有一些额外的功能。 2005年Travis Oliphant 通过将 Numarray 的功能集成到 Numeric 包中来创建 NumPy 包。 这个开源项目有很多贡献者。
1.NumPy 操作
使用NumPy开发人员可以执行以下操作 数组的算数和逻辑运算。 傅立叶变换和用于图形操作的例程。 与线性代数有关的操作。 NumPy 拥有线性代数和随机数生成的内置函数。
2.NumPy Ndarray 对象
NumPy 最重要的一个特点是其 N 维数组对象 ndarray它是一系列同类型数据的集合以 0 下标为开始进行集合中元素的索引。
ndarray 对象是用于存放同类型元素的多维数组。
ndarray 中的每个元素在内存中都有相同存储大小的区域。
ndarray 内部由以下内容组成 一个指向数据内存或内存映射文件中的一块数据的指针。 数据类型或 dtype描述在数组中的固定大小值的格子。 一个表示数组形状shape的元组表示各维度大小的元组。 一个跨度元组stride其中的整数指的是为了前进到当前维度下一个元素需要跨过的字节数。
ndarray 的内部结构:
跨度可以是负数这样会使数组在内存中后向移动切片中 obj[::-1] 或 obj[:,::-1] 就是如此。
创建一个 ndarray 只需调用 NumPy 的 array 函数即可
名称描述object数组或嵌套的数列dtype数组元素的数据类型可选copy对象是否需要复制可选order创建数组的样式C为行方向F为列方向A为任意方向默认subok默认返回一个与基类类型一致的数组ndmin指定生成数组的最小维度NumPy 数据类型
numpy 支持的数据类型比 Python 内置的类型要多很多基本上可以和 C 语言的数据类型对应上其中部分类型对应为 Python 内置的类型。下表列举了常用
3.NumPy 基本类型
名称描述bool_布尔型数据类型True 或者 Falseint_默认的整数类型类似于 C 语言中的 longint32 或 int64intc与 C 的 int 类型一样一般是 int32 或 int 64intp用于索引的整数类型类似于 C 的 ssize_t一般情况下仍然是 int32 或 int64int8字节-128 to 127int16整数-32768 to 32767int32整数-2147483648 to 2147483647int64整数-9223372036854775808 to 9223372036854775807uint8无符号整数0 to 255uint16无符号整数0 to 65535uint32无符号整数0 to 4294967295uint64无符号整数0 to 18446744073709551615float_float64 类型的简写float16半精度浮点数包括1 个符号位5 个指数位10 个尾数位float32单精度浮点数包括1 个符号位8 个指数位23 个尾数位float64双精度浮点数包括1 个符号位11 个指数位52 个尾数位complex_complex128 类型的简写即 128 位复数complex64复数表示双 32 位浮点数实数部分和虚数部分complex128复数表示双 64 位浮点数实数部分和虚数部分
numpy 的数值类型实际上是 dtype 对象的实例并对应唯一的字符包括 np.bool_np.int32np.float32等等。
4.NumPy 数组属性
本章节我们将来了解 NumPy 数组的一些基本属性。
NumPy 数组的维数称为秩rank秩就是轴的数量即数组的维度一维数组的秩为 1二维数组的秩为 2以此类推。
在 NumPy中每一个线性的数组称为是一个轴axis也就是维度dimensions。比如说二维数组相当于是两个一维数组其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是 NumPy 中的轴axis第一个轴相当于是底层数组第二个轴是底层数组里的数组。而轴的数量——秩就是数组的维数。
很多时候可以声明 axis。axis0表示沿着第 0 轴进行操作即对每一列进行操作axis1表示沿着第1轴进行操作即对每一行进行操作。
NumPy 的数组中比较重要 ndarray 对象属性有
属性说明ndarray.ndim秩即轴的数量或维度的数量ndarray.shape数组的维度对于矩阵n 行 m 列ndarray.size数组元素的总个数相当于 .shape 中 n*m 的值ndarray.dtypendarray 对象的元素类型ndarray.itemsizendarray 对象中每个元素的大小以字节为单位ndarray.flagsndarray 对象的内存信息ndarray.realndarray元素的实部ndarray.imagndarray 元素的虚部ndarray.data包含实际数组元素的缓冲区由于一般通过数组的索引获取元素所以通常不需要使用这个属性。
ndarray.ndim
ndarray.ndim 用于返回数组的维数等于秩。
ndarray.shape
ndarray.shape 表示数组的维度返回一个元组这个元组的长度就是维度的数目即 ndim 属性(秩)。比如一个二维数组其维度表示行数和列数。
ndarray.shape 也可以用于调整数组大小。
ndarray.itemsize
ndarray.itemsize 以字节的形式返回数组中每一个元素的大小。
例如一个元素类型为 float64 的数组 itemsize 属性值为 8(float64 占用 64 个 bits每个字节长度为 8所以 64/8占用 8 个字节又如一个元素类型为 complex32 的数组 item 属性为 432/8。
ndarray.flags
ndarray.flags 返回 ndarray 对象的内存信息
5.NumPy 创建数组
ndarray 数组除了可以使用底层 ndarray 构造器来创建外也可以通过以下几种方式来创建。
numpy.empty
numpy.empty 方法用来创建一个指定形状shape、数据类型dtype且未初始化的数组
numpy.empty(shape, dtype float, order ‘C’)
参数说明
参数描述shape数组形状dtype数据类型可选order有C和F两个选项,分别代表行优先和列优先在计算机内存中的存储元素的顺序。
numpy.zeros
创建指定大小的数组数组元素以 0 来填充
numpy.zeros(shape, dtype float, order ‘C’)
参数说明
参数描述shape数组形状dtype数据类型可选order‘C’ 用于 C 的行数组或者 ‘F’ 用于 FORTRAN 的列数组
numpy.ones
创建指定形状的数组数组元素以 1 来填充
numpy.ones(shape, dtype None, order ‘C’)
参数说明
参数描述shape数组形状dtype数据类型可选order‘C’ 用于 C 的行数组或者 ‘F’ 用于 FORTRAN 的列数组
6.NumPy 从已有的数组创建数组
本章节我们将学习如何从已有的数组创建数组。
numpy.asarray
numpy.asarray 类似 numpy.array但 numpy.asarray 参数只有三个比 numpy.array 少两个。
numpy.asarray(a, dtype None, order None)
参数说明
参数描述a任意形式的输入参数可以是列表, 列表的元组, 元组, 元组的元组, 元组的列表多维数组dtype数据类型可选order可选有C和F两个选项,分别代表行优先和列优先在计算机内存中的存储元素的顺序。
numpy.frombuffer
numpy.frombuffer 用于实现动态数组。
numpy.frombuffer 接受 buffer 输入参数以流的形式读入转化成 ndarray 对象。
numpy.frombuffer(buffer, dtype float, count -1, offset 0) **注意**buffer 是字符串的时候Python3 默认 str 是 Unicode 类型所以要转成 bytestring 在原 str 前加上 b。 参数说明
参数描述buffer可以是任意对象会以流的形式读入。dtype返回数组的数据类型可选count读取的数据数量默认为-1读取所有数据。offset读取的起始位置默认为0。
numpy.fromiter
numpy.fromiter 方法从可迭代对象中建立 ndarray 对象返回一维数组。
numpy.fromiter(iterable, dtype, count-1)
参数描述iterable可迭代对象dtype返回数组的数据类型count读取的数据数量默认为-1读取所有数据
7.NumPy 从数值范围创建数组
这一章节我们将学习如何从数值范围创建数组。
numpy.arange
numpy 包中的使用 arange 函数创建数值范围并返回 ndarray 对象函数格式如下
numpy.arange(start, stop, step, dtype)
根据 start 与 stop 指定的范围以及 step 设定的步长生成一个 ndarray。
参数说明
参数描述start起始值默认为0stop终止值不包含step步长默认为1dtype返回ndarray的数据类型如果没有提供则会使用输入数据的类型。
numpy.linspace
numpy.linspace 函数用于创建一个一维数组数组是一个等差数列构成的格式如下
np.linspace(start, stop, num50, endpointTrue, retstepFalse, dtypeNone)
参数说明
参数描述start序列的起始值stop序列的终止值如果endpoint为true该值包含于数列中num要生成的等步长的样本数量默认为50endpoint该值为 true 时数列中包含stop值反之不包含默认是True。retstep如果为 True 时生成的数组中会显示间距反之不显示。dtypendarray 的数据类型
numpy.logspace
numpy.logspace 函数用于创建一个于等比数列。格式如下
np.logspace(start, stop, num50, endpointTrue, base10.0, dtypeNone)
base 参数意思是取对数的时候 log 的下标。
参数描述start序列的起始值为base ** startstop序列的终止值为base ** stop。如果endpoint为true该值包含于数列中num要生成的等步长的样本数量默认为50endpoint该值为 true 时数列中中包含stop值反之不包含默认是True。base对数 log 的底数。dtypendarray 的数据类型
8.NumPy 切片和索引
ndarray对象的内容可以通过索引或切片来访问和修改与 Python 中 list 的切片操作一样。ndarray 数组可以基于 0 - n 的下标进行索引切片对象可以通过内置的 slice 函数并设置 start, stop 及 step 参数进行从原数组中切割出一个新数组。实例 import numpy as np a np.arange(10) s slice(2,7,2) # 从索引 2 开始到索引 7 停止间隔为2 print (a[s])
输出结果为
[2 4 6]
以上实例中我们首先通过 arange() 函数创建 ndarray 对象。 然后分别设置起始终止和步长的参数为 27 和 2。
我们也可以通过冒号分隔切片参数 start:stop:step 来进行切片操作实例 import numpy as np a np.arange(10) b a[2:7:2] # 从索引 2 开始到索引 7 停止间隔为 2 print(b)
输出结果为
[2 4 6]
冒号 : 的解释如果只放置一个参数如 [2]将返回与该索引相对应的单个元素。如果为 [2:]表示从该索引开始以后的所有项都将被提取。如果使用了两个参数如 [2:7]那么则提取两个索引(不包括停止索引)之间的项。实例 import numpy as np a np.arange(10) # [0 1 2 3 4 5 6 7 8 9] b a[5] print(b)
输出结果为5
9.NumPy 高级索引
NumPy 比一般的 Python 序列提供更多的索引方式。
除了之前看到的用整数和切片的索引外数组可以由整数数组索引、布尔索引及花式索引。
NumPy 中的高级索引指的是使用整数数组、布尔数组或者其他序列来访问数组的元素。相比于基本索引高级索引可以访问到数组中的任意元素并且可以用来对数组进行复杂的操作和修改。
整数数组索引
整数数组索引是指使用一个数组来访问另一个数组的元素。这个数组中的每个元素都是目标数组中某个维度上的索引值。
以下实例获取数组中 (0,0)(1,1) 和 (2,0) 位置处的元素
实例 import numpy as np x np.array([[1, 2], [3, 4], [5, 6]]) y x[[0,1,2], [0,1,0]] print (y)
输出结果为
[1 4 5]
布尔索引
我们可以通过一个布尔数组来索引目标数组。
布尔索引通过布尔运算如比较运算符来获取符合指定条件的元素的数组。
以下实例获取大于 5 的元素
实例 import numpy as np x np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print (‘我们的数组是’) print (x) print (‘\n’) # 现在我们会打印出大于 5 的元素 print (‘大于 5 的元素是’) print (x[x 5])
输出结果为
我们的数组是[[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]]
大于 5 的元素是[ 6 7 8 9 10 11]
10.NumPy 迭代数组
NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。
迭代器最基本的任务的可以完成对数组元素的访问。
接下来我们使用 arange() 函数创建一个 2X3 数组并使用 nditer 对它进行迭代。
实例 import numpy as np a np.arange(6).reshape(2,3) print (‘原始数组是’) print (a) print (‘\n’) print (‘迭代输出元素’) for x in np.nditer(a): print (x, end, ) print (‘\n’)
输出结果 原始数组是 [[0 1 2] [3 4 5]] 迭代输出元素 0, 1, 2, 3, 4, 5,
修改数组中元素的值
nditer 对象有另一个可选参数 op_flags。 默认情况下nditer 将视待迭代遍历的数组为只读对象read-only为了在遍历数组的同时实现对数组元素值的修改必须指定 readwrite 或者 writeonly 的模式。
实例 import numpy as np a np.arange(0,60,5) a a.reshape(3,4) print (‘原始数组是’) print (a) print (‘\n’) for x in np.nditer(a, op_flags[‘readwrite’]): x[…]2*x print (‘修改后的数组是’) print (a)
输出结果为 原始数组是[[ 0 5 10 15] [20 25 30 35] [40 45 50 55]] 修改后的数组是[[ 0 10 20 30] [ 40 50 60 70] [ 80 90 100 110]]
使用外部循环
nditer 类的构造器拥有 flags 参数它可以接受下列值
参数描述c_index可以跟踪 C 顺序的索引f_index可以跟踪 Fortran 顺序的索引multi_index每次迭代可以跟踪一种索引类型external_loop给出的值是具有多个值的一维数组而不是零维数组 import numpy as np a np.arange(0,60,5) a a.reshape(3,4) print (原始数组是)print (a)print (\n)print (修改后的数组是)for x in np.nditer(a, flags [external_loop], order F): print (x, end, )输出结果 原始数组是 [[ 0 5 10 15] [20 25 30 35] [40 45 50 55]] 修改后的数组是 [ 0 20 40], [ 5 25 45], [10 30 50], [15 35 55],
11.Numpy数组操作
修改数组形状
函数描述reshape不改变数据的条件下修改形状flat数组元素迭代器flatten返回一份数组拷贝对拷贝所做的修改不会影响原始数组ravel返回展开数组
numpy.reshape
numpy.reshape 函数可以在不改变数据的条件下修改形状格式如下
numpy.reshape(arr, newshape, order‘C’)
arr要修改形状的数组newshape整数或者整数数组新的形状应当兼容原有形状order‘C’ – 按行‘F’ – 按列‘A’ – 原顺序‘k’ – 元素在内存中的出现顺序
numpy.ndarray.flatten
numpy.ndarray.flatten 返回一份数组拷贝对拷贝所做的修改不会影响原始数组格式如下
ndarray.flatten(order‘C’)
numpy.ravel
numpy.ravel() 展平的数组元素顺序通常是C风格返回的是数组视图view有点类似 C/C引用reference的意味修改会影响原始数组。
该函数接收两个参数
numpy.ravel(a, order‘C’)
参数说明
order‘C’ – 按行‘F’ – 按列‘A’ – 原顺序‘K’ – 元素在内存中的出现顺序。
翻转数组
函数描述transpose对换数组的维度ndarray.T和 self.transpose() 相同rollaxis向后滚动指定的轴swapaxes对换数组的两个轴
numpy.transpose
numpy.transpose 函数用于对换数组的维度格式如下
numpy.transpose(arr, axes)
参数说明:
arr要操作的数组axes整数列表对应维度通常所有维度都会对换。
numpy.rollaxis
numpy.rollaxis 函数向后滚动特定的轴到一个特定位置格式如下
numpy.rollaxis(arr, axis, start)
参数说明
arr数组axis要向后滚动的轴其它轴的相对位置不会改变start默认为零表示完整的滚动。会滚动到特定位置。
numpy.swapaxes
numpy.swapaxes 函数用于交换数组的两个轴格式如下
numpy.swapaxes(arr, axis1, axis2)
arr输入的数组axis1对应第一个轴的整数axis2对应第二个轴的整数
准备工作
安装pycharm和需要的软件包来进行代码的编辑
直接编辑代码导入然后进行包的下载
小插曲
下载包的时候一直报错
去查询了一下报错原因pip安装报403错误 解决方法
于是我就把镜像地址又改了回来
pip config set global.index-url https://pypi.python.org/simple/当然最后我检查了大概不是清华园的问题也可能是
是pycharm本身的pip没有更新的问题
在这里更新完后就没有这个问题了不用更改清华园的镜像 可以先更新一下项目pip如果还是不对就把镜像地址改回来
numpy包
这里numpy是在python处理大数据学过的一个库
对应OpenCv来说
使用Python运行OpenCV的程序时OpenCV使用NumPy数组存储图像数据。基于NumPy可以很方便的执行基于数组的图像运算比如图像的加法运算、加权加法运算和位运算等。
图像处理
颜色转换
cvtColor函数
dstcv2.cvtColor(src,code[, dst[, dstCn]])其中
dstdestination就表示我们经过函数处理后得到的目的图像此时是矩阵形式
srcsource表示我们要进行转换的源图像对象也是矩阵形式
code是opencv中色彩空间定义的宏常量展示了我们要图像转换所要达到的结果常用的有COLOR_BGR2GRAY、COLOR_GRAY2BGR、COLOR_BGR2HSV、COLOR_BGR2RGB等但是实际上可以调用的参数多达247种。
dstCn为目标图像的通道数如果设置为0会自动从源图像计算目标图像的通道数
以下是代码实例 from numpy import *import numpy as npimport cv2# 将图片转为灰度图src_image cv2.imread(test.jpg)gray_imagee cv2.cvtColor(src_image, cv2.COLOR_BGR2GRAY)# 将图片转为HSVhsv_image cv2.cvtColor(src_image, cv2.COLOR_BGR2HSV)# 展示一下cv2.imshow(src_image, src_image)cv2.imshow(gary_image, gray_imagee)cv2.imshow(hsv_image, hsv_image)cv2.waitKey(0)src_iamge
hsv_image gary_iamge 这样显示在显示器有点大也可以写入
通过cv2.imwrite(“1.jpg”,hsv_iamge)函数来进行文件的保存然后查看会好一点
画矩形
rectangle()用法 cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift)参数说明 img在哪个图像上画线 pt1, pt2开始点 结束点指定线的开始与结束位置 color颜色 (0, 0, 255)红 (0, 255, 0)绿 (255, 0, 0)蓝 thickness线宽 lineType线型可取值-1, 4, 8, 18, 默认为8 shift坐标缩放比例
代码 # 画矩形img np.zeros((480, 640, 3), np.uint8)cv2.rectangle(img, (20, 20), (400, 400), (0, 255, 0), 5)cv2.imshow(draw, img)cv2.waitKey(0)cv2.destroyAllWindows()效果展示 画圆
circle()用法
cv2.circle()(img, center, radius, color, thickness, lineType, shift)参数说明 img在哪个图像上绘制圆 center圆心坐标 radius半径大小 color颜色 thickness线宽 lineType线型 shift坐标缩放比例
代码 # 画圆img np.zeros((480, 640, 3), np.uint8)cv2.circle(img, (320, 240), 100, (255, 0, 0), 5, 16)cv2.imshow(draw, img)cv2.waitKey(0)cv2.destroyAllWindows()效果展示 画椭圆
ellipse()用法
cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness, lineType, shift)参数说明 img在哪个图像上绘制椭圆 center中心点 axes长宽的一半 angle角度 startAngle从哪个角度开始 endAngle从哪个角度结束 color颜色 thickness线宽 lineType线型 shift坐标缩放比例
代码 # 画椭圆img np.zeros((480, 640, 3), np.uint8)cv2.ellipse(img, (320, 240), (100, 50), 0, 0, 360, (255, 255, 255), 5, 16)cv2.imshow(draw, img)cv2.waitKey(0)cv2.destroyAllWindows()效果展示
画线段
line()用法
cv2.line(img, pt1, pt2, color, thickness, lineType, shift)参数说明 line()用法和rectangle()用法 完全一致。 代码 # 画线段img np.zeros((480, 640, 3), np.uint8)# 划线, 坐标点(x, y)cv2.line(img, (20, 20), (400, 400), (0, 0, 255), 5, 16)cv2.imshow(draw, img)cv2.waitKey(0)cv2.destroyAllWindows()效果展示 画和填充多边形
polylines()绘制多边形
cv2.polylines(img, pts, isClosed, color, thickness, lineType, shift)参数说明 img在哪个图像上绘制和填充多边形 pts多边形的点集必须是int32位 isClosed是否闭合 color颜色 thickness线宽 lineType线型 shift坐标缩放比例
代码 img np.zeros((480, 640, 3), np.uint8)pts np.array([(300, 10), (150, 100), (450, 100)], np.int32)cv2.polylines(img, [pts], True, (0, 255, 255), 5, 16)cv2.imshow(draw, img)cv2.waitKey(0)cv2.destroyAllWindows()效果展示 fillPoly填充多边形
cv2.fillPoly(img, pts, color)fillPoly用法 和 polylines用法 完全一致。 代码 img np.zeros((480, 640, 3), np.uint8)pts np.array([(300, 10), (150, 100), (450, 100)], np.int32)cv2.fillPoly(img, [pts], (0, 255, 255), 16)cv2.imshow(draw, img)cv2.waitKey(0)cv2.destroyAllWindows()效果展示 绘制文字
putText绘制文字 putText(img,text,org,fontFace,fontScale,color,thickness,lineType,bottomLeftOrigin)参数说明 text要绘制的文字内容 org 文字在画布中的左下角坐标 fontFace 字体样式 fontScale 字体大小 lineType 线型 bottomLeftOrigin 绘制文字时的方向
代码 import numpy as np # 导入Python中的numpy模块import cv2# np.zeros()创建了一个画布# (100, 300, 3)一个100 x 300具有3个颜色空间即Red、Green和Blue的画布# np.uint8OpenCV中的灰度图像和RGB图像都是以uint8存储的因此这里的类型也是uint8canvas np.zeros((100, 300, 3), np.uint8)# 在画布上绘制文字“mrsoft”文字左下角的坐标为(20, 70)# 字体样式为FONT_HERSHEY_TRIPLEX# 字体大小为2线条颜色是绿色线条宽度为5cv2.putText(canvas, sorry, (20, 70), cv2.FONT_HERSHEY_TRIPLEX, 2, (0, 255, 0), 5)cv2.imshow(Text, canvas) # 显示画布cv2.waitKey()cv2.destroyAllWindows()效果展示 为图像添加边框
copyMakeBorder为图像添加边框 cv.copyMakeBorder(src, top, bottom, left, right, borderType, None, value)参数说明 src: 即将被扩充边界的原始图像 top, bottom, left, right: 在图像上、下、左、右分别要扩充的行(列)数 borderType: 扩充的边界类型 cv2.BORDER_CONSTANT: 用常数像素值填充扩充的边界(0或黑色) cv2.BORDER_REPLICATE: 原始边缘的行或列被复制到扩充的边界 value: 当使用cv.BORDER_CONSTANT时设置的要填充的像素值
代码 import cv2import numpy as npfrom matplotlib import pyplot as pltBLUE [255, 0, 0]img1 cv2.imread(test.jpg)replicate cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_REPLICATE)reflect cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_REFLECT)reflect101 cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_REFLECT_101)wrap cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_WRAP)constant cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_CONSTANT, valueBLUE)plt.subplot(231), plt.imshow(img1, gray), plt.title(ORIGINAL)plt.subplot(232), plt.imshow(replicate, gray), plt.title(REPLICATE)plt.subplot(233), plt.imshow(reflect, gray), plt.title(REFLECT)plt.subplot(234), plt.imshow(reflect101, gray), plt.title(REFLECT_101)plt.subplot(235), plt.imshow(wrap, gray), plt.title(WRAP)plt.subplot(236), plt.imshow(constant, gray), plt.title(CONSTANT)plt.show()效果展示 轮廓检测和画出轮廓
findContours:轮廓检测
contours,hierarchy cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]]) 参数说明 image参数是寻找轮廓的图像 mode参数表示轮廓的检索模式有四种本文介绍的都是新的cv2接口 cv2.RETR_EXTERNAL表示只检测外轮廓 cv2.RETR_LIST检测的轮廓不建立等级关系 cv2.RETR_CCOMP建立两个等级的轮廓上面的一层为外边界里面的一层为内孔的边界信息。如果内孔内还有一个连通物体这个物体的边界也在顶层。 cv2.RETR_TREE建立一个等级树结构的轮廓。 method轮廓的近似办法 cv2.CHAIN_APPROX_NONE存储所有的轮廓点相邻的两个点的像素位置差不超过1即maxabsx1-x2absy2-y11 cv2.CHAIN_APPROX_SIMPLE压缩水平方向垂直方向对角线方向的元素只保留该方向的终点坐标例如一个矩形轮廓只需4个点来保存轮廓信息 cv2.CHAIN_APPROX_TC89_L1CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法
返回值
cv2.findContours()函数返回两个值一个是轮廓本身还有一个是每条轮廓对应的属性。 contour返回值 返回一个listlist中每个元素都是图像中的一个轮廓用numpy中的ndarray表示。 hierarchy返回值 返回一个ndarray其中的元素个数和轮廓个数相同每个轮廓 c o n t o u r s [ i ] contours[i] contours[i]对应4个hierarchy元素 h i e r a r c h y [ i ] [ 0 ] h i e r a r c h y [ i ] [ 3 ] hierarchy[i][0] ~hierarchy[i][3] hierarchy[i][0] hierarchy[i][3]分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号如果没有对应项则该值为负数
drawContours画出轮廓
drawContours(image, contours, contourIdx, color, thicknessNone, lineTypeNone, hierarchyNone, maxLevelNone, offsetNone):参数说明 Image:输入原始的图像 Contours:坐标点这个根据查找轮廓函数即可得到 contourIdx设置轮廓的顺序号-1表示绘制所有的轮廓 Color:绘制使用的颜色 Thickness:绘制使用的线宽-1表示全部填充 lineType:绘制使用的线类型 Hierarchy:设置层级 maxLevel:如果为0则仅绘制指定的轮廓。 如果为1则函数将绘制轮廓和所有嵌套轮廓。如果为2则函数绘制等高线、所有嵌套等高线、所有嵌套到嵌套等高线等等。这仅当存在可用的层次结构时才考虑参数。 Offset:将所有绘制的轮廓移动指定的量。
代码 import cv2img cv2.imread(test.jpg)gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)ret, binary cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# 检测轮廓contours, hierarchy cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)# 画轮廓cv2.drawContours(img, contours, -1, (0, 0, 255), 3)cv2.imshow(img, img)cv2.waitKey(0)效果展示 四、实验结果
实验结果已经在实验过程中写出实验结果的所有截图均可在实验过程中查看这里不做过多展示
五、实验结论
在本实验中涵盖了NumPy数组操作和OpenCV图像处理两个重要方面。在NumPy数组操作部分学到了如何使用 NumPy 创建各种类型的数组包括一维数组、二维数组等以及如何访问和修改数组中的元素,了解了数组对象的一些属性比如形状、大小等以及数组对象的一些方法比如求和、平均值、最大值、最小值等,学习了如何改变数组的形状包括改变维度、转置数组、重塑数组等操作通过学习 reshape、transpose、rollaxis、swapaxes 等函数实现了这些操作,以及掌握了如何使用索引和切片对数组进行元素的访问和修改包括基本索引、切片索引、布尔索引等方法。在opencv图像处理部分了解了如何在OpenCV中实现图像的颜色空间转换这对于图像处理中很多任务都是必不可少的学习到如何在图像上绘制基本的几何图形在图像上添加文字以及如何为图像添加边框以及使用OpenCV查找图像中的轮廓对OpenCV图像处理模块的功能和应用有了更深入的理解。通过本实验的学习深入理解了 NumPy 数组的概念、数组的重塑和操作方法加深了对数组运算和操作的理解。同时还学习了OpenCV图像处理模块的功能和应用掌握了实现颜色变换、绘制基本图形、文字绘制、为图像添加边框以及在图像中查找轮廓等技术。为后续更复杂的数据、图像处理和科学计算打下了良好的基础。