机器视觉学习(四)—— 图像的色彩

目录

一、图像的基础知识

二、NumPy模块

三、图像色彩变化

3.1 RGB图像的分通道显示

3.2 HSV图像的分通道显示


一、图像的基础知识

总结的笔记:

"""
二值图:   每个像素取值 0或1,图像显示出来只有黑白色;     黑色:0      白色:1
灰度图:   每个像素8位表示(0~255)单通道显示亮度;     黑色:0     白色:255
彩色图:   每个像素有RGB三个通道分量表示,每个分量0~255,每个通道单拿出来都是一张灰度图;黑色(0,0,0)     白色(255,255,255)
RGB:        R:红色              G:绿色                  B:蓝色
Image(BGR),Merge(RGB):  三个图层的顺序不同,由上到下
HSV:        H:色相              S:饱和度                V:明度OpenCV的 HSV格式中, H(色彩/色度)的取值范围是 [0,180], 
S(饱和度)的取值范围 [0,255], V(亮度)取值范围 [0,255]图像色彩空间转换:cv2.cvtColor(img,code)img:        要更改其色彩空间的图像code:       色彩空间转换的代码cv2.COLOR_BGR2GRAY:         表示从 BGR转换为灰度图像cv2.COLOR_BGR2HSV:          表示从 BGR转换为 HSV图像图层(通道)分离:cv2.split(img)img:        要分离的图像图层(通道)合并:cv2.merge((a,b,c))a,b,c:      要合并的色彩通道"""

二、NumPy模块

NumPy(Numerical Python)是Python科学计算的核心库之一,提供了高性能的多维数组对象(ndarray)和用于数组操作的函数。它还包括用于处理线性代数、傅里叶变换和随机数生成的工具。

下面是一些常用的 numpy 模块函数的表格:

函数描述
numpy.array()创建一个数组
numpy.zeros()创建一个指定形状和数据类型的全零数组
numpy.ones()创建一个指定形状和数据类型的全1数组
numpy.arange()创建一个指定范围和步长的数组
numpy.linspace()创建一个指定范围内等间距的数组
numpy.reshape()改变数组的形状
numpy.ndim()返回数组的维度
numpy.size()返回数组中的元素数目
numpy.dtype()返回数组的数据类型
numpy.min()返回数组的最小值
numpy.max()返回数组的最大值
numpy.mean()返回数组的平均值
numpy.sum()返回数组的和
numpy.var()返回数组的方差
numpy.std()返回数组的标准差
numpy.dot()计算两个数组的点积
numpy.transpose()反转数组的维度
numpy.vstack()垂直堆叠数组
numpy.hstack()水平堆叠数组
numpy.concatenate()按指定的维度连接数组
numpy.split()将数组分割为多个子数组
numpy.insert()将元素插入到数组的指定位置
numpy.delete()删除数组中的指定元素
numpy.copy()复制数组
numpy.sort()对数组进行排序
numpy.unique()返回数组中的唯一值
numpy.where()返回满足条件的数组元素的坐标
numpy.isnan()检查数组元素是否为 NaN
numpy.isinf()检查数组元素是否为无穷大

这只是一小部分 numpy 模块函数的示例,numpy 模块提供了许多其他功能强大的函数。你可以在 numpy 官方文档中找到更多信息:https://numpy.org/doc/icon-default.png?t=N7T8https://numpy.org/doc/

三、图像色彩变化

图像颜色通道是指图像中的每个像素所包含的颜色信息。

在彩色图像中,通常有三个颜色通道,分别是红色通道(R通道)、绿色通道(G通道)和蓝色通道(B通道)。每个通道都包含着图像中相应颜色的亮度信息,通过对这些通道的组合和调整,可以得到不同的颜色效果和色彩变化。

除了RGB颜色模式外,还有其他的颜色模式,如CMYK模式(青、品红、黄、黑)等,这些颜色模式也有对应的通道。在灰度图像中,只有一个颜色通道,代表灰度级别。

示例:(简易代码)

