【OpenCV入门】第二部分——Numpy模块

news2024/11/27 9:17:19

写在前面: 这个部分是Numpy模块与OpenCV有关的部分。如果想了解Numpy库是什么,或者想要直接单独学习Numpy库,可以看看我以前写的这篇Numpy学习笔记。一些内容如数组类型、数组创建、数组运算和数组索引在链接文章里有,就不在这里赘述了。

文章结构

  • 创建图像
    • 创建黑白图像
    • 创建彩色图像
    • 创建随机图像
  • 拼接图像
    • 水平拼接数组
    • 垂直拼接数组
    • 在图像处理中的应用

创建图像

在OpenCV中,黑白图像实际上就是一个二维数组,彩色图像是一个三维数组,数组中每个元素就是图像对应位置的像素值。因此,修改图像像素的操作实际上就是修改数组的操作。

  • 数组行索引 = 像素所在行数 - 1 = 像素纵坐标
  • 数组列索引 = 像素所在行数 - 1 = 像素横坐标

创建黑白图像

在黑白图像中,像素值为0表示黑色,像素值为255表示白色。

实例1: 创建纯黑色图像
创建一个100行、200列(即宽200、高100)的数组,数组元素格式为无符号8位整数,用0填充整个数组,将该数组当作图像显示出来,查看显示的结果。

import cv2
import numpy as np

width = 200
height = 100

img = np.zeros((height, width), np.uint8)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:
在这里插入图片描述
创建纯白图像有两种方式:第一种是线创建纯黑图像,然后将图像中所有的像素值改为255;第二种使用NumPy提供的ones()方法创建一个像素值均为1的数组,然后让数组乘以255,同样可以得到一个纯白色的图像。

实例2: 创建纯白色图像
创建一个100行、200列(即宽200、高100)的数组,数组元素格式为无符号8位整数,用1填充整个数组,然后让数组乘以255,最后将该数组当作图像显示出来,查看显示的结果。

import cv2
import numpy as np

width = 200
height = 100

img = np.ones((height, width), np.uint8)*255
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:
在这里插入图片描述

通过切片式索引操作可以修改图像中指定区域内的像素,以达到修改图像内容的效果。

实例3: 在黑色图像内部绘制白色矩形
先绘制纯黑色图像作为背景,然后使用切片式索引将图像中横坐标为50 ~ 100、纵坐标为25 ~ 75的矩形区域颜色改为纯白色。

import cv2
import numpy as np

width = 200
height = 100

img = np.zeros((height, width), np.uint8)  # 创建指定宽高、单通道,像素值都为0的图像
img[25:75, 50:100] = 255  # 图像纵坐标为25~75,横坐标为50~100之间的区域变成白色
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:
在这里插入图片描述

实例4: 创建黑白相间的图像
先绘制纯黑色图像作为背景,然后在循环中使用切片式索引操作绘制成黑白间隔图像。

import cv2
import numpy as np

width = 200
height = 100

img = np.zeros((height, width), np.uint8)  # 创建指定宽高、单通道,像素值都为0的图像
for i in range(0, width, 40):
    img[:, i:i + 20] = 255
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:
在这里插入图片描述

创建彩色图像

显示颜色需要引入光谱三基色的概念,无法用二维数组表示,而是用到三维数组。OpenCV中华彩色图像默认为BGR格式,彩色图像的第三个索引表示的就是蓝、绿、红这三个颜色的颜色分量。

实例5: 创建彩色图像
创建彩色图像数组是将数组创建成三维数组,元素类型仍然为无符号8位整数。创建好表示纯黑色图像的三维数组后,复制出三个副本,三个副本分别修改最后一个索引代表的元素值。根据BGR的顺序,索引0表示蓝色分量,索引1表示绿色分量,索引2表示红色分量,让三个副本分别显示纯蓝色、纯绿色和纯红色。

import cv2
import numpy as np

width = 200
height = 100

img = np.zeros((height, width, 3), np.uint8)  # 创建指定宽高、3通道,像素值都为0的图像
blue = img.copy()
blue[:, :, 0] = 255  # 1通道所有像素都为255
green = img.copy()
green[:, :, 1] = 255  # 2通道所有像素都为255
red = img.copy()
red[:, :, 2] = 255  # 3通道所有像素都为255
cv2.imshow("blue", blue)
cv2.imshow("green", green)
cv2.imshow("red", red)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:
在这里插入图片描述

创建随机图像

随机图像是指图像中每一个像素值都是随机生成的,因为像素之间不会组成有效的视觉信息,所以这样的图像看上去就像杂乱无章的沙子。虽然随机图像没有任何视觉信息,但对于图像处理技术仍然很重要,毫无规律的像素数组称为干扰图像的噪声,或者当作图像加密的密钥。

实例6: 创建随机像素的雪花点图像
使用random.randint()方法就可以创建随机数组,将随机值的取值范围定在0 ~ 256之间(即像素值范围),元素类型定为无符号8位整数。

