OpenCV中的一些色彩空间转换

这篇具有很好参考价值的文章主要介绍了OpenCV中的一些色彩空间转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在 OpenCV 中,cv2.COLOR_ 用于表示颜色空间转换的常量。这些常量定义了不同的颜色空间转换代码,可以在图像处理中使用。

以下是一些常用的 cv2.COLOR_ 常量:

cv2.COLOR_BGR2GRAY:将 BGR 彩色图像转换为灰度图像。
cv2.COLOR_BGR2RGB:将 BGR 彩色图像转换为 RGB 彩色图像。
cv2.COLOR_BGR2HSV:将 BGR 彩色图像转换为 HSV 颜色空间。
cv2.COLOR_BGR2Lab:将 BGR 彩色图像转换为 Lab 颜色空间。
cv2.COLOR_RGB2GRAY:将 RGB 彩色图像转换为灰度图像。
cv2.COLOR_RGB2BGR:将 RGB 彩色图像转换为 BGR 彩色图像。
cv2.COLOR_RGB2HSV:将 RGB 彩色图像转换为 HSV 颜色空间。
cv2.COLOR_RGB2Lab:将 RGB 彩色图像转换为 Lab 颜色空间。
cv2.COLOR_GRAY2BGR:将灰度图像转换为 BGR 彩色图像。
cv2.COLOR_GRAY2RGB:将灰度图像转换为 RGB 彩色图像。
cv2.COLOR_HSV2BGR:将 HSV 颜色空间图像转换为 BGR 彩色图像。
cv2.COLOR_HSV2RGB:将 HSV 颜色空间图像转换为 RGB 彩色图像。

具体实现的代码、原理如下所示:

cv2.COLOR_BGR2GRAY
当使用 OpenCV 中的 cv2.COLOR_BGR2GRAY 将彩色图像转换为灰度图像时,可以使用以下代码:

import cv2
# 读取彩色图像
image = cv2.imread('color_image.jpg')
# 将彩色图像转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 显示灰度图像
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

原理:
当使用 cv2.COLOR_BGR2GRAY 将彩色图像转换为灰度图像时,它基于亮度感知的原理进行转换。灰度图像是一种单通道图像,每个像素的数值代表了该像素的亮度值,而不包含颜色信息。在转换过程中,使用了以下数学公式来计算每个像素的灰度值:
G r a y = 0.299 × R + 0.587 × G + 0.114 × B Gray= 0.299\times R+0.587\times G+0.114\times B Gray=0.299×R+0.587×G+0.114×B
这个公式基于人眼对不同颜色的感知权重,因为人眼对绿色的感知更敏感,对红色和蓝色的感知较低。
具体步骤如下:
读取彩色图像。
对图像的每个像素进行遍历。
对于每个像素,根据上述公式计算灰度值。
将计算得到的灰度值赋给灰度图像对应位置的像素。
最终得到的灰度图像包含了图像的亮度信息,而去除了颜色信息。
这样,通过 cv2.COLOR_BGR2GRAY,你可以将彩色图像转换为灰度图像,并且可以更专注于图像的亮度特征。

cv2.COLOR_BGR2RGB
以下是使用 OpenCV 将图像从 BGR 格式转换为 RGB 格式的示例代码:

