附加题Part2: 图像处理相关概念
一、颜⾊模式(color model)
1、RGB:红绿蓝
- 眼熟吧,在手势识别项目咱就遇到过
- 物理光的颜色模型,光的三原色,基于黑色背景
- 每个颜色通道的取值范围为 0 到 255,其中 0 表示没有该颜色的光,255 表示该颜色的最大亮度
2、CMYK:青、洋红、黄、黑
- 用于印刷、绘画的颜色模型,基于在白色背景(如白纸)
- 就是画画的时候,只需要用青色、洋红、黄色三种颜色就能够调出任何颜色
将三种颜色的颜料等量混合时,就能得到黑色的颜料
3、HSV:色调(Hue)、饱和度(Saturation)和明度(Value)
- 一种直观的颜色模型,基于…人类视觉感受
- 色相:颜色在色轮上的位置,取值范围为0到360度
饱和度:颜色的纯度或饱和度,取值范围为0到1
亮度/明度:颜色的明亮程度,取值范围为0到1
在openCV中的颜色范围定义区间
4、HSL:色相、饱和度、亮度
-
其与HSV在字面意思是一致的
-
在原理和表现上,HSL和HSL中的H(色相)完全一致,但二者的S(饱和度)不一样,L和V (明度)也不一样:
HSV 中- S 控制纯色中混入白色的量,值越大,白色越少,颜色越纯;
- V 控制纯色中混入黑色的量,值越大,黑色越少,明度越高
HSL 中 - S 和黑白没有关系,饱和度不控制颜色中混入黑白的多少;
- HSL 中的 L 控制纯色中的混入的黑白两种颜色。
二、图片与格式(Figure)
1、分辨率(resolution),位图(bitmap),图像深度(depth),通道(channel),像素(pixel),Alpha通道
1、分辨率(resolution)
- 指图像中所包含的像素数量,通常以横向像素数与纵向像素数来表示
- 分辨率越高,图像质量越好,但文件大小也越大
- 通俗地讲:就是指水平方向像素数*垂直方向像素数
- 随便打开一张图片的属性信息都能找到
2、位图(bitmap)
- 也叫光栅图像,由二维的像素阵列组成的图像格式,与矢量图(可以去查一查哦)对应
每个像素定义了图像中的一点,其颜色或灰度值决定该点的显示效果 - 这个概念很简单,无需多言
3、图像深度(depth)
- 也被称为位深,指每个像素的颜色或灰度值占用的比特数
- 像素深度:存储每个像素所需要的比特数。假定存储每个像素需要8bit,则图像的像素深度为8
图像深度:像素深度中实际用于存储图像的灰度或色彩所需要的比特位数 - 对于手势识别项目中的(0,0,255)就解释得通了–相当于对于R、G、B中的每一项均是以8位进行存储的
- 深度越高,能够表示的颜色或灰度级别就越多,图像的细节和精度也越高
- 一种色彩8位是非常接近肉眼所能分辨的颜色梯度的,所以很常用(24bit色深已成为现时彩色扫描仪的最基本要求,最高的更已达至36bit或48 bit)
4、通道(channel)
- 指每个像素中包含的颜色或灰度值的单独组成部分
- RGB就是三通道,CMYK就是四通道,灰度图像就一个亮度通道
5、像素 (pixel)
- 图像中最小的上下排列的点,图像处理及显示中的基本单元
- 很简单,无需多言
6、Alpha通道
- 透明度通道,指图像中每个像素的透明度值
- 通常存储为像素的第四个分量,与 RGB 通道一起组成 ARGB 格式
- eg1:一个使用每个像素16比特存储的位图
每5个比特表示红绿蓝,最后一个比特是Alpha
则Alpha只有0和1,表示要么透明、要么不透明 - eg2:一个使用32个比特存储的位图
每8个比特表示红绿蓝和阿尔法通道
则Alpha可以表示256级的半透明度
7、位图在内存中的储存形式
-
OpenCV应该是用BGR格式将图片存储在内存中的,每个颜色占用8位(1字节)
-
尝试用这个思路算了下上面图例的内存,理论上讲应该是
215*244*3/1024=153.69140625
不是应该是153KB吗,咋大了这门多?
-
实际上:jpg格式的图片是经过压缩过的,所以并没有确定公式能计算出压缩后的存储内存
-
使用OpenCV提供的函数转换图片格式时,函数将重新分配内存并更改像素的排列顺序,以适应新的格式
三、Edge detection的pipeline
tis:这里可以自己先查一查再继续哦,也可以顺带了解一下图像预处理的pipeline
1、关于pipeline
- pipeline,中文直意为管线,意义等同于流水线
- 就是一个作业过程,诸如Gpu渲染管线、深度学习模型框架的管线等等
- 基础的深度学习的Pipeline主要包含了下述 5 个步骤
- 数据读取
- 数据预处理
- 创建模型(具体到模型也有相应的Pipeline)
- 评估模型结果
- 模型调参
2、Edge detection的pipeline
- Edge detection,即边缘检测,是图像处理中的重要一步
- 以下是GPT给出的Edge detection的pipeline
- 预处理:减少图像中的噪声
步骤包括灰度化、平滑滤波和图像锐化等操作 - 计算梯度:对预处理后的图像进行梯度计算,找到图像中的边缘位置
常用的梯度算子包括Sobel、Prewitt和Canny等(就是梯度滤波器) - 非极大值抑制:用于细化边缘
通过在梯度方向上比较像素值,保留局部极大值点,抑制其他非极大值点,从而得到更细的边缘 - 双阈值化和边缘连接
- 根据像素的梯度值,将图像分为强边缘、弱边缘和非边缘三个部分
- 通过设定高阈值和低阈值来区分这些部分
- 高阈值用于保留强边缘,低阈值用于保留可能的弱边缘
- 通过连接强边缘上的弱边缘,形成闭合的边缘
- 后处理:边缘填充或进一步边缘连接、边缘细化,以获得更准确的边缘检测结果
- 预处理:减少图像中的噪声
四、滤波(filtering)
(一)滤波是什么?
1、图像处理技术
- 滤波:可以用于去除图像中的噪声、模糊图像、强化图像的边缘
- 滤波器:一组权重值的矩阵,作用于图像的每个像素,根据周围像素的信息进行计算
- 滤波器也就是卷积核
2、滤波器的粗略分类
- 模糊化:去除图像噪声,平滑图像,包括均值模糊、中值模糊、高斯模糊、双边模糊等
- 梯度滤波器:锐化边缘及边缘检测,包括Sobel、Prewitt和Canny等
(二)滤波器
1、模糊化(blur)—低通滤波器
tis:该部分可参考[真正搞懂均值模糊、中值模糊、高斯模糊、双边模糊]一文(https://www.pythonheidong.com/blog/article/134327/28172079273cc0f07581/)
(1)均值模糊
①本质上就是将卷积核覆盖区域求平均数后得到新数组
用例:cv2.blur(img, (3, 3), borderType=cv2.BORDER_CONSTANT)
输入:
[[1. 1. 1. 1. 1.],
[2. 2. 2. 2. 2.],
[3. 3. 3. 3. 3.],
[4. 4. 4. 4. 4.],
[5. 5. 5. 5. 5.]]
经过3*3的均值滤波器处理
[[1/9. 1/9. 1/9]
[1/9. 1/9. 1/9]
[1/9. 1/9. 1/9]]
处理后可得
[[0.67 1. 1. 1. 0.67],
[1.33 2. 2. 2. 1.33],
[2. 3. 3. 3. 2. ],
[2.67 4. 4. 4. 2.67],
[2. 3. 3. 3. 2. ]]
(2)中值模糊
-
利用cv.BORDER_REPLICATE进行填充(这是默认的,不能改变!!)
-
假如有
[[1 1 3], [3 2 1], [1 1 3]]
则进行填充
(1) (1) (1) (3) (3) (1) 1 1 3 (3) (3) 3 2 1 (1) (1) 1 1 3 (3) (1) (1) (1) (3) (3)
然后按照3*3的卷积核把周围的9个数进行排序,取出中间的数作为结果
[[1 1 2], [1 1 2], [1 1 2]]
-
函数用例:dst = cv2.medianBlur(img, 3)
(3)高斯滤波
- 正态分布的密度函数(中心点在原点时)
放到二维中
- 内部处理过程
-
需要给定σ的值,再将σ的值和每个点的坐标代入求值
这里假定σ=1.5,则有
-
权重总和为0.4787147
如果只计算这9个点的加权平均,还必须让它们的权重之和等于1
因此上面9个值还要分别除以0.4787147,得到最终的权重矩阵
-
权重矩阵与原矩阵相乘
假设有矩阵[[14, 15, 16], [24, 25, 26], [34, 35, 36]]
则有
得到
-
最终将9个值加起来,即为中心点的高斯模糊后的值
-
- 归一问题
-
权重总值=1时–>不改变图像的亮度
权重总值>1时–>图像偏亮
权重总值<1时–>图像偏暗 -
权重总值=0–>边缘检测核(可以把边缘转化为白色,非边缘转化为黑色)
比如:-1 -1 -1 -1 8 -1 -1 -1 -1
-
(4)双边滤波
-
简单来说就是带有边缘(设置了断崖)检测功能的高斯滤波
但是实际上一点都不简单
-
上图中(a)为输入,©为输出,(b)就是双边滤波器
-
公式理解
其中有
- 对于除以Wp是比较好理解的,就是双边滤波器的归一操作(使权重和为1)
- 对于Gσs和Gσr公式的理解
- 公式中:
I(m,n):在(m,n)处的像素值
i,j:中心点的横纵坐标 - Gσs很好理解,处理的是各像素点与中心点的空间域问题
- Gσr为像素值判定,处理的是与中间点的像素域问题
- 公式中:
- 求和:
将像素值和空间域计算结果和像素域结果相乘
最后将这些结果相加起来,得到滤波算法公式的分子
-
参数选取
-
空间域sigma选取:通常为k=6 * sigma+1
离中心点3 *sigma大小之外的系数与中点的系数只比非常小,可以认为此之外的点与中心点没有任何联系 -
值域sigma选取:
- Sigma越大,边缘越模糊
极限情况为simga无穷大,值域系数近似相等
与高斯模板(空间域模板)相乘后可认为等效于高斯滤波。 - Sigma越小,边缘越清晰
极限情况为simga无限接近0
与高斯模板(空间域模板)相乘后,可近似为系数皆相等,等效于源图像。
- Sigma越大,边缘越模糊
-
2、梯度滤波器(边缘检测)—高通滤波器
- 搞错了,重来!
- 学习该部分内容时,感谢以下博主:
opencv从入门到放弃—梯度滤波器
OpenCV(十五)边缘检测1 – Sobel算子(一阶微分算子,X、Y方向边缘检测)
图像梯度与Sobel滤波器—OpenCV-Python开发指南(20)
图像处理学习(二)-图像滤波
(1)关于边缘检测
- 基于搜索
寻找图像一阶导数中的最大值来检测边界
通常采用梯度的方向,并利用此方向找到局部梯度模的最大值
代表算法:Sobel算子/Scharr算子
- 基于零穿越
寻找二阶导数零穿越来寻找边界(零点就是变化最大的点,即边缘点)
代表算法:Laplace算子
(2)三大基础算子
①从Prewitt算子讲起
-
推导过程(核心:后-前)
即有Prewitt算子如下:
x方向卷积核-1 0 1 -1 0 1 -1 0 1
y方向卷积核
-1 -1 -1 0 0 0 1 1 1
②Sobel算子(基于搜索)
- 在Prewitt算子基础上加上权值,结合高斯平滑和微分求导
以上即为Sobel算子
③Scharr算子(基于搜索)
- Sobel在ksize=3的优化版本
- Sobel在ksize=3时可能产生比较明显的误差,此时用Scharr算子更好
- 跟sobel一样的速度,但结果更精确;但仅作用于大小为3的内核
④Laplace算子(基于零穿越)
- 采用二阶微分,关心的是图像灰度的突变而不强调灰度缓慢变化的区域
- 具有旋转不变性
- 一阶微分里,我们是用|dx|+|dy|来近似一个点的梯度
- 当图像旋转一个角度时,这个值就变化了
掌握了相关概念后,接下来就是图像处理的基本操作了,欢迎继续关注附加题part3ヾ(◍°∇°◍)ノ゙
特别声明:以上的图片部分来自于网络,感谢CSDN、知乎等平台上各位博主的分享,本文用作交流学习予以引用,在此一并表示感谢!