我在Vscode学OpenCV 色彩空间转换

news2025/3/9 10:17:48

文章目录

  • 色彩
  • 【 1 】色彩空间(色域)
    • (1)**RGB色彩空间**
      • 与xyz色彩空间的转换
        • 将 RGB 色彩空间转换为 XYZ 色彩空间
        • 将 XYZ 色彩空间转换为 RGB 色彩空间
    • (2)**CMYK色彩空间**
    • (3)**HSV**(**Hue, Saturation, Value**)色彩空间
    • (4)**YUV和YCbCr色彩空间**
  • 【 2 】色彩空间转换
    • 2.1 GRAY色彩空间
      • 2.1.1 转换方式:
      • 2.1.2 BGR -> GRAY
      • 2.1.3 如何证明`Gray = 0.299*R + 0.587*G + 0.114*B`
        • (1) 把彩色图拆分成三层图层
        • (2)证明当图像由 GRAY 色彩空间转换为 RGB 色彩空间时,最终所有通道的值都将是相同的。
  • 【3】类型转换函数

色彩

即是颜色,一种人体视觉系统对光的反射的不同波长的感知的结果。人们又对不同的波长范围的电磁波定义可视光的“颜色”。

在日常生活、美术课中,通过把(红黄蓝)三种颜色成为”认为是能够混合得到其他所有颜色的颜料。
而对于光学,就把(红绿蓝RGB)三基色【此处为了区分名字】是能够创建其他颜色的基本。

例如,RGB值(255, 0, 0)表示纯红色,(0, 255, 0)表示纯绿色,(0, 0, 255)表示纯蓝色,(0, 0, 0)表示黑色,(255, 255, 255)表示白色。

【 1 】色彩空间(色域)

一种抽象的数学模型,以不同的维度和表示方式,色彩学中,人们建立了多种色彩模型,以一维、二维、三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间。我们经常用到的色彩空间主要有RGB、CMYK、Lab等。

常见的:

(1)RGB色彩空间

三种基本颜色的不同组合来表示颜色,在计算机图像和电视显示技术中广泛使用。

与xyz色彩空间的转换

在这里插入图片描述

将 RGB 色彩空间转换为 XYZ 色彩空间

在这里插入图片描述

import cv2 as cv

# 读取RGB图像
img_rgb = cv.imread("image.jpg")

# 将RGB图像转换为XYZ图像
img_xyz = cv.cvtColor(img_rgb, cv.COLOR_BGR2XYZ)
将 XYZ 色彩空间转换为 RGB 色彩空间

在这里插入图片描述

import cv2 as cv

# 读取XYZ图像
img_xyz = cv.imread("image.jpg")

# 将XYZ图像转换为RGB图像
img_rgb = cv.cvtColor(img_xyz, cv.COLOR_XYZ2BGR)

(2)CMYK色彩空间

青色(Cyan)、品红(Magenta)、黄色(Yellow)加上黑色(Key)四种基本颜色的不同组合来表示颜色。主要用于印刷业。[全彩印刷]

此处缩写使用最后一个字母K而非开头的B,是因为在整体色彩学中已经将B给了RGB的Blue蓝色在这里插入图片描述

(3)HSVHue, Saturation, Value)色彩空间

HSV代表色调(Hue)、饱和度(Saturation)、明度(Value)。

  • 色调(Hue):表示颜色的种类,如红色、蓝色、绿色等。在HSV模型中,色调被表示为角度,范围从0到360度。若从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;
  • 饱和度(Saturation):表示颜色的纯度,饱和度越高,颜色越纯,饱和度越低,颜色越接近灰色。在HSV模型中,饱和度的范围是0到1。
  • 明度(Value):表示颜色的亮度。在HSV模型中,明度的范围也是0到1,0表示完全的黑色,1表示最亮的颜色。

OpenCV中,可以使用cv.cvtColor函数将RGB色彩空间转换为HSV色彩空间

hsv_image = cv.cvtColor(rgb_image, cv.COLOR_RGB2HSV)

在这里插入图片描述
色调(Hue)是指光的颜色,与光的波长相关。不同的波长对应不同的色调,例如红色、橙色、黄色等。

饱和度(Saturation)表示颜色的纯净度或深浅程度。高饱和度的颜色是纯净的,没有混合其他颜色的成分。低饱和度的颜色则含有更多的灰色或白色成分,使其看起来较淡。

亮度(Value)反映了光的明暗程度,即颜色的明亮度。较高的亮度表示颜色较亮,较低的亮度表示颜色较暗。亮度受到颜色中白色或黑色成分的影响,白色成分增加会使亮度增加,黑色成分增加会使亮度减少。

这些概念描述了颜色的不同特性,色调决定了颜色的种类,饱和度决定了颜色的纯净度,亮度决定了颜色的明暗程度。

