Python----计算机视觉处理(opencv:像素,RGB颜色,图像的存储,opencv安装,代码展示)

一、计算机眼中的图像

像素

        像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。一系列像素组合到一起就形成 了完整的图像,在计算机中,图像以像素的形式存在并采用二进制格式进行存储。根据图像的颜色不 同,每个像素可以用不同的二进制数表示。

        日常生活中常见的图像是RGB三原色图。RGB图上的每个点都是由红(R)、绿(G)、蓝(B)三个颜 色按照一定比例混合而成的,几乎所有颜色都可以通过这三种颜色按照不同比例调配而成。在计算机 中,RGB三种颜色被称为RGB三通道,根据这三个通道存储的像素值,来对应不同的颜色。例如,在使 用“画图”软件进行自定义调色时,其数值单位就是像素。

二、RGB颜色

三、计算机中图像的存储

        在计算机中,图像都是以数组的形式存在的。一个RGB图像放到内存中就是一个 三维数组,其中第一维表示图像的宽度,第二维表示图像的高度,第三维则是图 像中每一个像素点的RGB三个像素值,但是在OpenCV中像素值的存储顺序是 BGR而不是RGB。

计算机处理图像本质上就是对三维数组中的像素值进行操作。

四、opencv安装

pip install opencv-python

官方网址

OpenCV - Open Computer Vision Library

五、图形绘画

        主要功能是生成一个700x700的图像,其上绘制了网格线和交叉的红色方块,并分别提取了该图像的RGB通道。最后,使用Matplotlib库显示了整个图像和各个分离的通道。

5.1、导入模块

import cv2  # 导入OpenCV库,用于图像处理  
import numpy as np  # 导入NumPy库,用于数组和矩阵操作  
from matplotlib import pyplot as plt  # 导入Matplotlib库,用于绘图  

5.2、创建图像

创建一个空白的 700x700 彩色图像

# 创建一个700x700的黑色图像,包含三个颜色通道(RGB)  
image = np.zeros((700, 700, 3), dtype=np.uint8)  

5.3、为图像添加色彩

# 使用双层循环在图像上绘制网格和交叉的红色方块  
for i in range(0, 700, 100):  # 外层循环,步长为100,从0到600  for j in range(0, 700, 100):  # 内层循环,同样步长为100  # 绘制水平网格线  image[i, :, :] = (255, 255, 255)  # 将第i行的所有像素设为白色  # 绘制垂直网格线  image[:, j, :] = (255, 255, 255)  # 将第j列的所有像素设为白色  # 绘制交叉的红色方块  if i != 0 and j != 0 and i != 600 and j != 600 and (i == j or i + j == 600):  image[i:i+100, j:j+100, :] = (0, 0, 255)  # 将指定区域设为红色  

 另一种方式

for i in range(0, 700, 100):for j in range(0, 700, 100):top_left=(j,i)botton_right=(j+99,i+99)if i!=0 and i!=600  and (i==j or i+j==600):cv2.rectangle(image,top_left,botton_right,(0,0,255),-1)else:cv2.rectangle(image,top_left,botton_right,(255,255,255),1) 

5.4、将BGR转化为RGB

# 将BGR格式的图像转换为RGB格式,以便正确显示  
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  

5.5、分割RGB通道

# 分离图像的红、绿、蓝通道  
r, g, b = cv2.split(image_rgb)  

5.6、对三通道进行操作

# 创建三个单独的通道图像,初始为全零(黑色)  
blue_channel = np.zeros((700, 700, 3), dtype=np.uint8)  # 蓝色通道  
green_channel = np.zeros((700, 700, 3), dtype=np.uint8)  # 绿色通道  
red_channel = np.zeros((700, 700, 3), dtype=np.uint8)  # 红色通道  # 将分离出的通道放入对应的通道图像中  
blue_channel[:, :, 0] = b  # 将蓝色通道的值放入蓝色通道图像的第一个通道  
green_channel[:, :, 1] = g  # 将绿色通道的值放入绿色通道图像的第二个通道  
red_channel[:, :, 2] = r  # 将红色通道的值放入红色通道图像的第三个通道  # 将单独的通道图像转换为RGB格式  
blue_channel_rgb = cv2.cvtColor(blue_channel, cv2.COLOR_BGR2RGB)  
green_channel_rgb = cv2.cvtColor(green_channel, cv2.COLOR_BGR2RGB)  
red_channel_rgb = cv2.cvtColor(red_channel, cv2.COLOR_BGR2RGB)  