import cv2
# 读取图像
image_bgr = cv2.imread('input_image.jpg')
# 将图像从 BGR 格式转换为 RGB 格式
image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)
# 显示原始图像和转换后的图像
cv2.imshow('Original Image', image_bgr)
cv2.imshow('RGB Image', image_rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()

原理:
在 OpenCV 中,BGR(蓝绿红)和 RGB(红绿蓝)是两种常用的图像表示方式。BGR 是 OpenCV 默认的图像格式,而 RGB 是人们通常更熟悉和常用的图像格式。
在 BGR 到 RGB 的转换中,每个像素的颜色通道的顺序会发生改变,即将原始图像中的蓝色通道 B l u e Blue Blue和红色通道 R e d Red Red进行互换,保持绿色通道 G r e e n Green Green不变。这样就可以将图像从 BGR 格式转换为 RGB 格式。
转换的数学公式如下:
R _ n e w = B , G _ n e w = G , B _ n e w = R R\_new = B,G\_new = G,B\_new = R R_new=B,G_new=G,B_new=R
其中, R _ n e w = B 、 G _ n e w = G 、 B _ n e w = R R\_new = B、G\_new = G、B\_new = R R_new=BG_new=GB_new=R分别表示转换后的 RGB 图像中的红色、绿色和蓝色通道的像素值。通过这种转换,我们可以更方便地处理 RGB 格式的图像,因为 RGB 格式更符合人类感知和常用的颜色表示方式。

cv2.COLOR_BGR2HSV
当将 BGR 图像转换为 HSV 图像时,需要使用 OpenCV 的 cv2.cvtColor() 函数,并将转换代码设置为 cv2.COLOR_BGR2HSV。下面是更详细的代码示例:

import cv2
# 读取图像
bgr_image = cv2.imread('image.jpg')
# 将 BGR 图像转换为 HSV 图像
hsv_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2HSV)
# 显示原始图像和转换后的图像
cv2.imshow('BGR Image', bgr_image)
cv2.imshow('HSV Image', hsv_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

HSV是一种颜色空间,其中H代表色调 h u e hue hue,S代表饱和度 s a t u r a t i o n saturation saturation,V代表亮度 v a l u e value value。这与BGR颜色空间不同,BGR颜色空间表示图像中的颜色是由蓝色 B l u e Blue Blue、绿色 G r e e n Green Green和红色 R e d Red Red的组合所得。在HSV空间中,颜色的值由三个参数表示:色调(H),饱和度(S),亮度(V)。HSV空间更加符合人类对颜色的感知,因此在某些图像处理任务中,将图像转换为HSV空间更有意义。请注意,转换后的 HSV 图像中的像素值的范围有所不同。H(色调)的取值范围是 [0, 179],S(饱和度)和 V(明度)的取值范围是 [0, 255]。因此,如果要在转换后的图像中获取或修改像素值,需要考虑这些范围的限制。
原理:
HSV(色调、饱和度、亮度)是一种颜色空间,通过以下数学公式将BGR(蓝、绿、红)颜色空间转换为HSV颜色空间:
1、归一化RGB值:将BGR图像的每个通道的像素值除以255,使得每个通道的取值范围在[0, 1]之间。
R ′ = R 255 , G ′ = G / 255 , B ′ = B / 255 R' = R255,G' = G /255,B' = B/255 R=R255,G=G/255,B=B/255
2、计算最大值和最小值:找到归一化RGB值中的最大值 M a x Max Max和最小值 M i n Min Min
M a x = m a x ( R ′ , G ′ , B ′ ) , M i n = m i n ( R ′ , G ′ , B ′ ) Max = max(R', G', B'),Min = min(R', G', B') Max=max(R,G,B),Min=min(R,G,B)
3、计算色调(H):
如果 M a x = M i n Max=Min Max=Min,则色调 H = 0 H=0 H=0
如果 M a x = R ′ Max=R' Max=R,且 G ′ > = B ′ G' >= B' G>=B,则色调 H = ( 60 ∗ ( G ′ − B ′ ) ) / ( M a x − M i n ) + 0 H= (60 * (G' - B')) / (Max - Min)+0 H=(60(GB))/(MaxMin)+0
如果 M a x = R ′ Max=R' Max=R,且 G ′ < B ′ G' < B' G<B,则色调 H = ( 60 ∗ ( G ′ − B ′ ) ) / ( M a x − M i n ) + 360 H=(60 * (G' - B')) / (Max - Min) + 360 H=(60(GB))/(MaxMin)+360
如果 M a x = G ′ Max=G' Max=G,则色调 H = ( 60 ∗ ( B ′ − R ′ ) ) / ( M a x − M i n ) + 120 H=(60 * (B' - R')) / (Max - Min) + 120 H=(60(BR))/(MaxMin)+120
如果 M a x = B ′ Max=B' Max=B,则色调 H = ( 60 ∗ ( R ′ − G ′ ) ) / ( M a x − M i n ) + 240 H=(60 * (R' - G')) / (Max - Min) + 240 H=(60(RG))/(MaxMin)+240
这里的色调H的取值范围是[0, 360]。
4、计算饱和度(S):
如果 M a x = 0 Max=0 Max=0,则饱和度 S = 0 S=0 S=0
如果 M a x ! = 0 Max!=0 Max!=0,则饱和度 S = ( M a x − M i n ) / M a x S= (Max - Min) / Max S=(MaxMin)/Max
这里的饱和度S的取值范围是[0, 1]。
5、计算亮度(V):亮度V为Max。
这里的亮度V的取值范围是[0, 1]。
通过这些公式,可以将BGR颜色空间中的像素值转换为HSV颜色空间中的色调、饱和度和亮度值。这样就完成了从BGR到HSV的颜色空间转换。

cv2.COLOR_BGR2Lab
下面是使用OpenCV将图像从BGR颜色空间转换为Lab颜色空间的代码:

import cv2
# 读取图像
image_bgr = cv2.imread('image.jpg')
# 将BGR图像转换为Lab图像
image_lab = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2Lab)
# 显示原始图像和转换后的图像
cv2.imshow('BGR Image', image_bgr)
cv2.imshow('lab Image', image_lab)
cv2.waitKey(0)
cv2.destroyAllWindows()