(4)YUV和YCbCr色彩空间

Y表示亮度信息,U和V或Cb和Cr表示色度信息,这种分离的方式使得视频压缩更为高效。

在这里插入图片描述
在这里插入图片描述

【 2 】色彩空间转换

是指有一种色彩空间的状态以另一种方式表现出来。
例如:RGB -> HSV 或者RGB -> GRAY
而在OpenCV中,cv的表现是BGR那么就是BGR向HSV或者GRAY等的转变

cv.cvtColor(input_image,flag)

input_image 是需要进行空间转换的图像
flag为转换后的类型

cv.COLOR_BGR2GRAY:bgr->gray

cv.COLOR_BGR2HSV:bgr->hsv 

2.1 GRAY色彩空间

GRAY色彩空间,也被称作灰度色彩空间,每个像素按照一个通道去 ’ 灰度 ’ 表示。

这种灰度在先前也介绍过,当时我们以二值图像为引,二值是非黑即白的图像,而在灰度图中给其划分开了 ‘ 灰度级别 ’ (只有256个灰度级别,像素值的范围:[0,255] ,由黑向白)

它可以帮助在图像处理和计算机视觉人物中简化问题,降低复杂性,同时仍然保留了大部分的结构和形状信息。

2.1.1 转换方式:

Gray = 0.299*R + 0.587*G + 0.114*B

这种权重分布是基于人眼对不同颜色的敏感度来设计的。人眼对绿色的敏感度最高,红色次之,蓝色最低。这是因为人眼中的视网膜上有三种类型的颜色感受器,分别对红色、绿色和蓝色光最为敏感。

2.1.2 BGR -> GRAY

由于OpenCV默认是BGR的显示方式。
可以使用cvtColor函数是OpenCV库中的一个函数,用于将图像从一个颜色空间转换到另一个颜色空间。

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

在这里插入图片描述

The conventional ranges for R, G, and B channel values are:
. - 0 to 255 for CV_8U images
. - 0 to 65535 for CV_16U images
. - 0 to 1 for CV_32F images

参数:
在这里插入图片描述

import numpy as np
import cv2 as cv

# 读取一张彩色图片
img = cv.imread('./Pic/test_img.jpg')

# 创建一个与输入图像同样大小的空图像,用于存储转换结果
dst = np.zeros_like(img)

# 使用cvtColor函数将图片从BGR色彩空间转换到灰度色彩空间
# 我们提供了dst参数,所以函数将把转换结果存储在这个图像中
# 我们也提供了dstCn参数,指定输出图像的通道数为1
cv.cvtColor(img, cv.COLOR_BGR2GRAY, dst=dst, dstCn=1)

# 打印转换后的图像的通道数,应该为1
print(dst.shape)

# (864, 1920, 3)

np.zeros_like(img)将创建一个与img具有相同形状(即相同的行数和列数)和数据类型的全零数组。这意味着返回的数组将具有与img相同的维度,并且每个元素都将被初始化为零。

这个函数在上述示例中的作用是创建一个与输入图像img具有相同大小和深度的空图像,用于存储cvtColor函数的转换结果。通过使用np.zeros_like(img),我们可以确保创建的空图像与输入图像具有相同的形状和数据类型,从而避免了在转换过程中出现大小或类型不匹配的错误。
在这里插入图片描述

原图在这里插入图片描述

没有参数

import cv2 as cv

# 读取一张彩色图片
img = cv.imread('pic.jpg')

# 使用cvtColor函数将图片从BGR色彩空间转换到灰度色彩空间
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 打印转换后的图像的通道数,应该为1
print(gray.shape)

2.1.3 如何证明Gray = 0.299*R + 0.587*G + 0.114*B

(1) 把彩色图拆分成三层图层

使用函数b,g,r=cv.split(img1)

Step1: 基本代码

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img1=cv.imread("Pic/test_img.jpg")
# img1=cv.imread("Pic/test_img.jpg",0)  实现下面的同理
src=cv.cvtColor(img1,cv.COLOR_BGR2GRAY)
plt.imshow(img1[:,:,::-1])

在这里插入图片描述

Step2:拆分

b,g,r=cv.split(img1)
img1

在这里插入图片描述
Step3:拆分情况
[ 1 ] 灰度的src(原图img1)
在这里插入图片描述
[ 2 ] b
在这里插入图片描述
[ 3 ] g
在这里插入图片描述
[ 4 ] r
在这里插入图片描述
Step4:计算(因为是整数所以会四舍五入计算)
在这里插入图片描述

(2)证明当图像由 GRAY 色彩空间转换为 RGB 色彩空间时,最终所有通道的值都将是相同的。

