【opencv4.3.0教程】09之转换颜色空间(cvtColor)及类型(convertTo)

2023-12-11 20:32

本文主要是介绍【opencv4.3.0教程】09之转换颜色空间(cvtColor)及类型(convertTo),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

一、转换颜色空间

1、什么是颜色空间

2、颜色空间有哪些

1.BGR系列

2.灰度空间

3.HSV系列

4.其他

3、API——cvtColor

4、颜色空间转换代码ColorConversionCodes

二、转换图像类型

1、图像类型引入

2、常见图像类型

3、API——convertTo


前言

上一篇文章,我们讲到了掩膜操作,我们自己写掩膜操作的过程中,将图像转化为灰度图像。我们使用了转换色彩空间。今天我们就来讲下在opencv中的转换色彩空间和转换图像类型。

一、转换颜色空间

1、什么是颜色空间

我们的世界是五彩缤纷的,通过不同的颜色,带给我们不同的视觉盛宴。其实这些不同的颜色,都是可以由基本的颜色组成的,比如我们经常说的光学三原色、颜料三原色,我们可以通过三种颜色的配比,得到不同种各式各样的颜色。

比如上面这幅图的右面的图,我们可以构建一个三维的空间,当每个方向取不同的值,我们就能得到不同的颜色,这个就是颜色空间

 

2、颜色空间有哪些

我们知道什么是颜色空间,我们就来说一下常见的颜色空间有哪些吧!

1.BGR系列

最常见的就是BGR系列了,其中:

B表示blue,蓝色;

G表示green,绿色;

R表示red,红色;

我们可以通过不同的组合得到不同的颜色;每个取值范围都是0-255,如果用16进制表示就是 0-FF。

BGR系列表示有一定的问题:

1.RGB 颜色空间利用三个颜色分量的线性组合来表示颜色,任何颜色都与这三个分量有关。

2.自然界中,由于光照等问题的影响,颜色发生变化,而是哪个颜色分量和光照都有关,所以图像亮度改变,三个通道的颜色都会改变。

3.人眼睛对不同颜色的敏感程度不同,有时候难以对一个颜色进行区分。

4.适用于图像显示,不适用于图像处理。

我们可以打开电脑的画图工具,输入不同的值,来获取不同的图像:

2.灰度空间

灰度空间算是简化的BGR空间,BGR有三个通道,分别表示三个像素分量,灰度空间只有一个通道,取值范围也是0-255,值越大,颜色越趋向于白色,值越小,颜色越趋向于黑色。

对于下图,就是一个从0一直取值到255之后的图像:

 

 

3.HSV系列

除了BGR系列,我们最常见的是HSV系列了,其中:

H表示Hue,色调;用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;

S表示Saturation,饱和度;一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。

V表示Value,明度;明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

所以我们表示HSV空间,通常使用一个柱面坐标系:

 

4.其他

除了上面的,还有很多颜色空间,比如:

1.CMY是工业印刷采用的颜色空间。它与RGB对应。简单的类比RGB来源于是物体发光,而CMY是依据反射光得到的。具体应用如打印机:一般采用四色墨盒,即CMY加黑色墨盒。

2.Lab:Lab颜色空间是由CIE(国际照明委员会)制定的一种色彩模式。自然界中任何一点色都可以在Lab空间 中表达出来,色彩空间比RGB空间大。Lab用数字化的方法来描述人的视觉感应。弥补了RGB和CMYK模式必须依赖于设备色彩特性的不足。

3.HSL:与HSV类似,主要差别在于L和V,L表示的是亮度,强调白色的亮度如何;V表示的是明度,表示光的亮度,可以是任何颜色光的亮度;

 

3、API——cvtColor

在opencv中提供了专门的API来调整色彩空间:

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

函数参数含义如下:

(1)InputArray类型的points,输入图像。

(2)OutputArray类型的dst,输出图像。

(3)int类型的code,颜色空间转换代码(具体请看“ColorConversionCodes”)。

(4)bool类型的returnPoints,目标图像中的通道数;如果参数为0,则通道数自动从src和code派生。

在使用过程中,我们需要指定转换代码,第四个参数一般都是默认。举个例子:

cvtColor(src, src1, COLOR_BGR2GRAY);

重点在于,第三个参数,都有哪些取值呢?接下来,让我们详细来看一下:

4、颜色空间转换代码ColorConversionCodes

我们上面接触到了一个转换代码:

上面确实是我们最常用的,我们经常需要将一个彩色图像,转化为一个灰度图像,然后做后续的一些操作,当然,我们还有其他的很多转换代码:

enum ColorConversionCodes {COLOR_BGR2BGRA     = 0, //!< add alpha channel to RGB or BGR imageCOLOR_RGB2RGBA     = COLOR_BGR2BGRA,COLOR_BGRA2BGR     = 1, //!< remove alpha channel from RGB or BGR imageCOLOR_RGBA2RGB     = COLOR_BGRA2BGR,COLOR_BGR2RGBA     = 2, //!< convert between RGB and BGR color spaces (with or without alpha channel)COLOR_RGB2BGRA     = COLOR_BGR2RGBA,COLOR_RGBA2BGR     = 3,COLOR_BGRA2RGB     = COLOR_RGBA2BGR,COLOR_BGR2RGB      = 4,COLOR_RGB2BGR      = COLOR_BGR2RGB,COLOR_BGRA2RGBA    = 5,COLOR_RGBA2BGRA    = COLOR_BGRA2RGBA,COLOR_BGR2GRAY     = 6, //!< convert between RGB/BGR and grayscale, @ref color_convert_rgb_gray "color conversions"COLOR_RGB2GRAY     = 7,COLOR_GRAY2BGR     = 8,COLOR_GRAY2RGB     = COLOR_GRAY2BGR,COLOR_GRAY2BGRA    = 9,COLOR_GRAY2RGBA    = COLOR_GRAY2BGRA,COLOR_BGRA2GRAY    = 10,COLOR_RGBA2GRAY    = 11,COLOR_BGR2BGR565   = 12, //!< convert between RGB/BGR and BGR565 (16-bit images)COLOR_RGB2BGR565   = 13,COLOR_BGR5652BGR   = 14,COLOR_BGR5652RGB   = 15,COLOR_BGRA2BGR565  = 16,COLOR_RGBA2BGR565  = 17,COLOR_BGR5652BGRA  = 18,COLOR_BGR5652RGBA  = 19,COLOR_GRAY2BGR565  = 20, //!< convert between grayscale to BGR565 (16-bit images)COLOR_BGR5652GRAY  = 21,COLOR_BGR2BGR555   = 22,  //!< convert between RGB/BGR and BGR555 (16-bit images)COLOR_RGB2BGR555   = 23,COLOR_BGR5552BGR   = 24,COLOR_BGR5552RGB   = 25,COLOR_BGRA2BGR555  = 26,COLOR_RGBA2BGR555  = 27,COLOR_BGR5552BGRA  = 28,COLOR_BGR5552RGBA  = 29,COLOR_GRAY2BGR555  = 30, //!< convert between grayscale and BGR555 (16-bit images)COLOR_BGR5552GRAY  = 31,COLOR_BGR2XYZ      = 32, //!< convert RGB/BGR to CIE XYZ, @ref color_convert_rgb_xyz "color conversions"COLOR_RGB2XYZ      = 33,COLOR_XYZ2BGR      = 34,COLOR_XYZ2RGB      = 35,COLOR_BGR2YCrCb    = 36, //!< convert RGB/BGR to luma-chroma (aka YCC), @ref color_convert_rgb_ycrcb "color conversions"COLOR_RGB2YCrCb    = 37,COLOR_YCrCb2BGR    = 38,COLOR_YCrCb2RGB    = 39,COLOR_BGR2HSV      = 40, //!< convert RGB/BGR to HSV (hue saturation value), @ref color_convert_rgb_hsv "color conversions"COLOR_RGB2HSV      = 41,COLOR_BGR2Lab      = 44, //!< convert RGB/BGR to CIE Lab, @ref color_convert_rgb_lab "color conversions"COLOR_RGB2Lab      = 45,COLOR_BGR2Luv      = 50, //!< convert RGB/BGR to CIE Luv, @ref color_convert_rgb_luv "color conversions"COLOR_RGB2Luv      = 51,COLOR_BGR2HLS      = 52, //!< convert RGB/BGR to HLS (hue lightness saturation), @ref color_convert_rgb_hls "color conversions"COLOR_RGB2HLS      = 53,COLOR_HSV2BGR      = 54, //!< backward conversions to RGB/BGRCOLOR_HSV2RGB      = 55,COLOR_Lab2BGR      = 56,COLOR_Lab2RGB      = 57,COLOR_Luv2BGR      = 58,COLOR_Luv2RGB      = 59,COLOR_HLS2BGR      = 60,COLOR_HLS2RGB      = 61,COLOR_BGR2HSV_FULL = 66,COLOR_RGB2HSV_FULL = 67,COLOR_BGR2HLS_FULL = 68,COLOR_RGB2HLS_FULL = 69,COLOR_HSV2BGR_FULL = 70,COLOR_HSV2RGB_FULL = 71,COLOR_HLS2BGR_FULL = 72,COLOR_HLS2RGB_FULL = 73,COLOR_LBGR2Lab     = 74,COLOR_LRGB2Lab     = 75,COLOR_LBGR2Luv     = 76,COLOR_LRGB2Luv     = 77,COLOR_Lab2LBGR     = 78,COLOR_Lab2LRGB     = 79,COLOR_Luv2LBGR     = 80,COLOR_Luv2LRGB     = 81,COLOR_BGR2YUV      = 82, //!< convert between RGB/BGR and YUVCOLOR_RGB2YUV      = 83,COLOR_YUV2BGR      = 84,COLOR_YUV2RGB      = 85,//! YUV 4:2:0 family to RGBCOLOR_YUV2RGB_NV12  = 90,COLOR_YUV2BGR_NV12  = 91,COLOR_YUV2RGB_NV21  = 92,COLOR_YUV2BGR_NV21  = 93,COLOR_YUV420sp2RGB  = COLOR_YUV2RGB_NV21,COLOR_YUV420sp2BGR  = COLOR_YUV2BGR_NV21,COLOR_YUV2RGBA_NV12 = 94,COLOR_YUV2BGRA_NV12 = 95,COLOR_YUV2RGBA_NV21 = 96,COLOR_YUV2BGRA_NV21 = 97,COLOR_YUV420sp2RGBA = COLOR_YUV2RGBA_NV21,COLOR_YUV420sp2BGRA = COLOR_YUV2BGRA_NV21,COLOR_YUV2RGB_YV12  = 98,COLOR_YUV2BGR_YV12  = 99,COLOR_YUV2RGB_IYUV  = 100,COLOR_YUV2BGR_IYUV  = 101,COLOR_YUV2RGB_I420  = COLOR_YUV2RGB_IYUV,COLOR_YUV2BGR_I420  = COLOR_YUV2BGR_IYUV,COLOR_YUV420p2RGB   = COLOR_YUV2RGB_YV12,COLOR_YUV420p2BGR   = COLOR_YUV2BGR_YV12,COLOR_YUV2RGBA_YV12 = 102,COLOR_YUV2BGRA_YV12 = 103,COLOR_YUV2RGBA_IYUV = 104,COLOR_YUV2BGRA_IYUV = 105,COLOR_YUV2RGBA_I420 = COLOR_YUV2RGBA_IYUV,COLOR_YUV2BGRA_I420 = COLOR_YUV2BGRA_IYUV,COLOR_YUV420p2RGBA  = COLOR_YUV2RGBA_YV12,COLOR_YUV420p2BGRA  = COLOR_YUV2BGRA_YV12,COLOR_YUV2GRAY_420  = 106,COLOR_YUV2GRAY_NV21 = COLOR_YUV2GRAY_420,COLOR_YUV2GRAY_NV12 = COLOR_YUV2GRAY_420,COLOR_YUV2GRAY_YV12 = COLOR_YUV2GRAY_420,COLOR_YUV2GRAY_IYUV = COLOR_YUV2GRAY_420,COLOR_YUV2GRAY_I420 = COLOR_YUV2GRAY_420,COLOR_YUV420sp2GRAY = COLOR_YUV2GRAY_420,COLOR_YUV420p2GRAY  = COLOR_YUV2GRAY_420,//! YUV 4:2:2 family to RGBCOLOR_YUV2RGB_UYVY = 107,COLOR_YUV2BGR_UYVY = 108,//COLOR_YUV2RGB_VYUY = 109,//COLOR_YUV2BGR_VYUY = 110,COLOR_YUV2RGB_Y422 = COLOR_YUV2RGB_UYVY,COLOR_YUV2BGR_Y422 = COLOR_YUV2BGR_UYVY,COLOR_YUV2RGB_UYNV = COLOR_YUV2RGB_UYVY,COLOR_YUV2BGR_UYNV = COLOR_YUV2BGR_UYVY,COLOR_YUV2RGBA_UYVY = 111,COLOR_YUV2BGRA_UYVY = 112,//COLOR_YUV2RGBA_VYUY = 113,//COLOR_YUV2BGRA_VYUY = 114,COLOR_YUV2RGBA_Y422 = COLOR_YUV2RGBA_UYVY,COLOR_YUV2BGRA_Y422 = COLOR_YUV2BGRA_UYVY,COLOR_YUV2RGBA_UYNV = COLOR_YUV2RGBA_UYVY,COLOR_YUV2BGRA_UYNV = COLOR_YUV2BGRA_UYVY,COLOR_YUV2RGB_YUY2 = 115,COLOR_YUV2BGR_YUY2 = 116,COLOR_YUV2RGB_YVYU = 117,COLOR_YUV2BGR_YVYU = 118,COLOR_YUV2RGB_YUYV = COLOR_YUV2RGB_YUY2,COLOR_YUV2BGR_YUYV = COLOR_YUV2BGR_YUY2,COLOR_YUV2RGB_YUNV = COLOR_YUV2RGB_YUY2,COLOR_YUV2BGR_YUNV = COLOR_YUV2BGR_YUY2,COLOR_YUV2RGBA_YUY2 = 119,COLOR_YUV2BGRA_YUY2 = 120,COLOR_YUV2RGBA_YVYU = 121,COLOR_YUV2BGRA_YVYU = 122,COLOR_YUV2RGBA_YUYV = COLOR_YUV2RGBA_YUY2,COLOR_YUV2BGRA_YUYV = COLOR_YUV2BGRA_YUY2,COLOR_YUV2RGBA_YUNV = COLOR_YUV2RGBA_YUY2,COLOR_YUV2BGRA_YUNV = COLOR_YUV2BGRA_YUY2,COLOR_YUV2GRAY_UYVY = 123,COLOR_YUV2GRAY_YUY2 = 124,//CV_YUV2GRAY_VYUY    = CV_YUV2GRAY_UYVY,COLOR_YUV2GRAY_Y422 = COLOR_YUV2GRAY_UYVY,COLOR_YUV2GRAY_UYNV = COLOR_YUV2GRAY_UYVY,COLOR_YUV2GRAY_YVYU = COLOR_YUV2GRAY_YUY2,COLOR_YUV2GRAY_YUYV = COLOR_YUV2GRAY_YUY2,COLOR_YUV2GRAY_YUNV = COLOR_YUV2GRAY_YUY2,//! alpha premultiplicationCOLOR_RGBA2mRGBA    = 125,COLOR_mRGBA2RGBA    = 126,//! RGB to YUV 4:2:0 familyCOLOR_RGB2YUV_I420  = 127,COLOR_BGR2YUV_I420  = 128,COLOR_RGB2YUV_IYUV  = COLOR_RGB2YUV_I420,COLOR_BGR2YUV_IYUV  = COLOR_BGR2YUV_I420,COLOR_RGBA2YUV_I420 = 129,COLOR_BGRA2YUV_I420 = 130,COLOR_RGBA2YUV_IYUV = COLOR_RGBA2YUV_I420,COLOR_BGRA2YUV_IYUV = COLOR_BGRA2YUV_I420,COLOR_RGB2YUV_YV12  = 131,COLOR_BGR2YUV_YV12  = 132,COLOR_RGBA2YUV_YV12 = 133,COLOR_BGRA2YUV_YV12 = 134,//! DemosaicingCOLOR_BayerBG2BGR = 46,COLOR_BayerGB2BGR = 47,COLOR_BayerRG2BGR = 48,COLOR_BayerGR2BGR = 49,COLOR_BayerBG2RGB = COLOR_BayerRG2BGR,COLOR_BayerGB2RGB = COLOR_BayerGR2BGR,COLOR_BayerRG2RGB = COLOR_BayerBG2BGR,COLOR_BayerGR2RGB = COLOR_BayerGB2BGR,COLOR_BayerBG2GRAY = 86,COLOR_BayerGB2GRAY = 87,COLOR_BayerRG2GRAY = 88,COLOR_BayerGR2GRAY = 89,//! Demosaicing using Variable Number of GradientsCOLOR_BayerBG2BGR_VNG = 62,COLOR_BayerGB2BGR_VNG = 63,COLOR_BayerRG2BGR_VNG = 64,COLOR_BayerGR2BGR_VNG = 65,COLOR_BayerBG2RGB_VNG = COLOR_BayerRG2BGR_VNG,COLOR_BayerGB2RGB_VNG = COLOR_BayerGR2BGR_VNG,COLOR_BayerRG2RGB_VNG = COLOR_BayerBG2BGR_VNG,COLOR_BayerGR2RGB_VNG = COLOR_BayerGB2BGR_VNG,//! Edge-Aware DemosaicingCOLOR_BayerBG2BGR_EA  = 135,COLOR_BayerGB2BGR_EA  = 136,COLOR_BayerRG2BGR_EA  = 137,COLOR_BayerGR2BGR_EA  = 138,COLOR_BayerBG2RGB_EA  = COLOR_BayerRG2BGR_EA,COLOR_BayerGB2RGB_EA  = COLOR_BayerGR2BGR_EA,COLOR_BayerRG2RGB_EA  = COLOR_BayerBG2BGR_EA,COLOR_BayerGR2RGB_EA  = COLOR_BayerGB2BGR_EA,//! Demosaicing with alpha channelCOLOR_BayerBG2BGRA = 139,COLOR_BayerGB2BGRA = 140,COLOR_BayerRG2BGRA = 141,COLOR_BayerGR2BGRA = 142,COLOR_BayerBG2RGBA = COLOR_BayerRG2BGRA,COLOR_BayerGB2RGBA = COLOR_BayerGR2BGRA,COLOR_BayerRG2RGBA = COLOR_BayerBG2BGRA,COLOR_BayerGR2RGBA = COLOR_BayerGB2BGRA,COLOR_COLORCVT_MAX  = 143
};

