一、图像颜色空间介绍
1.RGB颜色模型
RGB模型是一个空间立体形式,由三个通道组成,每个通道分别表示不同的颜色分量,然后将这三个颜色分量叠加,就能看到彩色的现象,比如三个通道里面都是黑色,那么最后合成的结果就是黑色,若三个颜色的通道值都为最大,比如是最亮的红色,蓝色,绿色,那么合成的颜色就会是白色。
我们在图像中常用的数据区间是由0-255组成,和上图中的0-1对应。 就相当于我们将8U(8位无符号整数)压缩到0-1之间,这种形式相当于是一个连续的色彩变换,可以组合出很多种颜色,使用离散型,也可以组合出很多颜色。
在这里为什么要使用0-1之间的数据呢?
是因为我们在对图像进行处理时,不仅需要对图像进行加减,有时还需要进行乘除,,比如我需要将图像中的像素值都放大1.5倍,那么此时就会出现小数点的情况,如果我还是用8位无符号整数,那么此时得到的结果将会是一堆整数,它与真实值的扩大1.5的结果具有差距。所以有时候我们必须要使用含有小数点的情况,所以在Opencv里,提供了3种可以用于存储图像的数据区间:
1.8U 0-255
2.float类型(32F) 0-1
3.double类型(64F) 0-1
opencv中将0-1映射为0-255,大于1的部分变为白色,小于1的部分变为黑色,是一种强制类型转换,64F同理,我们有时需要将这3种类型进行转换。
图像数据类型间的互相转换
convertTo()
void cv::Mat::convertTo(OutputArray m,
int rtype,
alpha =
double 1,
double beta = 0
) const
·m:输出图像,在变换数据类型之后的结果
·rtype:转换后数据类型
·alpha:缩放系数
·beta:平移系数
alpha*I(x,y) = beta
2.HSV颜色模型
通过三个量可以唯一确定颜色,而且可以和RGB空间对应,HSV的空间模型是一个锥形,最下面是最黑,母线是亮度,半径是饱和度,圆的周长表示色调。
3.GRAY颜色模型
和RGB之间有个互相转换的关系,只能由彩色转换为黑色,由上图公式可知,如果只知道灰度值,是没法推测出三个通道的值,但是若知道三个通道的值,就知道了灰度值。
颜色转换
cvtColor()
void cv::cvColor(InputArray src,
OutputArray dst,
int code,
int dstCn = 0
)
·src:待转换颜色模型的原始图像
·dst:转换颜色模型后的目标图像
·code:颜色空间转换的标志,如果由RGB空间到HSV空间
·dstCn:目标图像中的通道数,如果参数为0,则从src和代码中自动导出通道数
示例1
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv; //opencv的命名空间
using namespace std;
int main()
{
Mat img = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/lenac.jpeg"); //0-255
Mat img32;
img.convertTo(img32,CV_32F, 1 / 255.0, 0); //0-255转换为0-1
Mat HSV, HSV32;
cvtColor(img, HSV, COLOR_BGR2HSV);//0-255转换结果
cvtColor(img32, HSV32, COLOR_BGR2HSV);//0-1转换结果
return 0;
}
结果
示例2
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv; //opencv的命名空间
using namespace std;
int main()
{
Mat img = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/lenac.jpeg"); //0-255
Mat img32;
img.convertTo(img32,CV_32F, 1 / 255.0, 0); //0-255转换为0-1
Mat HSV, HSV32;
cvtColor(img, HSV, COLOR_BGR2HSV);//0-255转换结果
cvtColor(img32, HSV32, COLOR_BGR2HSV);//0-1转换结果
Mat gray0, gray1;
cvtColor(img, gray0, COLOR_BGR2GRAY);//0-255转换结果
cvtColor(img32, gray1, COLOR_BGR2GRAY);//0-1转换结果
return 0;
}
结果