编程学习
🖼️C++OpenCV(2):图像处理基础概念与操作
00 分钟
2023-7-5
2023-11-23
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颜色模型。
它具有三维坐标的模型形式:
notion image

  • RGB16:每个像素用16个比特位表示,占2个字节
    • RGB565:RGB分量分别使用5位、6位、5位:
    • notion image
    • RGB555:RGB分量分别使用5位、5位、5位:
      • notion image
    • 对于RGB555,如何获取各个5位上的值,即分别获取 R,G,B所代表的值?
      • 通过位运算即可获取。
      •  
  • RGB24格式:每个像素用24比特位表示,占3个字节,在内存中RGB各排列顺序为:BGR:
    • notion image
  • RGB32格式:每个像素用32比特位表示,占4个字节,R,G,B分量分别用8个bit表示,存储顺序为B,G,R,最后8个字节保留
    • ARGB32:本质就是带alpha通道的RGB24,与RGB32的区别在与,保留的8个bit用来表示透明,也就是alpha的值
      • notion image
    • 对于RGB32,如何获取各个8位上的值,即分别获取 R,G,B,Alpha所代表的值?
      • 通过位运算即可获取。

HSV颜色模型

HSV(Hue, Saturation,Value)也被称为六角锥体模型,即色调,饱和度,明度
notion image
将RGB转换为HSV模型:
  • cvtColor函数:将图像从一种颜色模型转换为另一个。
  • 起到关键作用的是第三个参数:cv::ColorConversionCodes 是一个枚举,表示了你想要从谁转换到谁,这里我们让BGR形式转换为HSV形式。
notion image
notion image

HLS模型

HLS模型分别是色调,亮度,饱和度
notion image
上图可以看出,固定一个颜色(H),那么随着饱和度(S,Chroma)的增加,颜色越来越深。
notion image
notion image

LAB模型

 Lab颜色模型由三个要素组成,一个要素是亮度(L),a 和b是两个颜色通道
  • a包括的颜色是从深绿色(低亮度值)到灰色(中亮度值)再到亮粉红色(高亮度值)
  • b是从亮蓝色(低亮度值)到灰色(中亮度值)再到黄色(高亮度值)。
  • 因此,这种颜色混合后将产生具有明亮效果的色彩。
notion image
notion image
notion image
还有很多的颜色模型都可以在 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:按位异或

测试如下:
需要两个原图片执行下面的这些操作,我使用的图片是:(注意尺寸要一样)
notion image
然后自行执行下面代码。
notion image

图形文字绘制

绘制线

使用line函数,原型如下:
在执行 imshow的之前,在图片上画一条线:
 
notion image
 

绘制圆

使用circle函数来绘制或者填充圆
效果如下:
  • 填充效果需要把thickness置为-1。
notion image

绘制矩形

使用rectangle函数来绘制矩形。
效果如下:
notion image

绘制椭圆

使用ellipse来绘制椭圆:
效果如下:
notion image

绘制文字

使用putText来绘制文字,注意不支持中文!!!!!!!!!!!!!
测试如下:
notion image

其他绘制函数

绘制多边形线:
  • polylines
绘制填充多边形:
  • fillPoly
 

文本参考
 

评论
  • Twikoo
  • Valine