【OpenCV】【入门】2.色彩空间转换

软件环境

本系列文章中所提到的接口及代码在以下环境中得到过验证:

Python == 3.8.5
opencv-contrib-python == 4.5.5.64

前言

在进行图像处理的过程中经常需要对图像的色彩空间进行转换,本文将对色彩空间的转换做一定的介绍。
色彩空间也称颜色模型、颜色空间、色彩模型等,它是图像在计算机内部的一种存储方式。常见的色彩空间包括RGB、GRAY、XYZ、YCrCb、HSV等。每种色彩空间都有其擅长的问题解决领域。所以在解决具体色彩问题时就需要进行特定的色彩类型空间转换。

API接口

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

官方文档对各个输入参数的解释:
在这里插入图片描述
在使用过程中,一般情况下只需关注src,即输入图像的数组,还有code。code常见的取值如下:

转换代码说明
cv2.COLOR_BGR2RGB将BGR色彩空间转换为RGB色彩空间
cv2.COLOR_BGR2GRAY将BGR色彩空间转换为GRAY色彩空间
cv2.COLOR_BGR2YCrCb将BGR色彩空间转换为YCrCb色彩空间
cv2.COLOR_BGR2HSV将BGR色彩空间转换为HSV色彩空间

色彩空间转换案例

1、将BGR色彩空间转换为RGB色彩空间

RGB色彩空间使用R(Red,红)、G(Green,绿)、B(Blue,蓝)3种基本颜色表示图像像素。RGB色彩空间中,图像的每一个像素用一个三元组表示,三元组中的3个值依次表示红色、绿色和蓝色,依次对应R、G、B通道。
需要注意的是,OpenCV中默认使用BGR色彩空间,它按照B、G、R通道顺序表示图像。

import cv2

# BGR to RGB
img = cv2.imread('test.jpg')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

cv2.imshow('BGR', img)
cv2.imshow('RGB', img_rgb)

k = cv2.waitKey(0)
if k == 27:
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('img_rgb.png', img_rgb)
    cv2.destroyAllWindows()

从结果可以看出,图像的蓝色通道与红色通道出现了很明显的对调,儿绿色通道没有很明显的改变。
在这里插入图片描述

2、将BGR色彩空间转换为GRAY色彩空间

GRAY色彩空间通常指8位灰度图像,其颜色取值范围为[0,255],共256个灰度级。从BGR色彩空间转换为GRAY色彩空间的计算公式为:

  • Gray = 0.299R + 0.587G + 0.114B

其中,R、G、B为RGB色彩空间中R、G、B通道的图像。

import cv2

# BGR to GRAY
img = cv2.imread('test.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

cv2.imshow('BGR', img)
cv2.imshow('GRAY', img_gray)

k = cv2.waitKey(0)
if k == 27:
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('img_gray.png', img_gray)
    cv2.destroyAllWindows()

在这里插入图片描述

3、将BGR色彩空间转换为YCrCb色彩空间

YCrCb色彩空间用亮度Y,红色Cr、蓝色Cb表示图像。从BGR色彩空间转换为YCrCb色彩空间的计算公式为:

  • Y = 0.299R + 0.587G + 0.114B
  • Cr = 0.713(R - Y) + delta
  • Cb = 0.564(B - Y) + delta

其中,delta = 128(8位图像)、delta = 32767(16位图像)、delta = 0.5(单精度图像)

import cv2

# BGR to YCrCb
img = cv2.imread('test.jpg')
img_YCrCb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)

cv2.imshow('BGR', img)
cv2.imshow('GRAY', img_YCrCb)

k = cv2.waitKey()
if k == 27:
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('img_YCrCb.png', img_YCrCb)
    cv2.destroyAllWindows()

在这里插入图片描述

4、将BGR色彩空间转换为HSV色彩空间

HSV色彩空间使用色调(Hue,也称色相)、饱和度(Saturation)、亮(Value)度表示图像。

  • 色调H表示颜色,用角度表示,取值范围为[0°,360°],从红光开始逆时针方向计算。
  • 饱和度S表示颜色接近光谱色的程度,或表示光谱色中混入白光的比例。光谱色中白光的比例越低,饱和度越高,颜色越深、艳。光谱色中白光比例为0时,饱和度达到最高。饱和度的取值范围为[0,1]。
  • 亮度V表示颜色的明亮的程度,是人眼可感受到的明暗程度,其取值范围为[0,1]。
import cv2

# BGR to HSV
img = cv2.imread('test.jpg')
img_HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

cv2.imshow('BGR', img)
cv2.imshow('HSV', img_HSV)

k = cv2.waitKey()
if k == 27:
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('img_HSV.png', img_HSV)
    cv2.destroyAllWindows()


一般情况下进行彩色图像阈值化处理时经常将图像转换为HSV色彩空间
在这里插入图片描述

参考

https://blog.csdn.net/weixin_43843069/article/details/121789093
https://docs.opencv.org/4.x/d8/d01/group__imgproc__color__conversions.html#ga397ae87e1288a81d2363b61574eb8cab

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值