从灰度图像(GRAY)转换回RGB图像时,所有的R、G、B通道的值都会是相同的。这是因为灰度图像只有一个通道,所以在转换回RGB图像时,这个单一的通道的值会被复制到R、G、B三个通道。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 读取灰度图像
img_gray = cv.imread("Pic/test_img.jpg", 0)

# 将灰度图像转换为RGB图像
img_rgb = cv.cvtColor(img_gray, cv.COLOR_GRAY2BGR)

# 分离RGB通道
b, g, r = cv.split(img_rgb)

# 检查R、G、B三个通道的值是否相同
print("R == G: ", np.all(r == g))
print("R == B: ", np.all(r == b))
print("G == B: ", np.all(g == b))

首先读取一个灰度图像,然后将其转换为RGB图像。然后,它分离出R、G、B三个通道,并检查这三个通道的值是否相同。如果所有的输出都是True,那么就证明了在从灰度图像转换为RGB图像时,所有的R、G、B通道的值都是相同的。
在这里插入图片描述

RGB三个通道的值
在这里插入图片描述

【3】类型转换函数

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

cv2.cvtColor() 是OpenCV中的一个函数,用于进行颜色空间的转换。它接受三个参数:

  • src:输入图像,可以是一个NumPy数组或一个OpenCV的Mat对象。
  • code:颜色空间转换的代码,指定了要进行的转换类型。常见的转换类型包括:
  • cv2.COLOR_BGR2GRAY:将BGR图像转换为灰度图像。
  • cv2.COLOR_BGR2HSV:将BGR图像转换为HSV色彩空间。
  • cv2.COLOR_BGR2RGB:将BGR图像转换为RGB色彩空间。
  • 其他转换类型可以在OpenCV的文档中找到。
  • dstCn(可选):目标图像的通道数。默认值为0,表示与输入图像的通道数相同。

函数的返回值是转换后的图像,以NumPy数组的形式返回。

【4】标记指定颜色

在 HSV 色彩空间中,H 通道(饱和度 Hue 通道)对应不同的颜色。

1.通过inRange函数锁定特定值

OpenCV 中通过函数 cv2.inRange()来判断图像内像素点的像素值是否在指定的范围内,其
语法格式为:
dst = cv2.inRange( src, lowerb, upperb )
式中:
 dst 表示输出结果,大小和 src 一致。
 src 表示要检查的数组或图像。
 lowerb 表示范围下界。
 upperb 表示范围上界。
返回值 dst 与 src 等大小,其值取决于 src 中对应位置上的值是否处于区间[lowerb,upperb]
内:
 如果 src 值处于该指定区间内,则 dst 中对应位置上的值为 255。
 如果 src 值不处于该指定区间内,则 dst 中对应位置上的值为 0

后续待更新

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

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

相关文章

贪吃蛇(c语言)!!源码加解析

目录 1.建议先把源码拿去VS中测试一下了解这个贪吃蛇是什么样的 1.头文件代码 2.源代码 3.测试代码 4.代码详解 1.头文件的解析 2.源代码的解析 1.光标的位置封装函数 2.打印欢迎界面 3.打印整体的一个地图 4.蛇的初始化 (重要) 5.打印边栏信…

过去5年,Python生态有什么变化?

你好,我是 EarlGrey,一名双语学习者,会一点编程,目前已翻译出版《Python 无师自通》、《Python 并行编程手册》等书籍。 点击上方蓝字关注我,持续接收优质好书、高效工具和赚钱机会,一起提升认知和思维。 过…

《网络协议》04. 应用层(DNS DHCP HTTP)