我们使用不同的类型来看一下结果:

原图如下:

原图

代码如下:

	cvtColor(src, src1, COLOR_BGR2GRAY);imshow("src gray", src1);cvtColor(src, src1, COLOR_BGR2HSV);imshow("src hsv", src1);cvtColor(src, src1, COLOR_BGR2XYZ);imshow("src xyz", src1);

结果如下:

HSV
Gray
XYZ

其他的大家也可以尝试一下,看一下效果怎么样。

 

二、转换图像类型

1、图像类型引入

图像也分为很多种类型,我们之前也接触过,就是创建一个Mat类,其构造函数有的需要指定图像类型,我想大家应该还记得我们在讲Mat类型的时候,基本类型中有的需要指定图像类型:

    Mat(Size size, int type);    Mat(int rows, int cols, int type);

包括后面基于基本类型的构造函数,也需要类型。

图像类型的概念,我们之前也有接触过一些,比如三通道,单通道,灰度图像获取像素指针时候的,需要指定类型。

所以,图像生成之后,类型也就随之产生。

让我们走进常见图像类型,来深入了解一下吧!

2、常见图像类型

我们在interface.h文件中可以看到所有的类型:

#define CV_8U   0
#define CV_8S   1
#define CV_16U  2
#define CV_16S  3
#define CV_32S  4
#define CV_32F  5
#define CV_64F  6
#define CV_16F  7#define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)
#define CV_MAT_DEPTH(flags)     ((flags) & CV_MAT_DEPTH_MASK)#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
#define CV_MAKE_TYPE CV_MAKETYPE#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
#define CV_8UC2 CV_MAKETYPE(CV_8U,2)
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
#define CV_8UC4 CV_MAKETYPE(CV_8U,4)
#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))#define CV_8SC1 CV_MAKETYPE(CV_8S,1)
#define CV_8SC2 CV_MAKETYPE(CV_8S,2)
#define CV_8SC3 CV_MAKETYPE(CV_8S,3)
#define CV_8SC4 CV_MAKETYPE(CV_8S,4)
#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))#define CV_16UC1 CV_MAKETYPE(CV_16U,1)
#define CV_16UC2 CV_MAKETYPE(CV_16U,2)
#define CV_16UC3 CV_MAKETYPE(CV_16U,3)
#define CV_16UC4 CV_MAKETYPE(CV_16U,4)
#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))#define CV_16SC1 CV_MAKETYPE(CV_16S,1)
#define CV_16SC2 CV_MAKETYPE(CV_16S,2)
#define CV_16SC3 CV_MAKETYPE(CV_16S,3)
#define CV_16SC4 CV_MAKETYPE(CV_16S,4)
#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))#define CV_32SC1 CV_MAKETYPE(CV_32S,1)
#define CV_32SC2 CV_MAKETYPE(CV_32S,2)
#define CV_32SC3 CV_MAKETYPE(CV_32S,3)
#define CV_32SC4 CV_MAKETYPE(CV_32S,4)
#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))#define CV_32FC1 CV_MAKETYPE(CV_32F,1)
#define CV_32FC2 CV_MAKETYPE(CV_32F,2)
#define CV_32FC3 CV_MAKETYPE(CV_32F,3)
#define CV_32FC4 CV_MAKETYPE(CV_32F,4)
#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))#define CV_64FC1 CV_MAKETYPE(CV_64F,1)
#define CV_64FC2 CV_MAKETYPE(CV_64F,2)
#define CV_64FC3 CV_MAKETYPE(CV_64F,3)
#define CV_64FC4 CV_MAKETYPE(CV_64F,4)
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))#define CV_16FC1 CV_MAKETYPE(CV_16F,1)
#define CV_16FC2 CV_MAKETYPE(CV_16F,2)
#define CV_16FC3 CV_MAKETYPE(CV_16F,3)
#define CV_16FC4 CV_MAKETYPE(CV_16F,4)
#define CV_16FC(n) CV_MAKETYPE(CV_16F,(n))
//! @}

