实战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;
}
执行上面的代码,运行效果可参考下图。