我在Vscode学OpenCV 色彩空间转换

文章目录

  • 色彩
  • 【 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

后续待更新

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

这就是!Python的魅力!

文章目录 前言什么是pythonpython的由来我们为什么要学习python帮助python学习的网站总结 前言 各位朋友们,大家好。龙叔我后台经常收到私信问什么是Python?有必要学习这门语言么?今天,将通过本文告知大家Python是什么&#xf…

使用 Azure 机器学习实现图像分类

图像分类是计算机视觉领域中一个重要的任务。随着深度学习的发展,利用深度神经网络对图像进行分类已经成为一种主流方法。而Azure机器学习平台提供了丰富的工具和功能,使我们能够轻松地搭建和训练图像分类模型,并将其部署到实际应用中。本文将…

DL Homework 7

目录 一、用自己的语言解释以下概念 局部感知、权值共享 池化(子采样、降采样、汇聚)。会带来那些好处和坏处? 全卷积网络 低级特征、中级特征、高级特征 多通道。N输入,M输出是如何实现的? 11的卷积核有什么作用 二、…

抖音直播矩阵玩法,直播矩阵引流项目,每日精准引流500左右

今天我再分享一个专注于纯直播带货的玩法,这个案例不论是导流还是直播模式,都值得我们深入关注。某音直播矩阵玩法,每日精准引流500 这种直播方式通常会邀请两位模特,一个展示产品,一个递交产品,无需过多的…

傅里叶分析(1)

1 概述 傅里叶分析是信号分析中常用方法之一。傅里叶分析可将信号在时域和频域之间进行转换,从而分析信号在频域上的特点。 傅里叶分析(Fourier analysis)根据信号的时域数据特征,分为 4 个类别: 傅里叶级数&#x…

《网络协议》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…

【PyQt】(自制类)简易的控件画布

说一下标题的意思,就是一个可往上面放QtWidgets控件(例如QLabel、QPushButton)并且画布可拖拽缩放的一个简易画布类。 强调一下的就是,这和涂鸦画布(类比于win自带的画图软件)不是同个东西。 只不过通过这个自制类我明白了一点的就是控件数量太多会造成…

一句话讲明白buck和boost电源电路

大部分教程就是垃圾 虽然buck和boost结构上很像,但是是两个原理完全不一样的东西 BUCK(降压)电源 buck就是把方波,用LC滤波器后,变成正弦波 滤波:就是让电压缓慢增加,缓慢减少。&#xff08…

《红蓝攻防对抗实战》十二.内网穿透之利用ICMP协议进行隧道穿透

内网穿透之利用ICMP协议进行隧道穿透 一.前言二.前文推荐三.利用ICMP协议进行隧道穿透1.ICMPsh获取反弹shell2.PingTunnel 搭建隧道 四.本篇总结 一.前言 本文介绍了利用ICMP协议进行隧道穿透的方法。ICMP协议不需要开放端口,可以将TCP/UDP数据封装到ICMP的Ping数据…

Gradio App生产环境部署教程

如果机器学习模型没有投入生产供人们使用,就无法充分发挥其潜力。 根据我们的经验,将模型投入生产的最常见方法是为其创建 API。 然而,我们发现这个过程对于 ML 开发人员来说可能相当令人畏惧,特别是如果他们不熟悉 Web 开发的话。…

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

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

【C++】:内存管理:C++内存分布 || C++中动态内存管理(new || delete)

📭1. C/C内存分布 【说明】 🃏1. 栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的 🃏2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存&#xff…

跨域:利用CORS实现跨域访问

跨域知识点:跨域知识点 iframe实现跨域的四种方式:iframe实现跨域 JSONP和WebSocket实现跨域:jsonp和websocket实现跨域 目录 cors介绍 简介 两种请求 简单请求 基本流程 withCredentials 属性 非简单请求 预检请求 预检请求的回应 …

利用OGG实现PostgreSQL实时同步

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

postman接口测试—Restful接口开发与测试

开发完接口,接下来我们需要对我们开发的接口进行测试。接口测试的方法比较多,使用接口工具或者Python来测试都可以,工具方面比如之前我们学习过的Postman或者Jmeter ,Python脚本测试可以使用Requests unittest来测试。 测试思路…

GPT 写作与改编

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

RT-DETR推理详解及部署实现

目录 前言1. RT-DETR-官方2. RT-DETR-U版2.1 RT-DETR预测2.2 RT-DETR预处理2.3 RT-DETR后处理2.4 RT-DETR推理 3. RT-DETR-C3.1 ONNX导出3.2 RT-DETR预处理3.3 RT-DETR后处理3.4 RT-DETR推理 4. RT-DETR部署4.1 源码下载4.2 环境配置4.2.1 配置CMakeLists.txt4.2.2 配置Makefil…

有奖 | Python 开发者 2023 年度调查

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

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

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

notes_质谱蛋白组学数据分析基础知识

目录 1. 蛋白组学方法学1.1 液相-质谱法1) 基本原理2) bottom-up策略的基本流程 1.2 PEA/Olink 2. 质谱数据分析2.1 原始数据格式2.2 分析过程1)鉴定2)定量3)预处理 2.3 下游分析 参考附录 1. 蛋白组学方法学 目前常见的蛋白组学方法学如下图…