Lab颜色空间是一种颜色模型,它包含了亮度(L)、红绿通道(a)和蓝黄通道(b)三个分量。通过将图像从BGR到Lab的转换,可以将颜色信息分离为亮度和颜色两个独立的通道,方便进行一些图像处理任务。
将图像从BGR颜色空间转换为Lab颜色空间的原理涉及到多个数学公式和转换矩阵。下面是对这个过程的数学公式解释:
首先,我们将BGR颜色空间中的三个通道(蓝色、绿色和红色)表示为向量形式,记作 [B, G, R]。
然后,我们通过以下公式计算出对应的线性变换:
X = R / 255.0 , Y = G / 255.0 , Z = B / 255.0 X = R / 255.0,Y = G / 255.0,Z = B / 255.0 X=R/255.0,Y=G/255.0,Z=B/255.0
其中,X、Y和Z是在RGB颜色空间中进行归一化的值。
接下来,我们使用以下矩阵乘法将RGB颜色空间转换为XYZ颜色空间:

[ X ]     [ 0.412453  0.357580  0.180423 ]   [ R ]
[ Y ]  =  [ 0.212671  0.715160  0.072169 ] * [ G ]
[ Z ]     [ 0.019334  0.119193  0.950227 ]   [ B ]

其中,左边的矩阵是转换矩阵,右边的向量是RGB归一化值。
接下来,我们通过以下公式计算出Lab颜色空间中的L、a和b分量:

L = f(Y / Yn)
a = f((X / Xn) - (Y / Yn))
b = f((Y / Yn) - (Z / Zn))

这些公式描述了将归一化的 XYZ 值转换为 Lab 颜色空间中的 L、a 和 b 分量的过程。
L 分量表示亮度。根据公式 L = f(Y / Yn),它是通过将归一化的 Y 值除以 Yn 并应用一个转换函数 f 来计算得到的。转换函数 f 是一个非线性函数,用于调整亮度的感知度。它通常采用对数函数或其他合适的映射方式。
a 分量表示从绿色到红色的范围。根据公式 a = f((X / Xn) - (Y / Yn)),它是通过将归一化的 X 值除以 Xn、将归一化的 Y 值除以 Yn,然后计算两者差值并应用转换函数 f 来得到的。这个差值表示相对于参考白点的红色分量偏移。
b 分量表示从蓝色到黄色的范围。根据公式 b = f((Y / Yn) - (Z / Zn)),它是通过将归一化的 Y 值除以 Yn、将归一化的 Z 值除以 Zn,然后计算两者差值并应用转换函数 f 来得到的。这个差值表示相对于参考白点的黄色分量偏移。
这些公式中的 Yn、Xn 和 Zn 是 Lab 颜色空间中的白点参考值,它们用于归一化 XYZ 值,以确保颜色空间转换的一致性。转换函数 f 可以根据具体的颜色空间标准进行选择,以满足对亮度和色度的感知性要求。这些公式的具体实现可以通过相关的编程库(如 OpenCV)中的函数来实现。

