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

实战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转GRAYMat grayImage;cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);// BGR转HSVMat hsvImage;cvtColor(srcImage, hsvImage, COLOR_BGR2HSV);// BGR转YCrCbMat 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.mrgr.cn/news/37221.html

相关文章:

  • LabVIEW提高开发效率技巧----并行处理
  • 使用PyTorch进行自然语言处理:实现一个文本分类函数
  • Redis实战--Redis应用过程中出现的热门问题及其解决方案
  • XSS | DOM 型 XSS 攻击
  • MySQL基础知识(三)
  • 定时任务上云改造方案
  • HI3521DV200 22AP10/SS524V100 芯片及开发板
  • GNU链接器(LD):PHDRS 命令用法及实例详解
  • 解决图片放大模糊
  • 多线程计算π
  • C语言 | Leetcode C语言题解之第440题字典序的第K小数字
  • LM393 电压比较器和典型电路
  • DSP——从入门到放弃系列——多核导航器(持续更新)
  • C++中的动态图形与音频同步:实现罗盘时钟与音乐播放器
  • Flask 本地测试完成,如何部署到网络上,买什么样的空间
  • HarmonyOS异常处理实践
  • VC++同时处理ANSI和Unicode字符集,除了使用TCHAR和_T()宏外,还有其他方法可以实现吗?
  • 基于51单片机的方向盘模拟系统
  • 【学习笔记】手写 Tomcat 七
  • 算法学习021 c++有多少张桌子 并查集算法学习 中小学算法思维学习 比赛算法题解 信奥算法解析