import cv2# 加载图像
image = cv2.imread("image.jpg") # 在运行代码时将image.jpg替换为您的图像文件路径# 分割图像的RGB通道
blue, green, red = cv2.split(image)# 修改蓝色通道为0
blue = blue * 0# 修改绿色通道为255
green = green * 0 + 255# 修改红色通道为0
red = red * 0# 合并修改后的通道
modified_image = cv2.merge((blue, green, red))# 显示修改后的图像
cv2.imshow("Modified Image", modified_image)
cv2.waitKey(0)               # 等待用户按下任意键
cv2.destroyAllWindows()

复杂代码(需理解):

import cv2
import numpy as np# 读取图像
image = cv2.imread('image.png')    # 在运行代码时将image.png替换为您的图像文件路径# 提取RGB颜色通道
red_channel = image[:,:,2]
green_channel = image[:,:,1]
blue_channel = image[:,:,0]# 将RGB颜色通道转换为不同颜色值
red_channel = np.zeros(red_channel.shape, dtype=np.uint8)  # 设置红色通道为0
green_channel = np.zeros(green_channel.shape, dtype=np.uint8)  # 设置绿色通道为0
blue_channel = np.ones(blue_channel.shape, dtype=np.uint8) * 255  # 设置蓝色通道为255# 将修改后的颜色通道重新组合成图像
new_image = cv2.merge((blue_channel, green_channel, red_channel))# 显示原始图像和修改后的图像
cv2.imshow('Original Image', image)        # 名称可修改
cv2.imshow('Modified Image', new_image)    # 名称可修改# 保存修改后的图像
cv2.imwrite('output.jpg', new_image)# 等待按下任意键关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

3.1 RGB图像的分通道显示

在OpenCV中,图像通道表示图像中的颜色信息。通常,一个彩色图像会有三个通道,分别是红色通道、绿色通道和蓝色通道。每个通道都表示了图像中对应颜色的亮度或强度。

在OpenCV中,可以使用函数cv2.split()来将彩色图像分离为各个通道。这个函数将返回一个包含各个通道的列表。

以下是一个使用OpenCV分离RGB图像通道的例子:

import cv2# 读取彩色图像
image = cv2.imread('image.jpg')# 分离通道
b, g, r = cv2.split(image)# 显示分离的通道
cv2.imshow('Blue', b)
cv2.imshow('Green', g)
cv2.imshow('Red', r)# 等待按下任意按键继续程序
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的例子中,cv2.split()函数将彩色图像分离为红色通道(r 通道)、绿色通道(g 通道)和蓝色通道(b 通道)。我们通过cv2.imshow()函数将每个通道显示出来。

注意:

在将通道分离后,每个通道的数据类型是uint8,并且只包含该通道的像素值。

3.2 HSV图像的分通道显示

cv2.cvtColor()函数是OpenCV库中用于图像颜色空间转换的函数。该函数的返回值是转换后的图像。它的原型为:

cv2.cvtColor(src, code[, dst[, dstCn]]) -> dst

参数解释:

  • src:输入图像,可以是NumPy数组或图片文件的路径。
  • code:颜色空间转换的代码,可以是下面这些之一:
    • cv2.COLOR_BGR2GRAY:BGR彩色图像转灰度图。
    • cv2.COLOR_BGR2HSV:BGR彩色图像转HSV颜色空间。
    • cv2.COLOR_BGR2RGB:BGR彩色图像转RGB颜色空间。
    • cv2.COLOR_BGR2LAB:BGR彩色图像转Lab颜色空间。
    • cv2.COLOR_BGR2YCrCb:BGR彩色图像转YCrCb颜色空间。
  • dst可选参数,输出的图像数组。如果不提供该参数,函数会自动创建一个与输入图像相同类型和大小的数组。
  • dstCn可选参数,输出图像的通道数。如果该参数为0,则输出图像和输入图像通道数相同。否则,输出图像将被重新处理为指定的通道数。

以下是一个使用OpenCVBGR转换为 HSV图像再进行分离图像通道的例子:

import cv2 as cvimg = cv.imread("D:/Open_CV/OpenCV_demo/Pictures/r4.png",1)     
# 或 img = cv.imread("Pictures/r4.png",cv.IMREAD_COLOR)img = cv.resize(img,(320,320),interpolation=cv.INTER_AREA)       # 图像缩放 (长,宽)R,G,B = cv.split(img)
MergeRGB = cv.merge((R,G,B))                # 三个图层的顺序不同,由上到下
MergeBGR = cv.merge((B,G,R))hsv_img = cv.cvtColor(img,cv.COLOR_BGR2HSV)                 # 表示从 BGR转换为 HSV图像
H,S,V = cv.split(hsv_img)                   # 图层(通道)分离成 H,S,V
MergeHSV = cv.merge((H,S,V))                # 将 H,S,V 合并cv.imshow('R4',img)
cv.imshow("B",B)
cv.imshow("G",G)
cv.imshow("R",R)
cv.imshow("MergeRGB",MergeRGB)
cv.imshow("MergeBGR",MergeBGR)cv.imshow("H",H)
cv.imshow("S",S)
cv.imshow("V",V)
cv.imshow("MergeHSV",MergeHSV)xin = cv.waitKey(0)                 # 按 ESC键关闭所有窗口
if xin == 27:               cv.destroyAllWindows()

运行结果:

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

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

相关文章

JAVA学习笔记17(数组,排序,查找)

