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.mzph.cn/diannao/73258.shtml

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

相关文章

SQLiteStudio:一款免费跨平台的SQLite管理工具

SQLiteStudio 是一款专门用于管理和操作 SQLite 数据库的免费工具。它提供直观的图形化界面&#xff0c;简化了数据库的创建、编辑、查询和维护&#xff0c;适合数据库开发者和数据分析师使用。 功能特性 SQLiteStudio 提供的主要功能包括&#xff1a; 免费开源&#xff0c;可…

【软考网工-实践篇】DHCP 动态主机配置协议

一、DHCP简介 DHCP&#xff0c;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议。 位置&#xff1a;DHCP常见运行于路由器上&#xff0c;作为DHCP服务器功能&#xff1a;用于自动分配IP地址及其他网络参数给网络中的设备作用&#xff1a;简化网络管理&…

【Linux学习笔记】Linux用户和文件权限的深度剖析

【Linux学习笔记】Linux用户和文件权限的深度剖析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 前言 文章目录 【Linux学习笔记】Linux用户和文件权限的深度剖析前言一. Linux权限管理1.1 文件访问者的分类&#xff08;人)…

Centos离线安装openssl-devel

文章目录 Centos离线安装openssl-devel1. openssl-devel是什么&#xff1f;2. openssl-devel下载地址3. openssl-devel安装4. 安装结果验证 Centos离线安装openssl-devel 1. openssl-devel是什么&#xff1f; openssl-devel 是 Linux 系统中与 OpenSSL 加密库相关的开发包&…

深度学习篇---Opencv中Haar级联分类器的自定义

文章目录 1. 准备工作1.1安装 OpenCV1.2准备数据集1.2.1正样本1.2.2负样本 2. 数据准备2.1 正样本的准备2.1.1步骤2.1.2生成正样本描述文件2.1.3示例命令2.1.4正样本描述文件格式 2.2 负样本的准备2.2.1步骤2.2.2负样本描述文件格式 3. 训练分类器3.1命令格式3.2参数说明 4. 训…

Smart Time Plus smarttimeplus-MySQLConnection SQL注入漏洞(CVE-2024-53544)

免责声明 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x01…

58.Harmonyos NEXT 图片预览组件架构设计与实现原理

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; Harmonyos NEXT 图片预览组件架构设计与实现原理 文章目录 Harmonyos NEXT 图片预览组件架构设计与实现原理效果预览一、组件架构概述1. 核心组件层…

虚拟机下ubuntu进不了图形界面

6.844618] piix4_smbus 0000:07.3: SMBus Host ContrFoller not enabled! 7.859836] sd 2:0:0:0:0: [sda] Assuming drive cache: wirite through /dev/sda1: clean, 200424/1966080 files, 4053235/7864064 blocks ubuntu启动时&#xff0c;卡在上面输出位置 当前遇到的原因…

Appium高级操作--从源码角度解析--模拟复杂手势操作

书接上回&#xff0c;Android自动化--Appium基本操作-CSDN博客文章浏览阅读600次&#xff0c;点赞10次&#xff0c;收藏5次。书接上回&#xff0c;上一篇文章已经介绍了appium在Android端的元素定位方法和识别工具Inspector&#xff0c;本次要介绍使用如何利用Appium对找到的元…

SpringBoot学生宿舍管理系统的设计与开发

项目概述 幽络源分享的《SpringBoot学生宿舍管理系统的设计与开发》是一款专为校园宿舍管理设计的智能化系统&#xff0c;基于SpringBoot框架开发&#xff0c;功能全面&#xff0c;操作便捷。该系统涵盖管理员、宿管员和学生三大角色&#xff0c;分别提供宿舍管理、学生信息管…

爱普生温补晶振 TG5032CFN高精度稳定时钟的典范

在科技日新月异的当下&#xff0c;众多领域对时钟信号的稳定性与精准度提出了极为严苛的要求。爱普生温补晶振TG5032CFN是一款高稳定性温度补偿晶体振荡器&#xff08;TCXO&#xff09;。该器件通过内置温度补偿电路&#xff0c;有效抑制环境温度变化对频率稳定性的影响&#x…

