OpenCV4 图像色彩空间转换 HSV RGB概念介绍 C++实现

时间:2024-07-20 19:35:40

开发环境:OpenCV 4.1.0 、 Clion 、Windows10

文章目录

    • HSV与RGB概念介绍
      • RGB(红、绿、蓝)
      • HSV(色调、饱和度、明度)
      • 区别与应用
        • 1. 表示方式不同
        • 2. 适用场景不同
        • 3. 颜色操作
    • 转换示例 C++实现
      • 示例代码
      • cvtColor函数原型
        • 参数说明
        • 常用的转换代码
      • 效果图
    • 注意事项

HSV与RGB概念介绍

HSV(Hue, Saturation, Value)和 RGB(Red, Green, Blue)是两种不同的颜色表示方法,各自有不同的特点和应用场景。

RGB(红、绿、蓝)

RGB 是一种基于光的颜色表示方法,通过红、绿、蓝三个颜色通道的不同组合来表示各种颜色。每个通道的值范围通常是 0 到 255。

特点:

  • 加色模型:RGB 是一种加色模型,主要用于显示器、电视、相机等基于发光原理的设备。
  • 颜色表示直观:直接表示颜色,但不容易进行颜色操作,例如调节亮度、饱和度等。

颜色表示:

  • 纯红色:RGB(255, 0, 0)
  • 纯绿色:RGB(0, 255, 0)
  • 纯蓝色:RGB(0, 0, 255)
  • 白色:RGB(255, 255, 255)
  • 黑色:RGB(0, 0, 0)

HSV(色调、饱和度、明度)

HSV 是一种更接近人类视觉感知的颜色表示方法,通过色调(Hue)、饱和度(Saturation)和明度(Value)来表示颜色。

特点:

  • 色调(H):表示颜色的类型,范围是 0 到 360 度。0 度为红色,120 度为绿色,240 度为蓝色。
  • 饱和度(S):表示颜色的纯度,范围是 0 到 100%。0% 表示灰色,100% 表示纯色。
  • 明度(V):表示颜色的亮度,范围是 0 到 100%。0% 表示黑色,100% 表示最亮的颜色。

颜色表示:

  • 纯红色:HSV(0, 100%, 100%)
  • 纯绿色:HSV(120, 100%, 100%)
  • 纯蓝色:HSV(240, 100%, 100%)
  • 白色:HSV(0, 0%, 100%)
  • 黑色:HSV(0, 0%, 0%)

区别与应用

1. 表示方式不同
  • RGB 通过组合红、绿、蓝三种基色的强度来表示颜色。
  • HSV 通过色调、饱和度和明度来表示颜色,更接近人类的视觉感知。
2. 适用场景不同
  • RGB 适用于需要直接显示颜色的场景,如屏幕显示、图像存储等。
  • HSV 适用于需要进行颜色操作的场景,如图像处理、颜色选择器等,因其可以更方便地调节颜色的亮度和饱和度。
3. 颜色操作
  • RGB 中,调节亮度和饱和度并不直观,需要对 R、G、B 三个通道进行复杂的计算。
  • HSV 中,调节亮度和饱和度非常直观,只需调整 V 和 S 的值即可。

转换示例 C++实现

示例代码

#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
    string imagePath = "C:\\Users\\Marxist\\Pictures\\coco\\test.jpg";
    Mat image = imread(imagePath);
    if(image.empty()){
        cout<<"file not exist!"<<endl;
        return -1;
    }
    resize(image, image, Size(640, 640));
    Mat hsv_image ;
    Mat gray_image;
    cvtColor(image,hsv_image,COLOR_BGR2HSV);
    cvtColor(image,gray_image,COLOR_BGR2GRAY);
    imshow("hsv_image", hsv_image);
    imshow("rgb_image", image);
    imshow("gray_image", gray_image);
    waitKey(0);
    imwrite("F:\\opencv_dev\\gray.jpg",gray_image);
    imwrite("F:\\opencv_dev\\hsv.jpg",hsv_image);
    destroyAllWindows();

    return 0;
}

cvtColor函数原型

CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
参数说明
  • src:输入图像。
  • code:颜色空间转换代码,例如 cv2.COLOR_BGR2GRAY 表示将 BGR 转换为灰度图像。
  • dst:输出图像,大小和类型与 src 相同。
  • dstCn(可选):目标图像的通道数。
常用的转换代码
  • cv2.COLOR_BGR2GRAY:BGR 转换为灰度图像。
  • cv2.COLOR_BGR2RGB:BGR 转换为 RGB。
  • cv2.COLOR_BGR2HSV:BGR 转换为 HSV。
  • cv2.COLOR_RGB2BGR:RGB 转换为 BGR。
  • cv2.COLOR_RGB2HSV:RGB 转换为 HSV。
  • cv2.COLOR_HSV2BGR:HSV 转换为 BGR。
  • cv2.COLOR_HSV2RGB:HSV 转换为 RGB。

效果图

在这里插入图片描述

注意事项

为什么HSV图像在显示器上显示感觉不正常?

  1. BGR 图像和 HSV 图像在显示器上的显示效果不同是因为它们使用了不同的颜色表示方式。在 OpenCV 中,图像默认使用 BGR 格式,但在转换到 HSV 后,直接显示 HSV 图像会导致颜色不正确,因为显示器并不直接支持 HSV 颜色空间的显示。
  2. HSV 颜色空间并不是用于直接显示的颜色空间,而是用于颜色处理和分析。
  3. 当你将图像转换为 HSV 颜色空间后,如果直接使用 cv2.imshow() 显示 HSV 图像,显示器会误将 HSV 数据解释为 BGR 数据,因此颜色会看起来非常奇怪和不正确。