1.数组、排序和查找 1.1 数组 1.介绍 ​ *数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型 ​ *数组就是一组数据 2.构造数组 1.例子 ​ *定义数组: double[] hens {3, 5, 1, 3.4, 2, 50};​ *遍历数组: for(int…

需求确认、需求管理、需求抽取、需求规格说明的概念与联系

在软件开发和项目管理领域,需求确认、需求管理、需求抽取、需求规格说明是需求工程的关键组成部分,它们分别承担着不同的角色和任务,但又相互联系和依赖,共同确保项目能够准确地理解、记录并满足用户和业务的需求。以下是这些概念…

IoT 物联网场景中 LoRa + 蓝牙Bluetooth 室内场馆高精定位技术全面解析

基于LoRa蓝牙的室内场景定位技术,蓝牙主要负责位置服务,LoRa主要负责数据传输。 01 LoRa和蓝牙技术 LoRa全称 “Long Rang”,是一种成熟的基于扩频技术的低功耗、超长距离的LPWAN无线通信技术。LoRa主要采用的是窄带扩频技术,抗干…

基于深度学习的口罩人脸识别研究进展

MTCNN模型训练输入的所有图像都是正样本(戴口罩的照片),没有负样本作为模型输入。在后续的识别任务模块中,导入MTCNN模型检测结果,对特征点进行编码比较进行识别。 基于MTCNN的口罩人脸识别框架可分为四个阶段&#xf…

大美博罗迎盛会,“村ART“点亮新征程

三月的博罗,春意盎然,生机勃勃。在这万物复苏的美好时节,首届"村ART"乡村艺术作品评比大赛盛大开启。本次大赛由博罗县政府和泰康保险集团联合主办,以"农民画农民、农民画农村"为主题,旨在为广大农民朋友搭建一个展示才华、抒发情怀的广阔舞台,用艺术之光点…

IDEA : 已经有一个永久破解版的IDEA2019版本,现在又想安装最新版本的,俩版本共存,发现新版本打不开的解决方案

在新文件的目录下,注释掉一行19版本的地址 地址:C:\Users\23999\AppData\Roaming\JetBrains\IntelliJIdea2023.2 (不同电脑Users后边的一个地址的注释会不一样) 然后找到该目录下的indea64.exe.vmoptions 用 记事本 打开 在-javaagent 那一栏里会自动给…

Python 小爬虫:爬取 bing 每日壁纸设为桌面壁纸

请求 URLJSON 版示例代码代码片段注意点headers 中的 User-Agent响应头中的 Content-Type终端通过代理API从 bing.com 找Bing 每日壁纸设置为桌面壁纸代码设定计划任务自动执行 python 脚本请求 URL 通过模仿必应(Bing)自己的 AJAX 调用方式获得请求 URL。 JSON 格式:

营气卫气是什么?循行规律?

营在脉中,卫在脉外,营周不休。 营气 营在脉中运行,为什么营气能在脉中运行呢?因其性柔顺精专,所以营气能循行、运行于经脉之中,正如《灵枢卫气》所云“其精气之行于经者,为营气”。 营气的运行…

使用CURL命令确定Access-Control-Allow-Origin问题

一、问题描述 有前端小伙伴反馈ajax请求遇到跨域问题,也让后端小伙伴设置了跨域允许,但诡异的事情是在前端小伙伴的微信开发者工具中Network headers中看到了两行:Access-Control-Allow-Origin,其中居然出现了:“Acce…

uniapp兴趣社区交友圈子系统小程序源码 thinkphp框架后台管理

圈子论坛社区系统,含完整的后台PHP系统。功能:小程序授权登陆,H5和APP,手机号登陆,发帖,建圈子、发活动。圈主可置顶推荐帖子,关注、点赞、评论、交流等。可作为圈子贴吧等自媒体。 兴趣社区圈…

丁腈手指套:守护你的指尖,赋予无限可能

在繁忙的现代生活中,无论是在工业车间、医疗场所,还是日常生活的琐碎细节中,保护我们的双手都显得尤为重要。丁腈手指套作为一种专业的防护用品,以其出色的防护性能、舒适性和灵活性,为众多领域的工作者提供了便捷而高…

SQLServer介绍、安装、数据库导入导出

安装 本地运行的:cn_sql_server_2008_r2_express_with_management_tools_x64.exe 官网:SQL Server下载 同上链接下载SSMS管理 SQL Server Management Studio(SSMS)是干什么的? SQL Server Management Studio&#x…

理解计算属性等

计算属性 计算属性的作用是将写在computed内的写了对应的属性名,属性值都是函数,将这属性值的函数调用之后的返回值赋给属性名的变量。因此其实计算属性内的是值,不是方法,因此写插值等语句是只是写变量,而不是调用。且…

Python零基础---爬虫技术相关

python 爬虫技术,关于数据相关的拆解: 1.对页面结构的拆解 2.数据包的分析(是否加密了参数)(Md5 aes)难易程度,价格 3.对接客户(433,334) # 数据库 CSV 4.结单(发一部分数据&a…

【Spring Boot 3】整合nacos + Dubbo3 的Spring cloud Alibaba项目

这里写自定义目录标题 前言1、项目结构2、搭建nacos注册中心、配置中心3、项目依赖4、common模块5、provider服务提供者pom文件bootstrap.yml在nacos中添加配置启动类UserServiceImpl consumer服务消费者pom文件bootstrap.ymlnacos配置启动类UserController 测试END 前言 在sp…

【Genetic Load】

1. Intro 遗传负荷(genetic load)是生物群体中由于有害等位基因的存在而使群体适应度下降的现象。1950年由美国遗传学家HJ马勒提出。所谓适应度是指生物能生存并把它们的基因传给后代的相对能力。群体的遗传负荷可用下式表示:遗传负荷=最适基因型的适应度-群体的平均适应度/…

mysql提权总结(自学)

目录 MySQL数据库提权简介 UDF提权 原理 利用条件 利用准备 利用过程 MOF提权 原理 利用条件 利用过程 自启动提权 反弹shell提权 总结 MySQL数据库提权简介 一般数据库提权思路: 检测数据库的存在(探测端口)获取到数据库的权限…

Git——本地使用详解

目录 Git1、开始版本控制1.1、初始化Repository1.2、使目录脱离Git控制 2、把文件交给Git管控2.1、创建文件后交给Git2.2、git add之后再次修改文件2.3、git add "--all"与"."参数区别2.4、把暂存区的内容提交到存储库里存档 3、工作区、暂存区与存储库3.1…

java 如何使用Lambda表达式实现参数化方法

java 如何使用Lambda表达式实现参数化方法 在Java中,你可以使用Lambda表达式与参数化方法(也称为泛型方法)结合,创建灵活且可重用的代码。Lambda表达式允许你以简洁的方式表示函数式接口的实例,而泛型方法则允许你编写…

车规级芯片又添新成员!NCV7520FPR2G 可编程六路低压侧 MOSFET 预驱动器

NCV7520FPR2G是一款可编程六沟道低压侧 MOSFET 预驱动器,是一个 FLEXMOS™ 汽车级产品系列,用于驱动逻辑电平 MOSFET。NCV7520FPR2G可通过串行 SPI 和并行输入组合控制。该器件提供可兼容 3.3 V/5 V 的输入,串行输出驱动器可基于 3.3 V 或 5 …