import cv2
import numpy as np

width = 200
height = 100

img = np.random.randint(256,size=(height,width),dtype=np.uint8) # 创建指定宽高、单通道、随机像素值的图像,随机值在0~256之间,数字为无符号8位整数
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:
在这里插入图片描述
如果改成:

img = np.random.randint(256,size=(height,width,3),dtype=np.uint8) # 创建指定宽高、3通道、随机像素值的图

结果如下:
在这里插入图片描述

拼接图像

水平拼接数组

hstack()方法可以对数组进行水平拼接(或叫横向拼接)

array = numpy.hstack(tup)
  • tup: 要拼接的数组元组
  • array: 将参数元组中的数组水平拼接后生成的新数组

hstack()方法可以拼接多个数组,拼接效果如下所示。被拼接的数组必须在每一个维度都具有相同的长度,也就是数组“形状相同”。
在这里插入图片描述
例如,创建三个一维数组,将这三个数组进行水平拼接:

import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.array([7,8,9])
result = np.hstack((a,b,c))
print(result)

结果如下:
在这里插入图片描述

垂直拼接数组

vstack()方法可以对数组进行垂直拼接(或叫纵向拼接)

array = numpy.vstack(tup)
  • tup: 要拼接的数组元组
  • array: 将参数元组中的数组垂直拼接后生成的新数组

在这里插入图片描述

例如,创建三个一维数组,将这三个数组进行垂直拼接:

import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.array([7,8,9])
result = np.vstack((a,b,c))
print(result)

结果如下:
在这里插入图片描述

在图像处理中的应用

在OpenCV中,图像就是一个二维或三维的像素数组,这些数组同样可以被NumPy拼接。

实例7: 按照水平和垂直两种方式拼接两个图像

import cv2
import numpy as np

img = cv2.imread("1.jpg")

img_h = np.hstack((img, img))
img_v = np.vstack((img, img))

cv2.imshow("img_h", img_h)
cv2.imshow("img_v", img_v)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

SQL注入绕过实战案例一

目录 一、SQL-LAB靶场搭建 1、搭建环境 2、开启nginx和mysql 3、将下载好的sal-labs靶场将压缩文件解压至phpstudy的www目录下 4、查看mysql密码,将其修改值靶场配置文件中 5、配置网站 6、完成后我们就可以在浏览器输入127.0.0.1:8090进入靶场 二…

vue 打印

vue-print-nb插件使用 vue 打印 vue-print-nb - 简书 1、media print 内样式无效问题 <style lang"scss"> media print {} </style> style上不能加scoped; 2、分页问题 A4纸的长宽&#xff1a;210mm297mm&#xff0c;css中支持mm单位&#xff0c;可…

室内外高精度融合定位模块UWB+RTK

UWBRTK融合定位模块是华星智控自主研发的一款用于实现室内外高精度融合定位的模块。 UWB&#xff08;Ultra-Wideband&#xff09;&#xff1a;UWB是一种无线通信技术&#xff0c;它利用非常宽的频带来传输数据。UWB技术可以提供非常精确的距离测量&#xff0c;因为它能够以极短…

【20期】说一说Java引用类型原理

Java中一共有4种引用类型(其实还有一些其他的引用类型比如FinalReference)&#xff1a;强引用、软引用、弱引用、虚引用。 其中强引用就是我们经常使用的Object a new Object(); 这样的形式&#xff0c;在Java中并没有对应的Reference类。 本篇文章主要是分析软引用、弱引用、…

小狐狸ChatGPT付费创作系统V2.2.4独立版 +WEB端+ H5端 + 小程序端(免授权去后门弹窗)安装教程

播播资源提供的小狐狸ChatGPT付费创作系统V2.2.4相比上一版h5适配普通手机浏览器&#xff0c;gpt4的接口openai改成自定义&#xff0c;以支持更多三方接口。因绘画效果不好&#xff0c;移出绘画接口openai和replicate&#xff0c;AI参数设置处的openai改成自定义&#xff0c;pc…

【Flutter】Flutter 使用 badges 实现创建数字徽章

【Flutter】Flutter 使用 badges 实现创建数字徽章 文章目录 一、前言二、安装与基本使用三、徽章的高级用法四、徽章的动画效果五、徽章的形状六、完整的实际业务代码示例七、总结 一、前言 你好&#xff01;今天我要为你介绍一个非常实用的 Flutter 包——badges。这个包可以…

QTableView合并单元格

QtableView的功能 QTableView是Qt框架提供的用于显示表格数据的类。它是基于MVC&#xff08;模型-视图-控制器&#xff09;设计模式的一部分&#xff0c;用于将数据模型和界面视图分离。 以下是一些QTableView的主要特点和功能&#xff1a; 1. 显示表格数据&#xff1a; QTa…

CPU 伪共享是如何发生的?又该如何避免?

