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

news2025/3/14 19:00:19

一、计算机眼中的图像

像素

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

        日常生活中常见的图像是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.coloradmin.cn/o/2315027.html

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

相关文章

小米路由器SSH下安装DDNS-GO

文章目录 前言一、下载&#xff06;安装DDNS-GO二、配置ddns-go设置开机启动 前言 什么是DDNS&#xff1f; DDNS&#xff08;Dynamic Domain Name Server&#xff09;是动态域名服务的缩写。 目前路由器拨号上网获得的多半都是动态IP&#xff0c;DDNS可以将路由器变化的外网I…

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

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

手机屏幕摔不显示了,如何用其他屏幕临时显示,用来导出资料或者清理手机

首先准备一个拓展坞 然后 插入一个外接的U盘 插入鼠标 插入有数字小键盘区的键盘 然后准备一根高清线&#xff0c;一端链接电脑显示器,一端插入拓展坞 把拓展坞的连接线&#xff0c;插入手机充电口&#xff08;可能会需要转接头&#xff09; 然后确保手机开机 按下键盘…

工业三防平板AORO-P300 Ultra,开创铁路检修与调度数字化新范式

在现代化铁路系统的庞大网络中&#xff0c;其设备维护与运营调度的精准性直接影响着运输效率和公共安全。在昼夜温差大、电磁环境复杂、震动粉尘交织的铁路作业场景中&#xff0c;AORO-P300 Ultra工业三防平板以高防护标准与智能化功能体系&#xff0c;开创了铁路行业移动端数字…

LInux基础--apache部署网站

httpd的安装 yum -y install httpdhttpd的使用 启动httpd systemctl enable --now httpd使用enable --now 进行系统设置时&#xff0c;会将该服务设置为开机自启并且同时开启服务 访问httpd 创建虚拟主机 基于域名 在一台主机上配置两个服务server1和server2&#xff0c;其…

Linux内核套接字以及分层模型

一、套接字通信 内核开发工程师将网络部分的头文件存储到一个专门的目录include/net中&#xff0c;而不是存储到标准位置include/linux。 计算机之间通信是一个非常复杂的问题&#xff1a; 如何建立物理连接&#xff1f;使用什么样的线缆&#xff1f;通信介质有那些限制和特殊…

Linux《基础开发工具(中)》

在之前的Linux《基础开发工具&#xff08;上&#xff09;》当中已经了解了Linux当中到的两大基础的开发工具yum与vim&#xff1b;了解了在Linux当中如何进行软件的下载以及实现的基本原理、知道了编辑器vim的基本使用方式&#xff0c;那么接下来在本篇当中将接下去继续来了解另…

使用1Panel一键搭建WordPress网站的详细教程(全)

嘿&#xff0c;各位想搭建自己网站的朋友们&#xff01;今天我要跟大家分享我用1Panel搭建WordPress网站的全过程。说实话&#xff0c;我之前对服务器运维一窍不通&#xff0c;但通过这次尝试&#xff0c;我发现原来建站可以这么简单&#xff01;下面是我的亲身经历和一些小技巧…

uni-app学习笔记——自定义模板

一、流程 1.这是一个硬性的流程&#xff0c;只要按照如此程序化就可以实现 二、步骤 1.第一步 2.第二步 3.第三步 4.每一次新建页面&#xff0c;都如第二步一样&#xff1b;可以选择自定义的模版&#xff08;vue3Setup——这是我自己的模版&#xff09;&#xff0c;第二步的…

数据结构——顺序表seqlist

前言&#xff1a;大家好&#x1f60d;&#xff0c;本文主要介绍了数据结构——顺序表部分的内容 目录 一、线性表的定义 二、线性表的基本操作 三.顺序表 1.定义 2. 存储结构 3. 特点 四 顺序表操作 4.1初始化 4.2 插入 4.2.1头插 4.2.2 尾插 4.2.3 按位置插 4.3 …

使用位运算如何找到数组中只出现一次的数?

