【OpenCV(C++)快速入门】--上篇--计算机图像颜色基础理论

专栏介绍】因为专业需要用到OpenCV来处理图像数据,所以需要学习,搜索了网上的相关资料,整体知识比较零散,花费了较多时间,所以才萌生了将学习过程整理成专栏的形式,希望能帮到后来的人,也方便自己复习。如有错漏欢迎评论或者私信指出,我定当及时更正。

本系列共有上中下三篇,后面有空会再做个小项目,并放出来。

上篇:计算机图像颜色基础理论

中篇:OpenCV中对图像的处理

https://blog.csdn.net/weixin_45703465/article/details/122583774​​​​​​
 

下篇:【OpenCV(C++)快速入门】--下篇--OpenCV中的颜色、形状、人脸和轮廓检测_山海里啊有星辰的博客-CSDN博客

1 图像及颜色

1.1 颜色空间

1.1.1 RGB颜色空间

红、绿、蓝三原色相信大部分人都听说过,根据三原色理论,生活中的绝大多数颜色都可以由三原色组合而成。计算机显示彩色图像同样也不例外,显示的时候,控制一个像素的Red,Green,Blue的值,就可以确定这个像素的颜色。当然计算机中没办法模拟一种颜色完全连续的从最暗到最亮的变化,只能综合考虑计算机的控制能力及人眼的分辨能力,采用三个字节(3*8个二进制位)来分别表示一种一个像素的Red,Green,和Blue发光强度的值,从而达到表现不同颜色的目的。这就是常见的RGB格式。

RGB的每个元素在计算机内存中占用1个字节,1个字节等于8个bit位,所以RGB每个元素的取值范围为:0~256(2的8次方),那么三色组合起来256x256x256=16777216(一千六百七十七万七千二百一十六)种颜色,这么多的颜色几乎可以覆盖世界上所有的颜色!所以平常电视机、电脑屏幕、任何显示仪器都会通过这种RGB颜色空间来显示!

这里给出两种常见的颜色组合方式:

红色 + 绿色 = 黄色

红色 + 绿色 +蓝色 = 白色

当然,计算机中的颜色表示方法不仅仅只有上述一种这么简单,在这篇引用的文章中有更加详细的介绍,大家可以去看看:RGB颜色空间、色调、饱和度、亮度、HSV颜色空间详解_17岁boy的博客-CSDN博客_hsv颜色空间

1.1.2 HSV颜色空间

HSV是一种将RGB色彩空间中的点在倒圆锥体中的表示方法,也就是说HSV和RGB是对应的,只是两个不同表现方式。

                                   【OpenCV(C++)快速入门】--上篇--计算机图像颜色基础理论_第1张图片

HSV即色相(Hue)、饱和度(Saturation)、亮度(Value)。

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

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

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

1.2 图像的表达

1.2 .1图像的基本类型

在计算机中,我们常见的图像类型有以下几种:

  1. 二值化图像: 一幅二值图像的二维矩阵仅由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(矩阵中每一元素)取值仅有0、1两种可能,所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。

  1. 灰度图像: 灰度图像矩阵元素的取值范围通常为[0,255]。因此其数据类型一般为8位无符号整数的(int8),这就是人们经常提到的256灰度图像。“0”表示纯黑色,“255”表示纯白色,中间的数字从小到大表示由黑到白的过渡色。在某些软件中,灰度图像也可以用双精度数据类型(double)表示,像素的值域为[0,1],0代表黑色,1代表白色,0到1之间的小数表示不同的灰度等级。二值图像可以看成是灰度图像的一个特例。

  1. 索引图像:索引图像的文件结构比较复杂,除了存放图像的二维矩阵外,还包括一个称之为颜色索引矩阵MAP的二维数组。MAP的大小由存放图像的矩阵元素值域决定,如矩阵元素值域为[0,255],则MAP矩阵的大小为256Ⅹ3,用MAP=[RGB]表示。MAP中每一行的三个元素分别指定该行对应颜色的红、绿、蓝单色值,MAP中每一行对应图像矩阵像素的一个灰度值,如某一像素的灰度值为64,则该像素就与MAP中的第64行建立了映射关系,该像素在屏幕上的实际颜色由第64行的[RGB]组合决定。也就是说,图像在屏幕上显示时,每一像素的颜色由存放在矩阵中该像素的灰度值作为索引通过检索颜色索引矩阵MAP得到。索引图像的数据类型一般为8位无符号整形(int8),相应索引矩阵MAP的大小为256Ⅹ3,因此一般索引图像只能同时显示256种颜色,但通过改变索引矩阵,颜色的类型可以调整。索引图像的数据类型也可采用双精度浮点型(double)。索引图像一般用于存放色彩要求比较简单的图像,如Windows中色彩构成比较简单的壁纸多采用索引图像存放,如果图像的色彩比较复杂,就要用到RGB真彩色图像。

  1. 真彩色RGB图像:RGB图像与索引图像一样都可以用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。但与索引图像不同的是,RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形,通常用于表示和存放真彩色图像,当然也可以存放灰度图像。