对于下面的这些,我们发现它的构成是固定的:

CV_ + 数字 + U\S\F + C + 数字:

(1)第一个数字取值为8,16,32

(2)第二个数字取值为1,2,3,4

 

上面是我们的直观印象,其实它的定义如下:

CV_ + <bit_depth> + U\S\F + C + <number_of_channels>

其中:

CV_ :就是一个前缀,没有实际含义

<bit_depth> :位数,指的是图像像素的位数,如果一个像素占8位内存空间,这个位置上就是8

U\S\F :像素值类型,其中:U是指unsigned int,无符号整型;S是指signed int,有符号整型;F是指float,单精度浮点型。

C + <number_of_channels> :指定图像通道数,如果为1,是指单通道,又叫灰度图;如果是3,是指三通道,是我们常见的彩色图像;如果为4,指的是带Alpha通道的RGB彩色图像。

 

3、API——convertTo

在opencv中提供了API来转换图像类型:

inline
void GpuMat::convertTo(OutputArray dst, int rtype) const
{convertTo(dst, rtype, Stream::Null());
}inline
void GpuMat::convertTo(OutputArray dst, int rtype, double alpha, double beta) const
{convertTo(dst, rtype, alpha, beta, Stream::Null());
}inline
void GpuMat::convertTo(OutputArray dst, int rtype, double alpha, Stream& stream) const
{convertTo(dst, rtype, alpha, 0.0, stream);
}

这里面都调用了下面的函数:

    //! converts GpuMat to another datatype with scaling (Non-Blocking call)CV_WRAP void convertTo(OutputArray dst, int rtype, double alpha, double beta, Stream& stream) const;

一般来说,我们只考虑前两个参数,含义如下:

(1)OutputArray类型的dst,输出图像。

(2)int类型的rtype,图像转换类型。

举个例子:

src.convertTo(src2, CV_32FC1);

 

这个其实并不常用,重点还是第一个,所以我们要熟练掌握图像的颜色空间转换。

这篇关于【opencv4.3.0教程】09之转换颜色空间(cvtColor)及类型(convertTo)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/482022

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

沁恒CH32在MounRiver Studio上环境配置以及使用详细教程

目录 1.  RISC-V简介 2.  CPU架构现状 3.  MounRiver Studio软件下载 4.  MounRiver Studio软件安装 5.  MounRiver Studio软件介绍 6.  创建工程 7.  编译代码 1.  RISC-V简介         RISC就是精简指令集计算机(Reduced Instruction SetCom

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G