CPU 如何读写数据的&#xff1f; 先来认识一下 CPU 的架构 一个 CPU 里通常会有多个 CPU 核心&#xff0c;并且每个 CPU 核心都有自己的 L1 Cache 和 L2 Cache&#xff0c;而 L1 Cache 通常分为&#xff08;数据缓存&#xff09;和&#xff08;指令缓存&#xff09;&#xff0…

空间曲线的参数方程

空间曲线的参数方程 二维直线 经过一点 P ( x 0 &#xff0c; y 0 ) P(x_0&#xff0c;y_0) P(x0​&#xff0c;y0​)的方向向量为 n ( c o s θ &#xff0c; s i n θ ) n(cos\theta&#xff0c;sin\theta) n(cosθ&#xff0c;sinθ)的直线参数方程为&#xff1a; [ x y …

如何创建一个自己的sphinx文档网站

文章目录 前言一、操作步骤1.安装anaconda2.启动python3.8环境3.安装Sphinx4.创建文件夹5.初始化环境6. 编译7.文件夹搭查看8.搭建nginx查看8. 更换主题9.错误修复10.这里提供两个模板1.Demo_md2.Demo_rst前言 最近看到公司的文档中心,突然想起,为什么不为自己创建一个文档中…

maven依赖,继承

依赖的范围 compile引入的依赖 对main目录下的代码有没有效&#xff0c;main目录下的代码能不能用compile引入的依赖中的类等 以test引入的依赖&#xff0c;在main中是否可以使用 provided&#xff08;已提供&#xff09;&#xff0c;有了就不要带到服务器上&#xff0c;打包…

OLED透明屏原彩优势和特点解析:开创显示技术新时代

OLED透明屏 原彩作为一项领先的显示技术&#xff0c;正以其卓越的性能和创新的设计特点引起广泛关注。 本文将通过深入探讨OLED透明屏 原彩的优势和特点、应用领域、技术发展以及未来前景等方面内容&#xff0c;并结合具体数据、报告和行业动态&#xff0c;为读者提供专业可信…

Dubbo 接口测试原理及多种方法实践总结

1、什么是 Dubbo&#xff1f; Dubbo 最开始是应用于淘宝网&#xff0c;由阿里巴巴开源的一款优秀的高性能服务框架&#xff0c;由 Java 开发&#xff0c;后来贡献给了 Apache 开源基金会组织。 下面以官网的一个说明来了解一下架构的演变过程&#xff0c;从而了解 Dubbo 的诞…

ClickHouse进阶(八):Clickhouse数据查询-2- Join子句

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &#x1f4cc;订阅…

Unity3D开发流程及注意事项

使用Unity3D开发游戏需要遵循一定的流程和注意事项&#xff0c;以确保项目的顺利进行并获得良好的结果。以下是一般的游戏开发流程以及一些注意事项&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 游…

【笔记】软件测试的艺术

软件测试的心理学和经济学 测试是为发现错误而执行程序的过程&#xff0c;所以它是一个破坏性的过程&#xff0c;测试是一个“施虐”的过程。 软件测试的10大原则 1、测试用例需要对预期输出的结果有明确的定义 做这件事的前提是能够提前知晓需求和效果图&#xff0c;如果不…

测评补单成为亚马逊、速卖通等跨境电商趋势:解析需求背后的原因

今天就不分享测评技术知识点了&#xff0c;来聊一聊如今做跨境电商为什么对测评补单有这么大的需求。 如今在跨境电商行业&#xff0c;测评补单的需求日益增长&#xff0c;尽管平台一直对其进行禁止。这主要是出于以下几方面的原因&#xff0c;使得测评越来越成为一种趋势&…

方案展示 | RK3588开发板Linux双摄同显方案

iTOP-RK3588开发板使用手册更新&#xff0c;后续资料会不断更新&#xff0c;不断完善&#xff0c;帮助用户快速入门&#xff0c;大大提升研发速度。 RK3588开发板载4路MIPI CAMERA摄像头接口、MIPI CSI DPHY的4.5Gbps、2.5Gops的MIPI CSI CPHY&#xff0c;四路同时输入&#xf…

每天一个工业通信协议(2)2023.8.28 (CAN协议)

文章目录 参考资料1.CAN协议介绍2.CAN的特点3.CAN的通信单元始终处于错误的三种状态之一4.CAN协议的基本概念5.CAN协议的两种ISO标准的不同6.CAN协议6.1 帧的种类6.2 数据帧6.3 遥控帧6.4 错误帧6.5 过载帧参考资料 瑞萨电子《CAN入门书》 1.CAN协议介绍 答: CAN 是 Contro…

编程学习的方向与赛道的选择没有最优解的

听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 跨域学习者,从事过全栈研发、产品经理等工作,现任研发部门 CTO 。荣誉:2022年度博客之星Top4、博客专家认证、全栈领域优质创作者、新星计划导师,“星荐官共赢计…