1.2.2 图像的大小、深度和通道

在OpenCV中,定义的图像一般会包含图像的大小、深度和通道等几个元素。一般我们是用 cv::Mat 去定义一个图像,例如:

cv::Mat img(512, 512, CV_8UC3, Scalar(255, 255, 255));

上面这一语句实例化了一个Mat 的对象img;其大小为512像素*512像素,类型为8位无符号整型三通道;颜色为纯白色(Scalar(255,255,255) B= 255 G= 255 R=255)。

CV_8UC3 中 8表示 8bit; U表示无符号整型数 S = 符号整型 F = 浮点型; C3 表示3通道;

同理,CV_8SC1 即表示8bit带符号整型单通道类型的图像;CV_32FC2是指一个32位浮点型双通道矩阵,这两个例子中的数字就代表了位深度,数字越大单个通道能表示的颜色就越细,可以理解位调节的粒度。

位深度 取值范围
IPL_DEPTH_8U - 无符号8位整型 0--255
IPL_DEPTH_8S - 有符号8位整型 -128--127
IPL_DEPTH_16U - 无符号16位整型 0--65535
IPL_DEPTH_16S - 有符号16位整型 -32768--32767
IPL_DEPTH_32S - 有符号32位整型 0--65535
IPL_DEPTH_32F - 单精度浮点数 0.0--1.0
IPL_DEPTH_64F - 双精度浮点数 0.0--1.0

那么,单通道和多通道有啥区别呢,例如,单通道图像由一字节就可以表示一个像素的色彩(明暗),而三通道则需要3个字节才能表示一个像素的色彩,RGB彩色图一般就是三通道,每个通道表示一个颜色。4通道通常为RGBA,在某些处理中可能会用到。2通道图像不常见,通常在程序处理中会用到,如傅里叶变换,可能会用到,一个通道为实数,一个通道为虚数,主要是编程方便。还有一种情况就是16位图像,本来是3通道,但是为了减少数据量,压缩为16位,刚好两个通道,常见格式有RGB555或RGB565,也就是说R占5位,G占5或6位,B占5位,也有RGBA5551格式。

1.3 图像在计算机中的坐标

图像像素的坐标不同于我们常见的直角坐标,它的坐标原点是在图像的左上角,向右为x的正方向,向下为y轴的正方向;

【OpenCV(C++)快速入门】--上篇--计算机图像颜色基础理论_第2张图片

在Windows环境下,如果我们想要获取图片某像素的坐标,我们可以通过“画图”工具打开,在左下角就会出现对应点的坐标。如下:

【OpenCV(C++)快速入门】--上篇--计算机图像颜色基础理论_第3张图片

参考资料:

【1】RGB颜色空间、色调、饱和度、亮度、HSV颜色空间详解_17岁boy的博客-CSDN博客_hsv颜色空间

【2】HSV颜色空间_WuDong-CSDN博客_hsv颜色

【3】opencv-图像类型、深度、通道_dgc70876的博客-CSDN博客

你可能感兴趣的:(OpenCV快速入门,计算机视觉,图像处理,c++,opencv)