5.7、通过matplotlib显示图像

plt.subplot(232)  # 在2行3列的网格中,放置第2个子图(1-indexed)  
plt.imshow(image_rgb)  # 显示原始的RGB图像  
plt.axis('off')  # 关闭坐标轴  plt.subplot(234)  # 在2行3列的网格中,放置第4个子图  
plt.imshow(blue_channel_rgb)  # 显示蓝色通道图像  
plt.axis('off')  # 关闭坐标轴  plt.subplot(235)  # 在2行3列的网格中,放置第5个子图  
plt.imshow(green_channel_rgb)  # 显示绿色通道图像  
plt.axis('off')  # 关闭坐标轴  plt.subplot(236)  # 在2行3列的网格中,放置第6个子图  
plt.imshow(red_channel_rgb)  # 显示红色通道图像  
plt.axis('off')  # 关闭坐标轴  plt.tight_layout()  # 自动调整子图参数,以便给子图留出更合适的空间  
plt.show()  # 显示所有绘制的图像  

5.8、通过cv显示图像

cv2.imshow('image_rgb', image)  cv2.waitKey(0)  # 等待用户按键

5.9、完整代码 

import cv2  # 导入OpenCV库,用于图像处理  
import numpy as np  # 导入NumPy库,用于数组和矩阵操作  
from matplotlib import pyplot as plt  # 导入Matplotlib库,用于绘图  # 创建一个700x700的黑色图像,包含三个颜色通道(RGB)  
image = np.zeros((700, 700, 3), dtype=np.uint8)  # 使用双层循环在图像上绘制网格和交叉的红色方块  
for i in range(0, 700, 100):  # 外层循环,步长为100,从0到600  for j in range(0, 700, 100):  # 内层循环,同样步长为100  # 绘制水平网格线  image[i, :, :] = (255, 255, 255)  # 将第i行的所有像素设为白色  # 绘制垂直网格线  image[:, j, :] = (255, 255, 255)  # 将第j列的所有像素设为白色  # 绘制交叉的红色方块  if i != 0 and j != 0 and i != 600 and j != 600 and (i == j or i + j == 600):  image[i:i+100, j:j+100, :] = (0, 0, 255)  # 将指定区域设为红色  # 将BGR格式的图像转换为RGB格式,以便正确显示  
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 分离图像的红、绿、蓝通道  
r, g, b = cv2.split(image_rgb)  # 创建三个单独的通道图像,初始为全零(黑色)  
blue_channel = np.zeros((700, 700, 3), dtype=np.uint8)  # 蓝色通道  
green_channel = np.zeros((700, 700, 3), dtype=np.uint8)  # 绿色通道  
red_channel = np.zeros((700, 700, 3), dtype=np.uint8)  # 红色通道  # 将分离出的通道放入对应的通道图像中  
blue_channel[:, :, 0] = b  # 将蓝色通道的值放入蓝色通道图像的第一个通道  
green_channel[:, :, 1] = g  # 将绿色通道的值放入绿色通道图像的第二个通道  
red_channel[:, :, 2] = r  # 将红色通道的值放入红色通道图像的第三个通道  # 将单独的通道图像转换为RGB格式  
blue_channel_rgb = cv2.cvtColor(blue_channel, cv2.COLOR_BGR2RGB)  
green_channel_rgb = cv2.cvtColor(green_channel, cv2.COLOR_BGR2RGB)  
red_channel_rgb = cv2.cvtColor(red_channel, cv2.COLOR_BGR2RGB)  # 使用Matplotlib绘制图像  
plt.subplot(232)  # 在2行3列的网格中,放置第2个子图(1-indexed)  
plt.imshow(image_rgb)  # 显示原始的RGB图像  
plt.axis('off')  # 关闭坐标轴  plt.subplot(234)  # 在2行3列的网格中,放置第4个子图  
plt.imshow(blue_channel_rgb)  # 显示蓝色通道图像  
plt.axis('off')  # 关闭坐标轴  plt.subplot(235)  # 在2行3列的网格中,放置第5个子图  
plt.imshow(green_channel_rgb)  # 显示绿色通道图像  
plt.axis('off')  # 关闭坐标轴  plt.subplot(236)  # 在2行3列的网格中,放置第6个子图  
plt.imshow(red_channel_rgb)  # 显示红色通道图像  
plt.axis('off')  # 关闭坐标轴  plt.tight_layout()  # 自动调整子图参数,以便给子图留出更合适的空间  
plt.show()  # 显示所有绘制的图像  # 使用OpenCV显示原始图像(BGR格式)  
cv2.imshow('image_rgb', image)  cv2.waitKey(0)  # 等待用户按键