title: 《网络协议》04. 应用层(DNS & DHCP & HTTP) date: 2022-09-05 14:28:22 updated: 2023-11-12 06:55:52 categories: 学习记录:网络协议 excerpt: 应用层、DNS、DHCP、HTTP(URI & URL,ABNF&#xf…

2个器件,做1个恒流源

在项目中经常要用到恒流源,查找资料可以使用电压源芯片LM317构造一个电流源芯片。本文将电压源加上一个电阻改为电流源,这种设计思路可以扩展到其他类型的电源芯片上,如开关电源及其他类型的线性电源,关键点在于基准电压VREF的使用…

免费分享一套基于Springboot+Vue的在线考试系统,挺漂亮的

大家好,我是java1234_小锋老师,看到一个不错的SpringbootVue的在线考试系统,分享下哈。 项目视频演示 【免费】springbootvue在线考试系统 Java毕业设计_哔哩哔哩_bilibili【免费】springbootvue在线考试系统 Java毕业设计项目来自互联网&a…

GPT 写作与改编

GPT 写作与改编 文商科GPT 写作收益 改编技巧【改编一段话】【改编评价】【意识预设】落差,让顾客看到就感性和冲动害怕,让顾客看到就想买和拥有画面,切换空间,瞬间代入,勾人魂魄对比,设置参考物&#xff0…

港科夜闻 | 香港科大(广州)知识转移办公室创业中心主办的INNOPITCH路演推介会成功举办...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、11月7日,由香港科大(广州)知识转移办公室创业中心主办的“INNOPITCH路演推介会:新材料、能源环保、微电子技术专场”在香港科大(广州)校园内举办。十…

《网络协议》05. 网络通信安全 · 密码技术

title: 《网络协议》05. 网络通信安全 密码技术 date: 2022-09-10 15:16:15 updated: 2023-11-12 07:03:52 categories: 学习记录:网络协议 excerpt: 网络通信安全(ARP 欺骗,DoS & DDoS,SYN 洪水攻击,LAND 攻击&a…

实验室(检验科)信息系统源码,医学检验LIS系统源码,云LIS源码

实验室(检验科)信息系统源码,LIS源码,基于云计算技术的LIS系统源码,云LIS源码 LIS系统(LaboratoryInformationSystem) 即 实验室(检验科)信息系统,它是医院信息管理的重要组成部分之…

利用OGG实现PostgreSQL实时同步

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

任正非说:到现在我们终于可以说没有失败,但我们还不能说成功。

你好!这是华研荟【任正非说】系列的第36篇文章,让我们聆听任正非先生的真知灼见,学习华为的管理思想和管理理念。 华研荟导语:今天的任正非先生讲话主要节选了他在2001-2004年的几个关于IPD、ISC的论述,可能大家会发现…

Linux shell编程学习笔记24:函数定义和使用

为了实现模块化设计和代码重用,很多编程语言支持函数或过程,Linux shell也支持函数定义和调用。 Linux shell中的函数与其它编程语言很多有相似之处,也有自己独特之处。 1 函数的定义 1.1 标准格式 function 函数名(){语句或命令1……语句…

操作系统 | proc文件系统

🌈个人主页:Sarapines Programmer🔥 系列专栏:《操作系统实验室》🔖少年有梦不应止于心动,更要付诸行动。 目录结构 1. 操作系统实验之proc文件系统 1.1 实验目的 1.2 实验内容 1.3 实验步骤 1.4 实验…

c++求三个数的最小公倍数

答案&#xff1a; #include <iostream> using namespace std; int main() {int n1, n2, n3, max;cin >> n1 >> n2 >> n3;max (n1 > n2 > n3) ? n1 : n2;do{if (max % n1 0 && max % n2 0 && max % n3 0){cout << ma…

如何关闭Windows Defender(亲测可行!!非常简单)

一、背景 Windows Defender&#xff08;简称WD&#xff09;真的太讨厌了&#xff0c;经常给你报你下载的文件是病毒&#xff0c;且不说真的是不是病毒&#xff0c;它都不询问直接删。 另外聚资料显示WD还会不合时宜地执行扫描导致系统变慢&#xff08;不会在合适的、空闲的时…

Pathways

信号通路signaling pathway-武汉华美生物 (cusabio.cn) 神经信号通路(Neuronal Signaling)--selleck.cn PI3K/Akt/mTOR信号通路 表观遗传 甲基化 免疫&炎症 酪氨酸蛋白激酶 血管生成 凋亡 自噬 内质网应激&UPR响应 JAK/STAT信号通路 MAPK信号通路 细胞骨架…

HTML使用lable将文字与控件进行关联以获取焦点

先养养眼再往下看 注释很详细&#xff0c;直接上代码 <form action""><!-- 第一种方法:用id的方式绑定账户(文字)和输入框 --><label for"zhanghu">账户</label><input "text" id"zhanghu" name"ac…

软件自动化测试平台

软件测试分类黑盒、白盒、功能、API、接口、压力测试和性能测试&#xff0c; 自动化测试平台是一种用于自动化执行软件测试过程的工具。 一、自动化测试平台-功能性 1. 接口自动化&#xff1a;对接软件的接口进行测试&#xff0c;验证接口的功能和性能。 2. Web 自动化&…

一步一步详细介绍如何使用 OpenCV 制作低成本立体相机

在这篇文章中,我们将学习如何创建定制的低成本立体相机(使用一对网络摄像头)并使用 OpenCV 捕获 3D 视频。我们提供 Python 和 C++ 代码。文末并附完整的免费代码下载链接 我们都喜欢观看上面所示的 3D 电影和视频。您需要如图 1 所示的红青色 3D 眼镜才能体验 3D 效果。它是…

网络运维Day11

文章目录 if语句if单分支应用案例 if双分支应用案例 if多分支应用案例 for循环while循环案例 正则表达式基本正则Perl兼容的正则 综合练习总结 if语句 if单分支 if单分支的语法组成&#xff1a; if 条件测试;then 命令序列 fiif 条件测试then 命令序列 fi应用案例 判断用…