cv2.COLOR_GRAY2BGR
cv2.COLOR_GRAY2BGR 是将灰度图像转换为 BGR 彩色图像的颜色转换代码。

import cv2
# 读取灰度图像
gray_image = cv2.imread('gray_image.jpg', cv2.IMREAD_GRAYSCALE)
# 将灰度图像转换为 BGR 彩色图像
bgr_image = cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR)
# 显示 BGR 彩色图像
cv2.imshow('BGR Image', bgr_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.COLOR_GRAY2BGR 是将灰度图像转换为 BGR 彩色图像的颜色转换。以下是该颜色转换的数学公式解释:
假设输入的灰度图像的像素值为 G,BGR 彩色图像的像素值为 (B, G, R)。
由于灰度图像只有一个通道,所以在转换为 BGR 彩色图像时,需要为每个像素值分配相同的值作为 B、G 和 R 分量。因此,转换过程中 G 通道的值被复制到 B、G 和 R 通道中,保持像素值的一致性。
数学公式如下:
B = G
G = G
R = G
这意味着在转换过程中,BGR 彩色图像的每个像素的 B、G 和 R 值都等于输入灰度图像的像素值。
通过这个转换过程,灰度图像可以呈现为彩色图像,但是由于每个像素的 B、G 和 R 值相同,所以图像看起来是灰度的,没有彩色效果。
这种转换常用于在灰度图像上进行彩色标记或者在进行图像处理时需要将图像转换为彩色格式的情况。

cv2.COLOR_HSV2BGR

import cv2
import numpy as np
# 读取HSV彩色图像
hsv_image = cv2.imread('input_image.jpg', cv2.IMREAD_COLOR)
# 将HSV图像转换为BGR彩色图像
bgr_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR)
# 显示BGR彩色图像
cv2.imshow('BGR Image', bgr_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

HSV(Hue-Saturation-Value)是一种常用的颜色表示方式,其中色调(Hue)、饱和度(Saturation)和亮度(Value)分别表示颜色的不同属性。而BGR(Blue-Green-Red)是计算机中常用的彩色图像表示方式。
cv2.COLOR_HSV2BGR 函数用于将HSV图像转换为BGR图像。具体的转换过程可以通过以下数学公式表示:
对于一个HSV图像,假设 H 是色调,S 是饱和度,V 是亮度。而对应的BGR图像,假设 B 是蓝色通道,G 是绿色通道,R 是红色通道。
转换过程中,需要考虑HSV和BGR之间的归一化范围和映射关系。
归一化范围:
H 的范围是 [0, 360],转换为 [0, 179],作为 BGR 图像的色调值。
S 的范围是 [0, 1],不需要转换,直接作为 BGR 图像的饱和度值。
V 的范围是 [0, 1],不需要转换,直接作为 BGR 图像的亮度值。
映射关系:
将 H 转换为 BGR 图像的色调值时,需要进行归一化映射。映射关系为:B = H * 2, G = H * 2 - 1, R = H * 2 - 2。其中,B、G、R 的范围都是 [0, 255]。
饱和度和亮度直接作为 BGR 图像的对应通道值,范围为 [0, 255]。
综上所述,cv2.COLOR_HSV2BGR 的原理就是根据上述数学公式,对 HSV 图像的每个像素进行转换,得到相应的 BGR 图像。这样就实现了从 HSV 到 BGR 的颜色空间转换文章来源地址https://www.toymoban.com/news/detail-714695.html

到了这里,关于OpenCV中的一些色彩空间转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 初学opencv c++学习笔记(二)图像空间色彩转换cvtColor()

    对图像的色彩转换用到cvtColor()函数,本章将对此其用法进行解析。 目录 一、色彩空间转换 官方定义  函数参数解释 代码演示 RGB——HSV  RGB——GRAY  BGR——RGB 总结 提示:以下是本篇文章正文内容,下面案例可供参考 APL:cvtColor() 1. src (source):输入的源图像。为矩阵形式。

    2024年02月05日
    浏览(34)
  • opencv-19 图像色彩空间转换函数cv2.cvtColor()

    cv2.cvtColor() 函数是 OpenCV 中用于图像颜色空间转换的函数。它允许你将图像从一个色彩空间转换为另一个色彩空间。在 Python 中,你可以使用这个函数来实现不同色彩空间之间的转换。 函数的基本语法为: 参数说明: src:输入图像,可以是 NumPy 数组或 OpenCV 中的 Mat 对象。

    2024年02月15日
    浏览(38)
  • OpenCV 中的色彩空间 (C++ / Python)

    在本教程中,我们将了解计算机视觉中使用的流行色彩空间,并将其用于基于颜色的分割。我们还将分享 C++ 和 Python 的演示代码。

    2024年02月12日
    浏览(24)
  • C++实战Opencv第二天——色彩空间转换函数和opencv中图像对象创建与赋值(从零开始,保姆教学)

    OpenCV是一个强大的计算机视觉库,使用C++作为主要编程语言,对于图像处理和计算机视觉领域具有重要意义。其提供了丰富的功能和算法,使得开发者能够快速实现各种图像处理和计算机视觉应用。OpenCV C++为图像处理和计算机视觉领域的开发者提供了一个高效、稳定的工具。

    2024年02月20日
    浏览(32)
  • RGB 转换为 XYZ 和 LAB空间:convert between sRGB and CIEXYZ, 色域色彩相关

    转载自 How to convert between sRGB and CIEXYZ Technote 09 Aug 2017 sRGB 是常见的一个图像标准 cie xyz 是评估人眼视觉 常用的一个标准 The “s” in sRGB stands for “standard” and it is the lowest common denominator in color spaces. It was developed in the 1990s to provide a universal usable color space for display and printers of

    2024年02月04日
    浏览(30)
  • OpenCV 02(色彩空间)

    最常见的 色彩空间 就是RGB, 人眼也是基于RGB的色彩空间去分辨颜色的. OpenCV 默认使用的是BGR . BGR和RGB色彩空间的区别在于图片在色彩通道上的排列顺序不同. 显示图片的时候需要注意适配图片的色彩空间和显示环境的色彩空间.比如传入的图片是BGR色彩空间, 显示环境是RBG空间

    2024年02月09日
    浏览(32)
  • OpenCv色彩空间

    目录 一、RGB 二、图像处理入门 三、色彩空间的转换 在表示图像时,有多种不同的颜色模型,但最常见的是红、绿、蓝(RGB) 模型RGB 模型是一种加法颜色模型,其中原色 (在RGB模型中,原色是红色 R、绿色 G 和蓝色 B)混合在一起就可以用来表示广泛的颜色范围。 每个原色(R,G,

    2024年02月16日
    浏览(30)
  • opencv 图像色彩空间转化

    今天看了b站贾志刚的课,觉得不错,特地做学习笔记来和小伙伴分享 贾志刚的这个好像是2.0版本,30小时的,语言更加精炼,适合初级入门学习 第一节是常规安装   看他的步骤装就行了,记得配置完点应用再点确定,我第一次就是 没点然后就失败了,又得重配置一次 第二节就是基

    2024年02月22日
    浏览(35)
  • opencv-18 什么是色彩空间?

    色彩空间类型,也称为颜色空间类型或色彩模型,是一种表示图像中颜色的方式。在计算机图形学和数字图像处理中,有许多种色彩空间类型,每种类型有不同的表达方式和特点。 常见的色彩空间类型包括: RGB (Red, Green, Blue): RGB 是最常见和广泛使用的色彩空间类型。它使

    2024年02月15日
    浏览(24)
  • Python-OpenCV中的图像处理-颜色空间转换

    在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会 发现我们经常用到的也就两种: BGR G r a y 和 B G R Gray 和 BGR G r a y 和 BGR HSV。 注意:在 OpenCV 的 HSV 格式中, H(色彩/色度)的取值范围是 [0, 179],S(饱和度)的取值范围 [0, 255], V(亮度)的取值范围 [0,

    2024年02月13日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包