六、库函数

6.1、cvtColor()

        将图像从一个色彩空间转换为另一个色彩空间。

        该函数将输入图像从一个色彩空间转换为另一个色彩空间。在从 RGB 色彩空间转换的情况下,应明确指定通道的顺序(RGB 或 BGR)。请注意,OpenCV 中的默认颜色格式通常称为 RGB,但实际上是 BGR(字节是相反的)。因此,标准 (24 位) 彩色图像中的第一个字节将是 8 位蓝色分量,第二个字节将是绿色,第三个字节将是红色。然后,第 4 个、第 5 个和第 6 个字节将是第二个像素(蓝色、绿色、红色),依此类推。

R、G 和 B 通道值的常规范围为:

  • 0 到 255 表示CV_8U图像
  • 0 到 65535(CV_16U图像
  • 0 到 1 表示CV_32F图像
cv.cvtColor(	src, code[, dst[, dstCn[, hint]]]	) ->	dst
函数描述
src输入图像:8 位无符号、16 位无符号 ( CV_16UC... ) 或单精度浮点。
dst输出图像的大小和深度与 src 相同。
code色彩空间转换代码
dstCn目标图像中的通道数;如果参数为 0,则 Channels 的数量会自动从 src 和 code 中得出。
hint实现修改标志
COLOR_BGR2GRAY
Python:cv.COLOR_BGR2GRAY

在 RGB/BGR 和灰度之间转换,颜色转换

COLOR_BGR2RGBA
Python:cv.COLOR_BGR2RGBA

在 RGB 和 BGR 色彩空间之间转换(带或不带 Alpha 通道)

COLOR_BGR2BGR565
Python:cv.COLOR_BGR2BGR565

在 RGB/BGR 和 BGR565 之间转换(16 位图像)

6.2、 拆分和合并图像通道

        有时,您需要单独处理图像的 B、G、R 通道。在这种情况下,您需要将 BGR 图像拆分为单个通道。在其他情况下,您可能需要加入这些单独的通道以创建 BGR 图像。您可以简单地通过以下方式执行此作:

>>> b,g,r = cv.split(img)
>>> img = cv.merge((b,g,r))

假设您要将所有红色像素设置为零 - 您无需先拆分通道。Numpy 索引更快:

>>> img[:,:,2] = 0

 6.3、imshow()

        在指定窗口中显示图像。

        函数 imshow 在指定窗口中显示图像。如果窗口是使用 cv::WINDOW_AUTOSIZE 标志创建的,则图像将以其原始大小显示,但它仍受屏幕分辨率的限制。否则,将缩放图像以适合窗口。

cv.imshow(	winname, mat	) ->	None
函数描述
winname窗口的名称
mat要显示的图像。

注意

此函数后应调用 cv::waitKey 或 cv::p ollKey 来执行 GUI 内务处理任务,这些任务是实际显示给定图像并使窗口响应鼠标和键盘事件所必需的。否则,它不会显示图像,并且窗口可能会锁定。例如,waitKey(0) 将无限显示窗口,直到任意一个键(适合图像显示)。waitKey(25) 将显示一个帧,并等待大约 25 ms 的按键作(适用于逐帧显示视频)。要删除窗口,请使用 cv::d estroyWindow。

[仅限 Windows 后端]按 Ctrl+C 会将图像复制到剪贴板。按 Ctrl+S 将显示一个对话框以保存图像。

[仅限 Wayland 后端]支持格式已扩展。

  • 如果图像是 8 位签名的,则像素将偏移 128。也就是说,值范围 [-128,127] 映射到 [0,255]。
  • 如果图像是 16 位签名的,则像素将除以 256 并偏移 128。也就是说,值范围 [-32768,32767] 映射到 [0,255]。

6.4、waitKey()

        等待按下的键。

        函数 waitKey 无限等待 key 事件(当delay < 0)或 delay 毫秒数(当它为正数时)。由于作系统在切换线程之间有最短时间,因此该函数不会完全等待延迟毫秒,它至少会等待延迟毫秒,具体取决于当时计算机上正在运行的其他内容。它返回所按下的键的代码,如果在指定时间过去之前没有按下任何键则返回 -1。要检查是否按下了某个键但不等待它,请使用 polKey。

cv.waitKey([, delay]) ->retval
函数描述
delay延迟(以毫秒为单位)。0 是表示 “永远” 的特殊值。

注意

函数 waitKey 和 pollKey 是 HighGUI 中唯一可以获取和处理 GUI 事件的方法,因此需要定期调用其中一个函数以进行正常的事件处理,除非在负责事件处理的环境中使用 HighGUI。

仅当至少创建了一个 HighGUI 窗口并且该窗口处于活动状态时,该功能才有效。如果有多个 HighGUI 窗口,则其中任何一个窗口都可以处于活动状态。

6.5、rectangle()

cv.rectangle(	img, pt1, pt2, color[, thickness[, lineType[, shift]]]	) ->	img
cv.rectangle(	img, rec, color[, thickness[, lineType[, shift]]]	) ->	img
函数描述
img图像。
pt1矩形的顶点。
pt2与 pt1 相对的矩形的顶点。
color矩形颜色或亮度(灰度图像)。
thickness构成矩形的线条的粗细。负值(如 FILLED)表示函数必须绘制填充矩形
lineType线路的类型。
shift点坐标中的小数位数。

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

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

相关文章

Spring Boot(十六):使用 Jenkins 部署 Spring Boot

Jenkins 是 Devops 神器&#xff0c;本篇文章介绍如何安装和使用 Jenkins 部署 Spring Boot 项目 Jenkins 搭建、部署分为四个步骤&#xff1b; 第一步&#xff0c;Jenkins 安装 第二步&#xff0c;插件安装和配置 第三步&#xff0c;Push SSH 第四步&#xff0c;部署项目 第…

【Linux 指北】常用 Linux 指令汇总

第一章、常用基本指令 # 注意&#xff1a; # #表示管理员 # $表示普通用户 [rootlocalhost Practice]# 说明此处表示管理员01. ls 指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xf…

解决Windows版Redis无法远程连接的问题

&#x1f31f; 解决Windows版Redis无法远程连接的问题 在Windows系统下使用Redis时&#xff0c;很多用户会遇到无法远程连接的问题。尤其是在配置了Redis并尝试通过工具如RedisDesktopManager连接时&#xff0c;可能会报错“Cannot connect to ‘redisconnection’”。今天&am…

大语言模型学习及复习笔记(1)语言模型的发展历程

1.大模型进入人们视野 ChatGPT 于2022年11月底上线 模型名称 发布时间 核心突破 GPT-3 2020年6月 首款千亿参数模型&#xff0c;少样本学习 GPT-3.5-Turbo 2022年11月 对话能力优化&#xff0c;用户级应用落地 GPT-4 2023年3月 多模态、强逻辑推理 GPT-4o / GPT-4…

MySQL中count(*)与count(字段区别)

核心规则 表达式 统计规则 COUNT(*) 统计所有行数&#xff08;包括所有字段为NULL的行&#xff09;。 COUNT(字段) 仅统计该字段不为NULL的行数&#xff08;若字段为NULL则自动忽略该行&#xff09;。 误区 A表连接B表&#xff0c;若A和B是一对多的关系时&#xff0c;会出现…

【Unity】在项目中使用VisualScripting

1. 在packagemanager添加插件 2. 在设置中进行初始化。 Edit > Project Settings > Visual Scripting Initialize Visual Scripting You must select Initialize Visual Scripting the first time you use Visual Scripting in a project. Initialize Visual Scripting …

vue 仿deepseek前端开发一个对话界面

后端&#xff1a;调用deepseek的api&#xff0c;所以返回数据格式和deepseek相同 {"model": "DeepSeek-R1-Distill-Qwen-1.5B", "choices": [{"index": 0, "delta": {"role": "assistant", "cont…

基于Spring Boot的小区疫情购物系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

【openwebui 搭建本地知识库(RAG搭建本地知识库)】

安装准备 openwebui 这个本地安装之前写过使用python安装。也可以直接用docker 命令 docker run --rm -d \-p 3080:8080 \-p 3081:8081 \-e WEBUI_AUTHtrue \-e DEFAULT_LOCALEcn \-e GLOBAL_LOG_LEVEL"INFO" \-e AIOHTTP_CLIENT_TIMEOUT100 \--privilegedtrue \-…

Linux 提权

文章目录 前言1. 内核漏洞提权脏牛&#xff08;CVE-2016-5195&#xff09; 2. 不安全的系统配置项2.1 SUID/SGID提权2.2 sudo提权2.3 定时任务提权2.4 capabilities提权 3. 第三方软件提权Tomcat managerNginx本地提权&#xff08;CVE-2016-1247&#xff09;Redis未授权 4. 参考…

谷粒商城:性能压测JVM堆区

目录 Kit Apache JMeter VisualVM 堆内存 jvm内存模型 垃圾回收&#xff08;Garbage Collection, GC&#xff09; 新对象分配内存 GC步骤 MinorGC 性能优化 影响因素 优化 nginx动静分离 优化三级分类获取 Jvm参数配置堆区 测试 Kit Apache JMeter 压力测试&…

TCP协议支持全双工原因TCP发送接收数据是生产者消费者模型

一、TCP支持全双工的原因 TCP协议支持全双工&#xff0c;即使用TCP协议进行通信时&#xff0c;服务端和客户端可以同时进行数据的发送和接收&#xff0c;互不干扰&#xff0c;实现同时双向传输数据。 这是因为使用TCP协议通信时&#xff0c;读写套接字的文件描述符既用来发送…

观成科技:​加密C2框架Platypus流量分析

一、工具介绍 Platypus 是一款支持多会话的交互式反向 Shell 管理器。在实际的渗透测试中&#xff0c;为了解决 Netcat/Socat 等工具在文件传输、多会话管理方面的不足,该工具在多会话管理的基础上增加了在渗透测试中能更好发挥作用的功能&#xff08;如&#xff1a;交互式 Sh…

在 C# 中,is null 和 == null ‌不完全等价‌

最近遇到了一个看似奇怪的问题&#xff0c;判断一个对象是否为null&#xff0c;我使用了null来判断&#xff0c;结果他是null但是仍然进入了判断。 经过讨论和验证&#xff0c;发现使用is null 可以解决问题&#xff0c;于是查阅了资料。 在 C# 中&#xff0c;is null 和 nul…

go语言zero框架拉取内部平台开发的sdk报错的修复与实践

在开发过程中&#xff0c;我们可能会遇到由于认证问题无法拉取私有 SDK 的情况。这种情况常发生在使用 Go 语言以及 Zero 框架时&#xff0c;尤其是在连接到私有平台&#xff0c;如阿里云 Codeup 上托管的 Go SDK。如果你遇到这种错误&#xff0c;通常是因为 Go 没有适当的认证…

VBA+FreePic2Pdf 找出没有放入PDF组合的单个PDF工艺文件

设计部门针对某个项目做了一个工艺汇总报告&#xff0c;原先只要几十个工艺文件&#xff0c;组合成一个PDF&#xff0c;但后来要求要多放点PDF进去&#xff0c;但工艺文件都混在一起又不知道哪些是重复的&#xff0c;找上我让我帮忙处理一下&#xff0c;我开始建议让她重新再组…

Webservice如何调用

webservice调用方式&#xff1a; &#xff08;1&#xff09;http方式调用 请求头增加Content-type:text/xml 或application/soapxml SOAPAction:方法名 请求body以xml字符串传递&#xff0c;xml格式定义 返回以xml字符串返回&#xff0c;xml某个字段是一个json字符串。 入…

2025-03-10 吴恩达机器学习1——机器学习概述

文章目录 1 监督学习1.1 回归1.2 分类 2 无监督学习2.1 聚类2.2 异常检测2.3 降维 3 使用 Jupyter Notebook ​ 1959 年&#xff0c;Arthur Samuel 将机器学习定义如下&#xff1a; ​ Field of study that gives computers the ability to learn without being explicitly pro…

Python 进程与线程-分布式进程

目录 分布式进程 小结 分布式进程 在Thread和Process中&#xff0c;应当优选Process&#xff0c;因为Process更稳定&#xff0c;而且&#xff0c;Process可以分布到多台机器上&#xff0c;而Thread最多只能分布到同一台机器的多个CPU上。 Python的multiprocessing模块不但支…

使用 Excel 实现绩效看板的自动化

引言 在日常工作中&#xff0c;团队的绩效监控和管理是确保项目顺利进行的重要环节。然而&#xff0c;面临着以下问题&#xff1a; ​数据分散&#xff1a;系统中的数据难以汇总&#xff0c;缺乏一个宏观的团队执行情况视图。​看板缺失&#xff1a;系统本身可能无法提供合适…