type
status
date
slug
summary
tags
category
icon
password
Email
文章首发于我的个人博客:欢迎大佬们来逛逛
图形读取与显示
通过
imread
我们可以读取一个图片其形式如下:
而我们需要传递一个InputArray类型的参数,实际上就是
cv::Mat
如果创建cv::Mat呢?
可以通过它的很多的构造函数
先来了解一下图片的颜色通道。
- 颜色通道
- RGB 图像有4 个默认通道:红色、绿色和蓝色各有一个通道,以及一个用于编辑图像复合通道(主通道)
- 彩色深度
- 8位色,每个像素所能显示的彩色数为2的8次方,即256种颜色。
- 16位增强色,16位彩色,每个像素所能显示的彩色数为2的16次方,即65536种颜色。
- 24位真彩色,每个像素所能显示的彩色数为24位,即2的24次方,约1680万种颜色。
- 32位真彩色,即在24位真彩色图像的基础上再增加一个表示图像透明度信息的Alpha通道。
- Alpha通道:一张图片的透明和半透明度
我们使用如下的形式来描述它的通道类型:
其中:
- bit_depth:位数,就是我们上面讲的彩色深度
- S|U|F:即 signed ,unsigned int,float 来存储
- number_of_channels:通道,有单通道,双通道,三通道,和四通道等等
关于图像像素数据类型的详细信息:
加载图片
Mat类型的结构如下:
我们使用如下的几种方式来加载图片:
- CV_8UC1:单通道
- Scalar:使用BGR形式
- clone/copyTo:从另一个Mat拷贝
显示图片
我们使用函数:
imshow
我们已经直到了它的第二个参数是一个类型,用来表示以何种形式显示图片:
cv::ImreadModes
操作图片像素值
- CV_8UC3 图像是三通道彩色图像,每个像素由三个 uchar 值组成,分别表示蓝色、绿色和红色通道的强度。
- CV_8UC1 图像是单通道灰度图像,每个像素只有一个 uchar 值表示灰度强度。
CV_8UC3 图像的操作:
使用 cv::Mat::at(row, col) 函数可以读取特定位置的像素值。它返回一个 cv::Vec3b 对象,其中包含蓝色、绿色和红色通道的值。您可以使用 val[0]、val[1] 和 val[2] 分别访问蓝色、绿色和红色通道的值。
CV_8UC1 图像的操作:
使用 cv::Mat::at(row, col) 函数可以读取特定位置的像素值。它返回一个 uchar 值,表示灰度强度。
请注意,对于 CV_8UC3 图像,要读取或修改特定通道的值,您可以通过 val[0]、val[1] 和 val[2] 分别访问蓝色、绿色和红色通道的值。
打印图片信息
我们可以打印
Mat
的信息,因为它实际上就是一个矩阵,我们可以采用多种形式来格式化输出- C语言形式
- numpy形式
- python形式
….
保存图片
使用函数:
imwrite
第一个参数为保存的图片的路径,第二个参数为保存的图片。
其中路径我们可以使用
cv::String
来传递,就是个字符串。色彩模型转换
什么是色彩模型?
颜色模型指的是某个三维颜色空间中的一个可见光子集,它包含某个色彩域的所有色彩。一般而言,任何一个色彩域都只是可见光的子集,任何一个颜色模型都无法包含所有的可见光(通俗一点讲就是表示颜色的一种方式
RGB颜色模型
在计算机体系中,最常见的色彩模型就是
RGB颜色
模型。它具有三维坐标的模型形式:
- RGB16:每个像素用
16个比特位
表示,占2个字节
。 - RGB565:RGB分量分别使用5位、6位、5位:
- RGB555:RGB分量分别使用5位、5位、5位:
- 对于
RGB555
,如何获取各个5位上的值,即分别获取 R,G,B所代表的值? - 通过位运算即可获取。
- RGB24格式:每个像素用
24比特位
表示,占3个字节
,在内存中RGB各排列顺序为:BGR:
- RGB32格式:每个像素用
32比特位
表示,占4个字节
,R,G,B分量分别用8个bit表示,存储顺序为B,G,R,最后8个字节保留 - ARGB32:本质就是带
alpha通道
的RGB24,与RGB32的区别在与,保留的8个bit
用来表示透明,也就是alpha
的值 - 对于
RGB32
,如何获取各个8位上的值,即分别获取 R,G,B,Alpha所代表的值? - 通过位运算即可获取。
HSV颜色模型
HSV
(Hue, Saturation,Value)也被称为六角锥体模型,即色调,饱和度,明度将RGB转换为HSV模型:
cvtColor
函数:将图像从一种颜色模型转换为另一个。
- 起到关键作用的是第三个参数:
cv::ColorConversionCodes
是一个枚举,表示了你想要从谁转换到谁,这里我们让BGR形式转换为HSV形式。
HLS模型
HLS模型分别是色调,亮度,饱和度。
上图可以看出,固定一个颜色(H),那么随着饱和度(S,Chroma)的增加,颜色越来越深。
LAB模型
Lab颜色模型由三个要素组成,一个要素是
亮度
(L),a 和b是两个颜色通道。a
包括的颜色是从深绿色(低亮度值)到灰色(中亮度值)再到亮粉红色(高亮度值)
b
是从亮蓝色(低亮度值)到灰色(中亮度值)再到黄色(高亮度值)。
- 因此,这种颜色混合后将产生具有明亮效果的色彩。
还有很多的颜色模型都可以在
cvtColor
这个函数中找到。图像像素读写操作
openCV基本类型介绍:
- 基本类型:
- 封装类型:Vec类似于std::vector,只不过可以指定其大小,并且命名规则为 cv:: Vec
大小
+类型
图像是由像素掉构成的,因此我们可以获取图像的每一个像素,这个像素是由(i,j)确定的,即在图片宽度与高度的范围下,每一个行的每一列都可以是一个像素。
我们使用 Mat 的
at
函数来获取某个位置的像素值。注意像素具有
channels
的区别。- 如果是单通道: 则直接获取
uchar
表示一个像素(一字节)。
- 如果是三通道: 则需要获取
Vec3b
表示三个像素,可以通过[0],[1],[2]来分别操作。
以下操作对图片转换为负片,使用 255 - 当前像素值。
安全类型转换:
saturate_cast<T>
是openCV的一种安全转换函数,当我们对像素执行加减乘除的时候,有可能会超出 的范围,因此使用此函数来保证不会越界。实际上这个函数就是:
- 超过255:转为255
- 小于0:转为0
像素算数运算
图像可以进行像素之间的算数运算,跟我们上节的对像素的简单减法是一样的:
我们有专门的函数:
- add:像素加
- subtract:像素减
- multiply:像素乘
- divide:像素除
- addWeighted:对图片执行: 的操作,其中的和就是透明度。
除了基本的运算,还有二进制运算:
- and:像素按位与
- or:按位或
- not:按位取反
- xor:按位异或
测试如下:
需要两个原图片执行下面的这些操作,我使用的图片是:(注意尺寸要一样)
然后自行执行下面代码。
图形文字绘制
绘制线
使用
line
函数,原型如下:在执行 imshow的之前,在图片上画一条线:
绘制圆
使用
circle
函数来绘制圆或者填充圆效果如下:
- 填充效果需要把
thickness
置为-1。
绘制矩形
使用
rectangle
函数来绘制矩形。效果如下:
绘制椭圆
使用
ellipse
来绘制椭圆:效果如下:
绘制文字
使用
putText
来绘制文字,注意不支持中文!!!!!!!!!!!!!测试如下:
其他绘制函数
绘制多边形线:
- polylines
绘制填充多边形:
- fillPoly
文本参考
- 作者:Yuleo
- 链接:https://www.helloylh.com/article/opencv2
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。