作者丨TroubleShooter@知乎(已授权)
来源丨https://zhuanlan.zhihu.com/p/587402704
编辑丨极市平台
注:本文记录笔者日常工作中接触到的图像相关知识,纯个人技术随笔,不作为讲解用。
深度:将计算机中存储单个像素所用的bit位,称为图像的深度
例如:
通道:描述一个像素点,如果是灰度图,只须用一个数值来表示,就是单通道。如果一个像素点有RGB三种颜色来描述,就是三通道,如果用RGB+alpha来描述,就是4通道
曝光:接触光的多少
人眼对绿色的敏感程度性最高,对蓝色最低,所以可用加权平均法得到灰度图像,例如:
将彩色图像的值由256^3压缩至4^3, 即将RGB的值只取32,96,160,224
卷积公式:Convolution formular
卷积:在一个方框内,对每个像素值做“加权平均”
池化:最常见的有最大值,最小值,平均值池化(即在一个方框内,取最大值,最小值,平均值)
对于数列{a_n},{b_n},二者的卷积为(类似点积):
例如:
2个骰子,第一个骰子有8面:2面刻着1,1面刻着2,3面刻着3,2面刻着4.第二个骰子有6面,其中3面刻1,2面刻2,1面刻3.将2个骰子一起投一次,求点数之和为4的概率.
整理得到:
本题用卷积,可以很快写出来.
设第一个骰子投出n的概率为a_n,第2个骰子投出m的概率为b_m, 那么投出点数之和为4的概率为:
由于第2个骰子投出0的概率为0,所以b0用0代替.所以结果为:
(其实就是枚举的思想,只不过是用卷积来建立数学模型)
常用于图像中,RGB3个通道,可能还要加一个alpha通道(表示透明程度),所以一个像素常用24bit或32bit来表示。
色深:用于表现颜色的二进制的位数。如我们要表示8种颜色,只需要3个二进制位,故色深为3. QBitmap的色深为1,故只能表示2种颜色,即黑与白。(通常表示维一个像素用多少位表示)
常用于视频处理中,YCbCr是YUV的一个具体实现。
Y:代表亮度,Luminance或Luna
U,V:代表2个不同的颜色部分,通常为blue和Red,所以也称CbCr(Chrominance或Chroma)
YUV:是对RGB重新编码,将明度与色彩分开,因为人眼对明暗变化更明暗一些。同时也是为了兼容黑白电视。Y通道就是直接输入黑白电视(灰度图),UV通道信号主管色彩。
H: Hue, 色相,色调, 颜色,取值范围为[0,179]
S: Saturation, 饱和度,色彩纯净度(深蓝,浅蓝),取值范围为[0,255]
V: Value, 明度,亮度(光照等明暗的程度)
H为色调(即哪一种颜色),H固定,S减小,相当于往颜色中添加白色;S增大,说明颜色越鲜艳。V减小,相当于往颜色中添加黑色,V为0,整个颜色呈现黑色
WebRTC:Web Real Time Communication,Web即时通信
FFmpeg:Fast Forward Motion Picture Experts Group,快进动态图像专家组,是视频处理最常用的开源软件
AV:Audio& Video,音频常见的编码格式有mp3,aac, 视频常见的编码格式有h262,h264,h265
4. 直方图(2个):计算直方图,直方图均衡化
5. 几何操作:缩放,剪切,移位,旋转,镜像
cv2.getAffineTransform, cv2.wrapAffine
6. 特效(6个)
图像底板(255减法)
马赛克:用一个值来替换方框中所有的值
毛玻璃:用方框中随机一个值来替换方框中所有的值
图片融合:cv2.addWeighted
浮雕:相邻两个像素相减(突出边缘),再加上一个恒定值,例如150
油画:
7. 图片美化:
直方图均衡化
修补(cv2.inpaint,要用到mask)
亮度增强
磨皮美白(双边滤波)
8. 画线条,矩形,加文字
直方图表示的是所选图片的灰度值分布的示意图。X轴代表灰度值,y轴对应相应灰度值的像素点个数。
在RGB图像中,直方图是通过计算每个通道的灰度值得到的。
一般正常的直方图,是中间高,两边低。图像中最左边有高度,说明图片上有阴影;最右侧有高度,说明图片有高光。
属于图像增强的一种技术(可以使图像更亮一些,可以增强图像对比度),适合处理过亮或过暗的图像。将过于集中的灰度像素分散开。
利用累计概率实现,灰度值大的像素对应大的累计概率
新灰度值=累积概率(每个像素会有所不同)* 灰度最大值(这个是不变的)
以8*8图像,一维线性表示为例
经过观察发现:
第一行:0+7+1= 8 = 8 * 1 =8 * (0+1)
第一行:8+15+1= 24= 8 * 3 =8 * (1+2)
第一行:16+23+1= 40 = 8 * 5 =8 * (2+3)
。。。
分析可得:每一行首尾两个元素相加的结果为:width* (RowIdx+RowIdx+1)-1
所以,对于一张图像的一维表示,对其进行水平翻转的程序为:
先转置,再水平翻转
图像如果以二维表示,则转置的操作十分简单:
Array[i] [j]=Array[j] [i]
如果图像以一维表示(如上图),进行转置操作,要先计算出行号和列号才行。
图像,也可以理解为各种色彩波的叠加。
4. 用卷积进行锐化的一个公式(拉普拉斯高斯)
思考:图像可以利用卷积求取边缘,而点云直接就能获取物体的边缘。
5. 利用卷积求导
patial derivative:偏导
图像的梯度算子:Sobel算子,Scharr算子,Laplacian算子
6. 图像梯度
7. 求导操作对于有噪声图像十分敏感:因此常常先去噪,再求导
8. 图像金字塔(2种):
高斯滤波:低通滤波,图像变平滑,便模糊
高斯一阶导:高通滤波, Canny算子求边缘
高斯二阶导:高通滤波,LOG算子(用于求尺度)
一阶导可以提取图像灰度梯度的变化情况,二阶导可以提取图像的细节(如何理解??),同时响应图像梯度变化情况。
引申:高斯函数在图像中的应用
一维高斯函数:
不同均值,方差,振幅的高斯曲线对比:
二维高斯函数的分布(x与y两个维度的分布,都是一维的高斯分布,因此俯视图来看,是一个椭圆):
图像为:
高斯分布的曲线如上图,越靠近中心,取值越大,越远离中心,取值越小;现实意义是:越接近中心,影响力越大,越远离中心,影响力越小。
这样的特性,可用于权值分配:越接近中心,权值越大,越远离中心,权值越小。
图像的模糊:是一种计算“加权平均值”的过程
在数值上,这是一种“平滑化(smoothing)”,在图像上,就会产生模糊效果,此时各个点的权值是一样的,但显然不合理,因为图像都是连续的,越靠近的点关系越密切,越远离的点越疏远。因此,加权平均更合理,越靠近的点,权重越大,越远离的点,权重越小。此时就可以用正态分布(即高斯分布)来分配权重。
高斯函数由3个参数确定:幅值(有多高),中心坐标,标准差(有多宽)
(在图像邻域内,还会有一个ksize,代表高斯核的大小,例如若ksize=3,则该高斯核为3*3的矩阵)
用高斯滤波去噪,会将边缘模糊掉,对高频细节的保护并不明显。
双边滤波:结合图像的空间临近度和像素值相似度的折衷方法。比高斯滤波多了一个高斯方差,在边缘附近,离的较远的像素不会过多的影响边缘上的像素值
梯度与方向导数:
梯度的理解:
OpenCV文件夹结构(解压之后,会有2个文件夹:source和build):
module/core:最核心的数据结构与基本运算
module/highgui:图像的读取,显示,存储等UI接口
module/imgproc:图像处理的方法,如几何变换,平滑。。。
feature2d:用于提取特征
nonfree:专利算法,如SIFT
objdetect:目标检测,如人脸识别的Haar,LBP特征;基于HOG的行人,车辆等目标检测
stitching:图像拼接
ml:机器学习库
video:视觉处理,如背景建模,运动物体跟踪,前景检测
doc/opencvrefman.pdf: 函数手册
doc/opencv_tutorials.pdf:函数使用手册
include文件夹:OpenCV的头文件
x86与x64文件夹:针对32位和64位的dll和lib库
python:python API
java:java API的JAR包
仿射函数:最高次数为1的额多项式函数。常数项为0的仿射函数称为线性函数。
从R^n到R^m的映射x-> Ax+b称为仿射变换,其中A为一个m* n矩阵,b为一个m维向量。
线性变换(旋转,缩放)+平移
齐次坐标形式为
顺时针旋转alpha角的仿射矩阵:
逆时针旋转alpha角的仿射矩阵:
缩放矩阵:
以上都是以原点(0,0)为中心的。
若以任一点(x0,y0)为中心,逆时针旋转alpha,则将(x0,y0)移动到原点,旋转alpha后再移动回来。仿射矩阵为:
同样,以(x0,y0)为中心,缩小2倍的仿射矩阵为:
如果Sx与Sy相等,可直接调用OpenCV函数getRotationMatrix2D,例如如获得以(40,50)为中心,逆时针旋转30度缩小2倍的仿射变换矩阵:
注意:返回的矩阵A是2*3,因为仿射矩阵最后一行都是0,0,1
计算仿射矩阵时,也可以通过src和dst两个矩阵,如:
得到仿射矩阵后,使用wrapAffine函数将该变换 作用到图像上
有4个自由度,即旋转,x方向平移,y方向平移,缩放因子s
相似变换前后长度比,夹角保持不变(跟相似三角形类似)
3. 仿射变换:
通过一系列原子变换复合实现(5个):平移(tranlation),缩放(scale),旋转(rotate),翻转(flip),错切(shear)。
其中错切又分为水平错切(水平轴上的边不变)与垂直错切(垂直轴上的边不变)
其中变换矩阵的第三行必须是:0,0,1
当投影矩阵的最后一行为(0,0,1)时,即为仿射变换。
仿射变换中,左上角的2 * 2 矩阵正交时,即为欧式变换(即为刚体变换),当左上角2 * 2矩阵的行列式为1时,为定向欧式变换。
所以投影矩阵包含仿射矩阵,仿射变换又包含欧式变换(刚体变换)
投影变换(Perspective Transformation)=单应性变换(homograph)+直射变换(collination)
引申:
单应矩阵:同一平面山的点在不同视角下的关系
Matrix,位于core.hpp中
4. Mat 的成员变量ptr指向第一行首地址
每一行的元素在存储上都是连续的,但行与行之间可能含有间隔,可以用m.isContinuous()来判断行与行之间是否由间隔。
5. Mat的成员变量step和data
data指向第一个数值的指针,类型为uchar
step[0]代表每一行所占的字节数(包括行与行之间的间隔)
step[1]代表每一个数值所占的字节数
例如:若要访问一个int型单通道矩阵第r行第c列,可用
(int * )是因为m.data为uchar,所以要作类型转换
相机标定,简单来说就是世界坐标系转换到图像坐标系的过程(世界坐标系--》相机坐标系--》图像坐标系),也就是求最终的投影矩阵P的过程。
(这一部分其实是跟图形学中正交变换和投影变换非常相关,放到图形学知识中再写)
DCMTK:处理dicom图像的库
Eigen:开源的C++线性代数库,opencv中常用。示例代码如下:
#include
Eigen::Matrix3d w=Eigen::Matrix3d::Zero();
...
Eigen::JacobiSVD svd(w,Eigen::ComputeFullU|Eigen::ComputeFullV);
Eigen::Matrix3d U=svd.matrixU();
Eigen::Matrix3d V=svd.matrixV();
上面几行代码就将w矩阵进行svd分解,求解了U与V。
还有一种常见的C++线性代数库:Armadillo(犰狳)
BLAS:Basic Linear Algebra Subprograms, 基础线性代数子程序集
CUBALS:BLAS在GPU计算技术下的版本
LAPACK: Linear Algebra Package, 线性代数包( BLAS 是LAPACK的一部分 ), 美国国家基金资助的著名公开软件,包含了求解科学与工程计算中最常见的数值线性代数问题:如求解线性方程组,线性最小二乘问题, 特征值问题,奇异值问题等.
最大类间方差法。找到一个阈值,使得背景与前景之间的方差差距最大(二分类问题)
假设存在一个阈值threshold,将图像像素分为两类C1(小于threshold)和C2(大于threshold),这两类像素各自的均值为m1,m2,图像的全局均值为mg,同时像素被分为C1和C2的概率分别为p1,p2,则有:
同时,根据方差的概率,类间方差可计算得:
进一步化简,可得:
大津法就是找到一个阈值,使得sigma^2达到最大(在0-255遍历每一个灰度值,计算p1,p2,m1,m2)
引申:能否用于决策树???与2020年10月5日的LDA类似,见2020年8月24日
角点:Harris算子,SuSAN算子,FAST算子
梯度特征点:SIFT,SURF,GLOH,ASIFT,PSIFT算子
边缘特征(线型):Canny算子,Marr算子
纹理特征:灰度共生矩阵,小波Gabor算子
原始的LBP算子被定义为3 * 3 窗口,以中心像素为阈值,相邻的8个像素与阈值进行比较,大于则记为1,小于则标记为0,3* 3区域内的8个临近点,可用8为二进制数表示,最终可表示0~255的十进制数,即LBP码,最终用这个值来表示该区域的纹理信息。
常常采用LBP特征谱的统计直方图来作为特征向量,用于分类识别,如人脸分析,纹理分类。
(缺一个实际计算的例子)
1 当窗口位于平坦区是,任意方向移动,都没有灰度变化;当窗口位于边缘时,沿边缘方向移动,灰度无变化;当窗口位于角点时,沿任意方向移动,灰度都有明显变化。
2 ,
其中w(x, y)为权值矩阵(一般用高斯函数),u,v表示沿x方向和y方向移动的距离,I(x, y)表示图像灰度
3, 根据泰勒展开
所以E(u,v)可以写成
其中,M矩阵为
E(u, v)可表示成一个二次函数,
该二次函数本质上是一个椭圆(椭圆的标准方程:x^2 / a^2 + y^2 / b^2 = 1),椭圆的长短轴由M矩阵的特征值lamda1,lamda2决定,M矩阵可以变化为
当λ2 >> λ1或λ1 >>λ2时,为边
当λ1和λ2都较大,且λ1和λ2相差不多时,为角点
当λ1和λ2都较小时,为平坦区
计算角点时,无需计算λ1和λ2,可以由以下公式近似计算:
alpha为一常数,通常取0.04~0.06
计算梯度时
最终计算求得每个像素的R值。
HOG:Histogram of Oriented Gradient, 方向梯度直方图
统计一定区域内的像素的梯度和其方向,生成描述子。
例如一个cell中8*8 像素,统计9个方向的梯度信息(9个bin),则计算出8 * 8像素的梯度和其方向,同时按照每360/9=40度统计梯度方向,制作成直方图。最后每个cell对应一个9维的特征向量。
同时也可以将多个cell组成一个block,例如2 * 2 cell组成一个block,则一个block对应一个2* 2 *9 =36维特征。
实际应用中,通常取固定大小的滑动窗口来提取HOG特征,例如:窗口大小设置为64 * 128,每8 * 8 个像素组成一个cell,每2 * 2 个cell组成一个block,一共有(8-1)* (16-1)=105个block,则每个窗口的特征维度为105 * 36 =3780
利用CV技术判断图像或视频序列中是否存在特定行人得技术。
数据集分为:训练集,验证集,Query,Gallery。训练集与验证集上训练模型,然后利用模型对Query和Gallery中的图片提取特征计算相似度,对于每个Query在Gallery中找出前N个与之相似的图片。
2个大方向:特征提取,度量学习
存在的挑战:摄像机低分辨率,遮挡,视角/姿势变化,光照
Haar模板:OpenCV中有14个模板,最早只有4个模板
计算方法:sum(白)-sum(黑),选择不同类型的模板(模板大小,模板位置)可以得到不同的特征值。
积分图:Integral Image, 又叫Summed Area Table。Harr特征的计算需要重复计算目标区域的像素值,使用积分图可以大大减少计算量。
记点(x,y)处的像素值为I(x,y)则
Adaboost:通过级联方法(Cascade)将多个弱分类器(CART决策树)变成一个强分类器:要计算每个所分类器的误差率,要用到指数损失函数
OpenCV还支持LBP + Adaboost 和HOG+Adaboost的方法进行人脸识别
随机采样一致性:在一堆样本点中,随机取2个点做一条直线,同时设定一个阈值T,统计样本点到该直线的距离小于T的点的个数(内点), 反复迭代取样本点,做直线,找出内点最多的那条直线。
除此之外,还可以用RanSAC找匹配点。
此时,直角坐标系中的一个点(x0,y0)对应于霍夫空间中p-theta的一条曲线;直角坐标系中三点共线,即对应于霍夫空间p-theta中三条曲线的交点
4. 检测一个圆
霍夫变换的思想为:找到一个共性。检测直线,则斜率与截距为不变的(或p与theta)。检测圆,则圆心与半径是不变的。也是在参数空间(圆心---半径)中找到多条曲线相交的点,此时即找到了圆。
Log变换:用于稳定方差,可将倾斜分布,转换为正态分布,可使图像更亮(应为log函数对低值扩展更强)
Box-Cox变换:用于连续的变量不满足正态分布的情况。
LOG算子:Laplace Of Gaussian, 通过对图像的二阶导的零值来进行边缘检测。由于微分运算对噪声比较敏感,所以LoG是先对图像进行高斯平滑,再使用Laplace算子进行边缘检测(LoG算子可以求尺度)
DoG算子:Difference of Gaussian,高斯函数的差分,将图像在不同sigma参数下的高斯滤波结果相比,得到差分图。
因为DOG算子在计算上比较简单,所以常用DOG算子来替代LOG算子。
二者相差k-1倍,但不影响极值点的检测
一阶导的正负,代表函数值f(x)的增大或减小
二阶导的正负,代表的是斜率(斜率即一阶导)的增大或减小
凹凸的定义:
从二阶导的正负也能判断出凹凸性
二阶导为正,说明斜率越来越大,即凹函数(注意看上面的图像)
二阶导为负,说明斜率越来越小,即凸函数
二阶导为0,说明斜率的变化率为0,即保持同一斜率(变化率)
以上三种是最最常见的插值方法,除此之外,还有以下几种插值:
其中最常见的两种多项式插值法为:
样条插值:每两个点确定一个函数,每个函数就是一个样条,函数不同,样条就不同,所以定义中说“可变样条”,然后把所有样条分段结合成一个函数,就是最终的 插值函数。
图片的放大与缩小———插值原理(最近邻插值与双线性插值)
例如一个3*3 的256灰度图,像素矩阵(记为src图)为:
将其放大为4*4的图像(记为dst图):
最近邻插值的公式为:
4*4 图像中(0, 0)处的值为:(0 * 3/4, 0* 3/4)=(0,0)
即4*4 图像中(0, 0)处的值,即为src途中(0,0)处的图
4*4 图像中(1, 0)处的值为:(1 * 3/4, 0* 3/4)=(0.75,0),为原来src图中(0.75,0)处的值,此时会采用四舍五入的方法,即src图中的(1,0)处
依此方法,4* 4 矩阵计算求得:
这种算法是最简单的图像缩放算法,效果也是最不好的:放大由马赛克,缩小由失真(因为采用了四舍五入的方法)。这种方法不科学,因为当坐标为0.75时,不应该就简单的取为1,而是利用源图这个虚拟点四周的4个真实点按照一定的规律计算出来。此时就引入了双线性插值。
双线性插值:在x和y方向,分别做线性插值
已知Q11,Q12,Q21,Q22这4个点的坐标和这4个点的值,现给出P点坐标,求P点的值。此时就要用到双线性插值(先求R1,R2的值,然后再求P点的值)
双线性插值的公式为:
例如dst图中(1,1)处,由最近邻插值得到的dst图坐标为(0.75, 0.75), 该点是一个虚拟点,应该由其四周的4个点(0,0), (0,1), (1,0), (1,1)决定。
由于(0.75, 0.75)离(1, 1)要更近一些,那么(1,1)处所起的作用就更大一些。由公式的系数uv=0.75* 0.75可体现。而(0.75, 0.75)离(0, 0)要远一些,那么(0,0)处所起的作用就更小一些。由公式的系数(1-u)(1-v)=0.25* 0.25可体现。
Non Local Means, 非局部平均。
原理:假设同一幅图像上,有很多相似的纹理,因此再有噪声的区域,可以通过某种方式情况下,将相似的纹理区域来替换噪声区域,从而达到较好的去噪效果,并且不太多的损失细节。
图像锐化:使灰度反差增强,使模糊图像变得清晰
图像模糊:图像收到平均运算或积分运算。
微分运算, 能够突出图像细节,使图像变得更加清晰,laplus是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。
由于对数函数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率小,所以经过对数变换,图像较暗区域的对比度将有所提升,增强了图像的暗部细节。
主要用于图像的校正,增强图像对比度,适用于灰度过高或灰度过低的图片修正。对于对比度偏低,并且整体亮度偏高(相机过曝)情况下的图像,增强效果明显。
r值以1为分界,值越小,对低灰度部分的扩展作用就越强(此时类似于log变换);值越大,对图像高灰度部分的扩展作用就越强(此时类似于指数变换)。通过不同的r值,就可以增强低灰度(或者高灰度)部分细节的作用。
大的越大,小的越小(可以写一篇论文), 例如[10, 30]变为[-10, 50],可以用以下方法
图像压缩:svd,傅里叶变换,基变换(使用小波基与傅里叶基,JEEG使用的是傅里叶基)
LoG算子:Laplacian of Gaussian算子
先对图形做高斯滤波,然后再求Laplacian二阶导,最后检测滤波结果的零交叉(Zero crossing)可以获得图像或物体的边缘。
边缘检测最常见的几种方法:Sobel算子,Laplacian算子,Canny算子等
2. Prewitt算子
3. Sobel算子:在Prewitt算子上加了权重,距离近的像素权重高
4. Laplacian算子:二位微分算子,也是二阶微分算子
本质:做卷积,求差分
MAD: Mean Absolute Differences 平均绝对差算法
SAD: Sum of Absolute Differences 绝对误差和
SSD: Sum of Squred Differences , 误差平方和,也叫差方和
MSD:Mean Squred Differences, 均方差算法
NCC:Normalized CrossCorrelation,归一化互相关算法(或归一化交叉相关算法),该算法利用了相似系数的计算,来计算两张图像的相似性。
SSDA:Sequential Similarity Detection Algorithm,序列相似性检测算法:设定一个与之,累计绝对误差和,该值超过阈值,则进行下一次匹配。
SATD: Sum of Absolute Transformed Difference, 该算法也经常用于视频编码中
Canny算法等
傅立叶---梅林变换
小波变换。
基于插值的重建:传统方法
基于概率的重建:反投影,最大后验概率
基于机器学习与深度学习的重建
就是找关键点的算法:SIFT, SURF, ORB,SuperPoint
尺度不变特征转换, 这是一种找关键点的方法。步骤如下:
提取尺寸不变区域--》归一化尺寸--》旋转归一化--》特征描述子(最终是:位置 128维向量)
加速稳健特征(也是找关键点)。大致算法与SIFT相同,但比SIFT高效,利用Hessian矩阵的行列式作特征点检测,并用积分图加速运算。
是SIFT的变种,效果没有SIFT好,但速度更快。
基于FAST 和BRIEF特征描述子提出来,运行时间最快,比较常用与实际生产中
页面更新:2024-05-10
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号