【原创】在高性能服务器上,使用受限用户运行Nginx,充当反向代理服务器[未完待续]

起因 在公共高性能服务器上运行OllamaDeepSeek&#xff0c;如果按照默认配置启动Ollama程序&#xff0c;则自己在远程无法连接你启动的Ollama服务。 如果修改配置&#xff0c;则会遇到你的Ollama被他人完全控制的安全风险。 不过&#xff0c;我们可以使用一个方向代理&#…

Bash和Zsh的主要差异是?

Bash&#xff08;GNU Bourne-Again Shell&#xff09; 和 Zsh&#xff08;Z Shell&#xff09; 都是功能强大的Unix/Linux Shell&#xff0c;广泛用于交互式使用和脚本编写。 尽管它们有很多相似之处&#xff0c;但在功能、语法、配置选项等方面也存在一些显著的区别。 是Bas…

芯科科技推出的BG29超小型低功耗蓝牙®无线SoC,是蓝牙应用的理想之选

具有扩大的内存和超低功耗特性的超小型BG29是互联健康设备的理想之选 低功耗无线领域内的领导性创新厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;今日宣布&#xff1a;推出全新的第二代无线开发平台产品BG29系列无线片上系统…

【数据挖掘】知识蒸馏(Knowledge Distillation, KD)

1. 概念 知识蒸馏&#xff08;Knowledge Distillation, KD&#xff09;是一种模型压缩和知识迁移技术&#xff0c;旨在将大型复杂模型&#xff08;称为教师模型&#xff09;中的知识传递给一个较小的模型&#xff08;称为学生模型&#xff09;&#xff0c;以减少计算成本&…

选型消息队列(MQ):ActiveMQ、RabbitMQ、RocketMQ、Kafka对比

选型消息队列&#xff08;MQ&#xff09;&#xff1a;ActiveMQ、RabbitMQ、RocketMQ、Kafka对比 选型消息队列&#xff08;MQ&#xff09;1. 引言2. 消息队列核心指标3. MQ 技术对比分析4. 详细分析及案例4.1 ActiveMQ&#xff1a;传统企业级 MQ 方案4.2 RabbitMQ&#xff1a;高…

AWK 入门教程:强大的文本处理工具

AWK 是一种强大的文本处理工具&#xff0c;广泛用于 Linux/Unix 系统中对文本文件或数据流进行操作。它能够基于条件筛选、统计字段、重新排列数据等。主要特点包括&#xff1a; 2. AWK 的基本语法 2.1 AWK 程序的结构 AWK 程序的结构: awk pattern { action } file 2.2 常…

mysql select distinct 和 group by 哪个效率高

在有索引的情况下&#xff0c;SELECT DISTINCT和GROUP BY的效率相同&#xff1b;在没有索引的情况下&#xff0c;SELECT DISTINCT的效率高于GROUP BY‌。这是因为SELECT DISTINCT和GROUP BY都会进行分组操作&#xff0c;但GROUP BY可能会进行排序&#xff0c;触发filesort&…

使用conda将python环境打包,移植到另一个linux服务器项目中

问题&#xff1a;因为新的服务器A不能联网&#xff0c;导致离线pip install包耗时耗力&#xff0c;旧的服务器B中的Anaconda和A中是同一个版本&#xff0c;有现成的python环境&#xff0c;并且服务器B可以联网&#xff0c;现想将B中的环境&#xff0c;直接移植到A中使用。 解决…

晶晨S905M/晶晨S905L2芯片-原机安卓4升级安卓7.1.2-通刷线刷固件包

晶晨S905M&#xff0f;晶晨S905L2芯片-原机安卓4升级安卓7.1.2-通刷线刷固件包 线刷方法&#xff1a;&#xff08;新手参考借鉴一下&#xff09; 1、准备好一根双公头USB线刷刷机线&#xff0c;长度30-50CM长度最佳&#xff0c;同时准备一台电脑&#xff1b; 2、电脑上安装好…