opencv#12 图像颜色空间变换

一、图像颜色空间介绍

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;

}

结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值