题目链接&#xff1a;137. 只出现一次的数字 II - 力扣&#xff08;LeetCode&#xff09; 算法解析 位运算是用于二进制的运算符号。而对于多次出现的数字&#xff0c;其二进制都是一模一样的&#xff0c;这里是3次重复的出现是数字。由此我们可以想到&#xff0c;如果我们由低…

Linux笔记之通配符和正则表达式的区别

Linux笔记之通配符和正则表达式的区别 code review! 参考笔记 1.Linux笔记之通配符和正则表达式的区别 2.C++笔记之C语言中的换行符和转义符 文章目录 Linux笔记之通配符和正则表达式的区别1.通配符概念2.通配符和正则表达式的区别3.C++或C语言中有没有通配符?4.Linux Bash脚…

防汛应急包,快速响应,守护安全

根据中国水利部统计&#xff0c;自1949年以来&#xff0c;我国几乎每年都面临洪水威胁&#xff0c;其中20世纪90年代后洪涝灾害频率显著增加&#xff0c;仅1990-2009年间就发生超4000起较大灾害&#xff0c;直接经济损失近3万亿元&#xff0c;受灾人口达20亿人次。在2020年长江…

小记一下Zookeeper配置中心的部分原理

记录一下&#xff0c;这里其实很类似nacos的Value&#xff0c;注解&#xff0c;可以结合去理解。 Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {Class<?> beanClass bean.getClass();Field[] fields …

蓝桥杯备赛-基础训练(四)字符串 day17

好久不见&#xff0c;今天开始继续更新&#xff0c;或许拿不了奖&#xff0c;但是希望记录自己学习的过程&#xff0c;如果感觉有收获的同学在下面多多评论说说我代码的缺陷&#xff0c;感谢大家&#xff01; 1、反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反…

软件工程概述、软件过程模型、逆向工程(高软45)

系列文章目录 软件工程概述、软件过程模型、逆向工程。 文章目录 系列文章目录前言一、软件工程概述二、能力成熟度模型1.能力成熟度模型CMM2.能力成熟度模型集成CMMI 三、软件过程模型1.瀑布模型SDLC2.原型化模型3.螺旋模型4.增量模型5.喷泉模型6.敏捷模型7.统一过程模型RUP 四…

数据结构--邻接表

回顾上节&#xff1a; 邻接矩阵--数组实现的顺序存储&#xff0c;空间复杂度高&#xff0c;不合适存储稀疏图。On^2 一、邻接表法&#xff08;顺序链式存储&#xff09; 无向图&#xff1a; 用一维数组存储顶点信息&#xff0c;使用指针存储顶点的第一条边/弧。对于边/弧&…

ChromeOS 134 版本更新

ChromeOS 134 版本更新 一、ChromeOS 134 更新内容 1. ChromeOS 自助终端&#xff08;Kiosk&#xff09;模式支持隔离 Web 应用&#xff08;Isolated Web Apps&#xff09; 从 ChromeOS 134 开始&#xff0c;自助终端&#xff08;Kiosk&#xff09;模式支持 隔离 Web 应用&a…

node.js-WebScoket心跳机制(服务器定时发送数据,检测连接状态,重连)

1.WebScoket心跳机制是&#xff1f; 基于上一篇文章&#xff0c;WebScoket在浏览器和服务器间完成一次握手&#xff0c;两者间创建持久性连接&#xff0c;并进行双向数据连接。node.js-node.js作为服务器&#xff0c;前端使用WebSocket&#xff08;单个TCP连接上进行全双工通讯…

【蓝桥杯—单片机】第十五届省赛真题代码题解析 | 思路整理

第十五届省赛真题代码题解析 前言赛题代码思路笔记竞赛板配置建立模板明确基本要求显示功能部分频率界面正常显示高位熄灭 参数界面基础写法&#xff1a;两个界面分开来写优化写法&#xff1a;两个界面合一起写 时间界面回显界面校准校准过程校准错误显示 DAC输出部分按键功能部…