当前位置: 首页 > article >正文

实战OpenCV之色彩空间转换

基础入门

        色彩空间是描述颜色的一种数学模型,它定义了颜色的三个或更多维度,比如:亮度、色相和饱和度等。最著名的色彩空间之一是RGB,它基于人眼对光的感知原理,通过红、绿、蓝三种基本颜色的不同强度组合来表示几乎所有的可见颜色。然而,RGB并不是唯一的色彩空间,还有许多其他色彩空间,比如:HSV(色调、饱和度、明度)、YCrCb(亮度、红色差分、蓝色差分)等,每种色彩空间都有其特定的应用场景和优势。

        HSV色彩空间,又称为HSB(Hue, Saturation, Brightness)或HSL(Hue, Saturation, Lightness),是一种面向人类感知的颜色表示方法。相较于RGB色彩空间,HSV更贴近人们理解和描述颜色的方式。色相(Hue)是色彩的基本属性,表示颜色的种类,比如:红、橙、黄、绿、青、蓝、紫等。饱和度(Saturation)表示颜色的纯度或鲜艳程度,即颜色中灰色成分的比例。明度(Value)或亮度(Brightness)表示颜色的明亮程度,它是颜色的能量或光的强度。明度与光照强度有关,而不改变颜色本身的色调和饱和度。

        YCrCb是基于人眼视觉特性的,它将色彩信息分离为亮度(Luma, Y)和色差(Chrominance, Cr和Cb)两部分。这种分离有助于减少数据冗余,便于高效的压缩和传输。Y表示图像的亮度信息,它包含了图像的灰度信息,是人眼最敏感的部分。Cr表示图像中红色成分与亮度值之间的差异,反映图像中的红色信息。Cb表示图像中蓝色成分与亮度值之间的差异,反映图像中的蓝色信息。

接口介绍

        在OpenCV中,我们可以使用cv::cvtColor()来进行色彩空间的转换,其函数原型如下。

void cv::cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0);

        各个参数的含义如下。

        src:输入图像,类型为cv::Mat。

        dst:输出图像,需与输入图像具有相同的尺寸和深度,或者事先分配好内存。

        code:转换代码,定义了源色彩空间到目标色彩空间的转换类型。

        dstCn:目标图像的通道数,大多数情况下可以省略,默认值为0表示自动计算。

        常见的色彩空间转换类型有如下几种。

        1、RGB到GRAY。通常用于图像预处理,去除颜色信息,仅保留亮度信息。适用于对颜色不敏感的场景,比如:边缘检测、纹理分析等。

        2、RGB到HSV。HSV色彩空间更接近人类对颜色的感知,常用于颜色分割、物体识别等任务。

        3、RGB到YCrCb。YCrCb色彩空间源于YUV色彩空间,广泛应用于视频处理、图像压缩和肤色检测等领域。

实战解析

        在下面的实战代码中,我们首先尝试读取图像文件。读取成功后,将其依次转换为三种不同的色彩空间表示形式:灰度、HSV、YCrCb。最后,我们通过cv::imshow显示了这些转换后的图像。

#include <opencv2/opencv.hpp>
using namespace cv;

#include <iostream>
using namespace std;

int main(int argc, char** argv)
{
    Mat srcImage = imread("OpenCV.png");
    if(srcImage.empty())
    {
        cout << "Can not open or find the image" << endl;
        return -1;
    }

    // BGR转GRAY
    Mat grayImage;
    cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);

    // BGR转HSV
    Mat hsvImage;
    cvtColor(srcImage, hsvImage, COLOR_BGR2HSV);

    // BGR转YCrCb
    Mat ycrcbImage;
    cvtColor(srcImage, ycrcbImage, COLOR_BGR2YCrCb);

    // 显示图像
    namedWindow("Gray Image", WINDOW_NORMAL);
    imshow("Gray Image", grayImage);

    namedWindow("HSV Image", WINDOW_NORMAL);
    imshow("HSV Image", hsvImage);

    namedWindow("YCrCb Image", WINDOW_NORMAL);
    imshow("YCrCb Image", ycrcbImage);

    waitKey(0);
    destroyAllWindows();
    return 0;
}

        执行上面的代码,运行效果可参考下图。


http://www.kler.cn/a/321466.html

相关文章:

  • week 11 - BCNF
  • 【赵渝强老师】MongoDB逻辑存储结构
  • vulnhub靶场-matrix-breakout-2-morpheus攻略(截止至获取shell)
  • 各种网站(学习资源及其他)
  • kimi搜索AI多线程批量生成txt原创文章软件-不需要账号及key
  • |-牛式-|
  • 第一个maven web工程(eclipse)
  • 【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第三篇-着色器光照】
  • 代码随想录打卡Day39
  • 【devops】devops-ansible模块介绍
  • 卷积神经网络-迁移学习
  • Spire.PDF for .NET【页面设置】演示:对PDF 文件进行分页
  • 【ASE】第一课_双面着色器
  • 增量式编码器实现原理
  • 使用python爬取豆瓣网站?如何简单的爬取豆瓣网站?
  • FPGA中系统门数和逻辑门数的理解
  • 智视臂传-AI视觉触感未来丨OPENAIGC开发者大赛高校组AI创作力奖
  • 计算机毕业设计 基于Hadoop的智慧校园数据共享平台的设计与实现 Python 数据分析 可视化大屏 附源码 文档
  • 性能设计模式
  • 1.6 判定表
  • 【C++与数据结构】搜索二叉树(BinarySearchTree)
  • 数据仓库-数据质量规范
  • 问:聊聊JAVA中的共享锁和独占锁?
  • 了解针对基座大语言模型(类似 ChatGPT 的架构,Decoder-only)的重头预训练和微调训练
  • 前端Vue 基础学习1
  • 暗黑破坏神4新资料片憎恶之躯即将上线,第六赛季暗黑破坏神4搬砖如何获得最大收益?