【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

相关文章

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