|
本文记录笔者日常工作中接触到的图像相关知识,纯个人技术随笔,不作为讲解用。
图像的组成
图像的通道与深度
深度: 将计算机中存储单个像素所用的bit位,称为图像的深度
例如:
通道:描述一个像素点,如果是灰度图,只须用一个数值来表示,就是单通道。如果一个像素点有RGB三种颜色来描述,就是三通道,如果用RGB+alpha来描述,就是4通道
曝光:接触光的多少
- 图片的内存大小: 长* 宽* 一个像素所占内存的大小
- 一个像素所占内存的大小,称为色深(depth,是指一个像素用多少位表示)。例如Nokia老S40机器颜色数为4096色,即为2^12, 则一个像素所占的内存空间为1.5个字节(一个字节8位,1.5个字节,即为12位)。新S40机器颜色数位65536色,即为2^16, 则一个像素所占内存大小为2个字节。
- opencv中,RGB三个通道分别用8位表示,所以一个像素为24位(8*3=24),故一个像素占3个字节。
彩色图像转化为灰度图像
人眼对绿色的敏感程度性最高,对蓝色最低,所以可用加权平均法得到灰度图像,例如:
图像的色彩量化(减色处理)
将彩色图像的值由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代替.所以结果为:
(其实就是枚举的思想,只不过是用卷积来建立数学模型)
色彩空间:
RGB色彩空间:
常用于图像中,RGB3个通道,可能还要加一个alpha通道(表示透明程度),所以一个像素常用24bit或32bit来表示。
色深: 用于表现颜色的二进制的位数。如我们要表示8种颜色,只需要3个二进制位,故色深为3. QBitmap的色深为1,故只能表示2种颜色,即黑与白。(通常表示维一个像素用多少位表示)
YUV色彩空间:
常用于视频处理中,YCbCr是YUV的一个具体实现。
Y:代表亮度,Luminance或Luna
U,V:代表2个不同的颜色部分,通常为blue和Red,所以也称CbCr(Chrominance或Chroma)
YUV:是对RGB重新编码,将明度与色彩分开,因为人眼对明暗变化更明暗一些。同时也是为了兼容黑白电视。Y通道就是直接输入黑白电视(灰度图),UV通道信号主管色彩。
HSV颜色空间
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
形态学操作(7种)
- 腐蚀:cv2.erode
- 膨胀:cv2.dilate
- 开运算:先腐蚀,再膨胀(去毛刺)
- 闭运算:先膨胀,再腐蚀
- 梯度运算:膨胀-腐蚀(得到轮廓)
- 礼帽(tophat):原图像-开运算(得到毛刺)
- 黑帽(blackhat):闭运算-原图像(小的轮廓)
图像处理(9种)
- 图像转化:转化为灰度图,hsv图
- 二值化:cv2.threshold
- 平滑/滤波与梯度算子:
个均值滤波:方框滤波:高斯滤波:(用于模糊)双边滤波:(用于磨皮美白)
个
- 直方图(2个):计算直方图,直方图均衡化
- 几何操作:缩放,剪切,移位,旋转,镜像
cv2.getAffineTransform, cv2.wrapAffine
- 特效(6个)
图像底板(255减法)
马赛克:用一个值来替换方框中所有的值
毛玻璃:用方框中随机一个值来替换方框中所有的值
图片融合:cv2.addWeighted
浮雕:相邻两个像素相减(突出边缘),再加上一个恒定值,例如150
油画:
- 图片美化:
直方图均衡化
修补(cv2.inpaint,要用到mask)
亮度增强
磨皮美白(双边滤波)
- 画线条,矩形,加文字
傅里叶变换的图像应用:
- 高频:像素值变化剧烈的地方,如边界
低频:像素值变化缓慢的地方,如一片大海
- 低通滤波器:只保留低频,会使得图像模糊
高通滤波器:只保留高频,会使得图像细节增强
- 通过傅里叶变换,可以将某一频率图像部分去除
直方图均衡化:
直方图特征:
直方图表示的是所选图片的灰度值分布的示意图。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 [j]=Array[j]
如果图像以一维表示(如上图),进行转置操作,要先计算出行号和列号才行。
滤波:
图像,也可以理解为各种色彩波的叠加。
常见的几种滤波器:
- 方框滤波(box filter),中值滤波(median filter),均值滤波(mean filter),高斯滤波
- 用标准差为sigma的高斯滤波,进行2次滤波,等于用标准差为sqrt(2)* sigma的高斯滤波进行一次
- 二维高斯滤波可以转化为2个一维高斯滤波
4. 用卷积进行锐化的一个公式(拉普拉斯高斯)
思考:图像可以利用卷积求取边缘,而点云直接就能获取物体的边缘。
5. 利用卷积求导
patial derivative: 偏导
图像的梯度算子: Sobel算子,Scharr算子,Laplacian算子
6. 图像梯度
7. 求导操作对于有噪声图像十分敏感:因此常常先去噪,再求导
8. 图像金字塔(2种):
高斯滤波与其一阶导,二阶导
高斯滤波:低通滤波,图像变平滑,便模糊
高斯一阶导:高通滤波, Canny算子求边缘
高斯二阶导:高通滤波,LOG算子(用于求尺度)
一阶导可以提取图像灰度梯度的变化情况,二阶导可以提取图像的细节(如何理解??),同时响应图像梯度变化情况。
引申:高斯函数在图像中的应用
一维高斯函数:
不同均值,方差,振幅的高斯曲线对比:
二维高斯函数的分布(x与y两个维度的分布,都是一维的高斯分布,因此俯视图来看,是一个椭圆):
图像为:
高斯分布的曲线如上图,越靠近中心,取值越大,越远离中心,取值越小;现实意义是:越接近中心,影响力越大,越远离中心,影响力越小。
这样的特性,可用于权值分配:越接近中心,权值越大,越远离中心,权值越小。
图像的模糊:是一种计算“加权平均值”的过程
在数值上,这是一种“平滑化(smoothing)”,在图像上,就会产生模糊效果,此时各个点的权值是一样的,但显然不合理,因为图像都是连续的,越靠近的点关系越密切,越远离的点越疏远。因此,加权平均更合理,越靠近的点,权重越大,越远离的点,权重越小。此时就可以用正态分布(即高斯分布)来分配权重。
高斯函数由3个参数确定:幅值(有多高),中心坐标,标准差(有多宽)
(在图像邻域内,还会有一个ksize,代表高斯核的大小,例如若ksize=3,则该高斯核为3*3的矩阵)
双边滤波Bilateral Filter: 做边缘保存
用高斯滤波去噪,会将边缘模糊掉,对高频细节的保护并不明显。
双边滤波:结合图像的空间临近度和像素值相似度的折衷方法。比高斯滤波多了一个高斯方差,在边缘附近,离的较远的像素不会过多的影响边缘上的像素值
卷积的作用:
引申:
梯度与方向导数:
- 方向导数是一个数,代表着沿着某一个方向的变化量
- 梯度是一个向量
- 方向导数达到最大时,此时的方向就是梯度方向,此时的方向导数,即为梯度的模
梯度的理解:
- 可理解为斜度。即曲面沿着某一个方向的倾斜程度(其实是方向导数)
- 表示某一函数在该点处的方向导数沿着该方向(梯度方向)取得最大值,即该函数沿着梯度方向,变化最快(变化率最大)
- 在图像领域中,梯度表示像素灰度值变化的速度
OpenCV相关:
OpenCV库结构:
OpenCV文件夹结构(解压之后,会有2个文件夹:source和build):
Souce文件夹下:
module/core:最核心的数据结构与基本运算
module/highgui:图像的读取,显示,存储等UI接口
module/imgproc:图像处理的方法,如几何变换,平滑。。。
feature2d:用于提取特征
nonfree:专利算法,如SIFT
objdetect:目标检测,如人脸识别的Haar,LBP特征;基于HOG的行人,车辆等目标检测
stitching:图像拼接
ml:机器学习库
video:视觉处理,如背景建模,运动物体跟踪,前景检测
build文件夹下:
doc/opencvrefman.pdf: 函数手册
doc/opencv_tutorials.pdf:函数使用手册
include文件夹:OpenCV的头文件
x86与x64文件夹:针对32位和64位的dll和lib库
python:python API
java:java API的JAR包
OpenCV的几何变换
仿射变换:
仿射函数:最高次数为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函数将该变换 作用到图像上
投影变换:
几种变换的区别:
- 刚体变换: 又叫等距变换,等于平移+旋转,3个自由度(旋转1个,平移2个)
刚体运动,保证了同一个向量在各个坐标系下的长度和夹角都不会发生变化。这种变换叫做欧式变换。一个欧式变换,由一个旋转和一个平移两部分组成。
- 相似变换:刚体变换+缩放
有4个自由度,即旋转,x方向平移,y方向平移,缩放因子s
相似变换前后长度比,夹角保持不变(跟相似三角形类似)
3. 仿射变换:
通过一系列原子变换复合实现(5个):平移(tranlation),缩放(scale),旋转(rotate),翻转(flip),错切(shear)。
其中错切又分为水平错切(水平轴上的边不变)与垂直错切(垂直轴上的边不变)
其中变换矩阵的第三行必须是:0,0,1
- 投影变换(Projection Transformation)
又称透视变换(Perspective Transformation),也叫射影变换,含有8个自由度(为什么是8个,而不是9个)
当投影矩阵的最后一行为(0,0,1)时,即为仿射变换。
仿射变换中,左上角的2 * 2 矩阵正交时,即为欧式变换(即为刚体变换),当左上角2 * 2矩阵的行列式为1时,为定向欧式变换。
所以投影矩阵包含仿射矩阵,仿射变换又包含欧式变换(刚体变换)
投影变换(Perspective Transformation)=单应性变换(homograph)+直射变换(collination)
引申:
单应矩阵:同一平面山的点在不同视角下的关系
解析变换矩阵
OpenCV的Mat类:
Matrix,位于core.hpp中
- Mat m=Mat(2,3,CV_32FC(1)); //创建2*3 矩阵,F指float型,1是指单通道
- 也可以使用size类,注意:size的第一个参数为宽(即列数),第二个参数为高(行数),即如果创建2*3数组:
Mat m=Mat(Size(3,2),CV_32FC(1));
此时m.size()输出为3*2,即宽 * 高,宽是3,高是2,即2行3列
- 如果要将二维矩阵的元素变为点的坐标,可以将
4. Mat 的成员变量ptr指向第一行首地址
每一行的元素在存储上都是连续的,但行与行之间可能含有间隔,可以用m.isContinuous()来判断行与行之间是否由间隔。
5. Mat的成员变量step和data
data指向第一个数值的指针,类型为uchar
step[0]代表每一行所占的字节数(包括行与行之间的间隔)
step[1]代表每一个数值所占的字节数
例如:若要访问一个int型单通道矩阵第r行第c列,可用
(int * )是因为m.data为uchar,所以要作类型转换
OpenCV相机标定(Camera Calibration)
相机标定,简单来说就是世界坐标系转换到图像坐标系的过程(世界坐标系--》相机坐标系--》图像坐标系),也就是求最终的投影矩阵P的过程。
- 相机外参R,t: 从世界坐标系转换到相机坐标系。这一步是从三维点到三维点的转换
- 相机内参:从相机坐标系到图像坐标系,这一步是三维点到二维点的转换
(这一部分其实是跟图形学中正交变换和投影变换非常相关,放到图形学知识中再写)
常见的C++线性代数库:
DCMTK:处理dicom图像的库
Eigen:开源的C++线性代数库,opencv中常用。示例代码如下:
#include <Eigen/SVD>
Eigen::Matrix3d w=Eigen::Matrix3d::Zero();
...
Eigen::JacobiSVD<Eigen::Matrix3d> svd(w,Eigen::ComputeFullU|Eigen::ComputeFullV);
Eigen::Matrix3d U=svd.matrixU();
Eigen::Matrix3d V=svd.matrixV();
上面几行代码就将w矩阵进行svd分解,求解了U与V。
还有一种常见的C++线性代数库:Armadillo(犰狳)
BLAS,CUBLAS与LAPACK
BLAS:Basic Linear Algebra Subprograms, 基础线性代数子程序集
CUBALS:BLAS在GPU计算技术下的版本
LAPACK: Linear Algebra Package, 线性代数包( BLAS 是LAPACK的一部分 ), 美国国家基金资助的著名公开软件,包含了求解科学与工程计算中最常见的数值线性代数问题:如求解线性方程组,线性最小二乘问题, 特征值问题,奇异值问题等.
大津法(otsu算法)
最大类间方差法。找到一个阈值,使得背景与前景之间的方差差距最大(二分类问题)
假设存在一个阈值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特征: Local Binary Pattern局部二进制模式
原始的LBP算子被定义为3 * 3 窗口,以中心像素为阈值,相邻的8个像素与阈值进行比较,大于则记为1,小于则标记为0,3* 3区域内的8个临近点,可用8为二进制数表示,最终可表示0~255的十进制数,即LBP码,最终用这个值来表示该区域的纹理信息。
常常采用LBP特征谱的统计直方图来作为特征向量,用于分类识别,如人脸分析,纹理分类。
Harris角点检测
(缺一个实际计算的例子)
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+SVM
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
行人重识别(ReID:Person Re-Identification)
利用CV技术判断图像或视频序列中是否存在特定行人得技术。
数据集分为:训练集,验证集,Query,Gallery。训练集与验证集上训练模型,然后利用模型对Query和Gallery中的图片提取特征计算相似度,对于每个Query在Gallery中找出前N个与之相似的图片。
2个大方向:特征提取,度量学习
存在的挑战:摄像机低分辨率,遮挡,视角/姿势变化,光照
人脸检测: Haar + Adaboost
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的方法进行人脸识别
Canny边缘检测
- 用高斯一阶偏导核对图像进行滤波,求出梯度图的幅值与方向
- 非极大值抑制:将“宽”的边缘变为“窄”的边缘
- 用高阈值先找到边缘,用低阈值再找出与边缘相连的边缘(去除伪边缘)
RANSAC:Random Sample Consensus
随机采样一致性: 在一堆样本点中,随机取2个点做一条直线,同时设定一个阈值T,统计样本点到该直线的距离小于T的点的个数(内点), 反复迭代取样本点,做直线,找出内点最多的那条直线。
除此之外,还可以用RanSAC找匹配点。
霍夫变换:
- 直角坐标系中的一条直线y=ax+b,也可以写成b=-ax+y,此时当(x,y)固定时,b=-ax+y也是一条直线,只不过是在参数空间(霍夫空间)中
即直角坐标系中的一条直线y=ax+b,对应霍夫空间中的一个点(a,b),同理霍夫空间上的一条直线b=-ax+y,对应于直角坐标系中的一个点(x,y)
- 直角坐标系两点确定一条直线,对应于霍夫空间中两条直线的交点;直角坐标系三点共线,对应于霍夫空间中三条直线的交点
- 由于y=ax+b无法表示斜率为无穷的情况(即垂直于x轴的直线),故考虑将笛卡尔坐标系换为极坐标系。
此时,直角坐标系中的一个点(x0,y0)对应于霍夫空间中p-theta的一条曲线;直角坐标系中三点共线,即对应于霍夫空间p-theta中三条曲线的交点
4. 检测一个圆
霍夫变换的思想为:找到一个共性。检测直线,则斜率与截距为不变的(或p与theta)。检测圆,则圆心与半径是不变的。也是在参数空间(圆心---半径)中找到多条曲线相交的点,此时即找到了圆。
Log变换(注意不是LOG算子)与Box-Cox变换
Log变换:用于稳定方差,可将倾斜分布,转换为正态分布,可使图像更亮(应为log函数对低值扩展更强)
Box-Cox变换:用于连续的变量不满足正态分布的情况。
LOG算子和DOG算子:
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可体现。
NLM去噪算法
Non Local Means, 非局部平均。
原理:假设同一幅图像上,有很多相似的纹理,因此再有噪声的区域,可以通过某种方式情况下,将相似的纹理区域来替换噪声区域,从而达到较好的去噪效果,并且不太多的损失细节。
图像增强算法
- 直方图均衡化,拉普拉斯LOG,gamma 变换
- 图形增强,常见于对图像的亮度,对比度,饱和度,色调等进行调节,增加其清晰度,减少噪点。图像增强往往是多个算法的组合,一般流程为:图像去噪,增加清晰度(对比度),灰度化或者获取图像边缘特征(对图像进行卷积),二值化等等。图像增强方法不同,应用领域不同,事件中需要灵活掌握多张方法。
- 图像去噪:等同于低通滤波器(噪声是高频)
增加清晰度:为高通滤波器
- 图像领域中,微分是锐化,积分是模糊
图像锐化:使灰度反差增强,使模糊图像变得清晰
图像模糊:图像收到平均运算或积分运算。
微分运算, 能够突出图像细节,使图像变得更加清晰,laplus是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。
图像增强:对数log变换
由于对数函数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率小,所以经过对数变换,图像较暗区域的对比度将有所提升,增强了图像的暗部细节。
图像增强:Gamma变换
主要用于图像的校正,增强图像对比度,适用于灰度过高或灰度过低的图片修正。对于对比度偏低,并且整体亮度偏高(相机过曝)情况下的图像,增强效果明显。
r值以1为分界,值越小,对低灰度部分的扩展作用就越强(此时类似于log变换);值越大,对图像高灰度部分的扩展作用就越强(此时类似于指数变换)。通过不同的r值,就可以增强低灰度(或者高灰度)部分细节的作用。
一种增强图像对比度的方法:
大的越大,小的越小(可以写一篇论文), 例如[10, 30]变为[-10, 50],可以用以下方法
- 求均值:(10+30)/2=20
- 求均值范围[10-20, 30-20] 即为[-10,10]
乘系数,假设为2,即[-10, 10]* 2=[20, 20]
- 应用到原范围:[10,30]+[-20, 20]=[-10,50]
图像的边缘检测:
LoG算子:Laplacian of Gaussian算子
先对图形做高斯滤波,然后再求Laplacian二阶导,最后检测滤波结果的零交叉(Zero crossing)可以获得图像或物体的边缘。
边缘检测最常见的几种方法:Sobel算子,Laplacian算子,Canny算子等
2. Prewitt算子
3. Sobel算子:在Prewitt算子上加了权重,距离近的像素权重高
4. Laplacian算子:二位微分算子,也是二阶微分算子
本质:做卷积,求差分
图像配准算法(3类)
基于灰度和模板匹配算法:
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算法等
基于域变换的方法:
傅立叶---梅林变换
小波变换。
图像修复:
- 面积比较小的,称为Inpainting
- 面积大的叫做Image Completion
图像超分:超级分辨率,Super Resolution
基于插值的重建:传统方法
基于概率的重建:反投影,最大后验概率
基于机器学习与深度学习的重建
图像拼接(制作全景图片)常用算法:
就是找关键点的算法: SIFT, SURF, ORB
SIFT:Scale-Invariant Feature Transform
尺度不变特征转换, 这是一种找关键点的方法。步骤如下:
- 构建多尺寸空间(DOG,高斯差分),检测极值点
- 利用插值等方法,通过上一步得到的多个极值点,求出关键点
- 生成特征描述点:利用直方图统计关键点邻域范围内的像素的梯度方向,求出关键点的主方向,构造描述子
提取尺寸不变区域--》归一化尺寸--》旋转归一化--》特征描述子(最终是:位置+128维向量)
SURF:Speed Up Robust Features
加速稳健特征(也是找关键点)。大致算法与SIFT相同,但比SIFT高效,利用Hessian矩阵的行列式作特征点检测,并用积分图加速运算。
是SIFT的变种,效果没有SIFT好,但速度更快。
ORB: Oriented FAST and Rotated BRIEF
基于FAST 和BRIEF特征描述子提出来,运行时间最快,比较常用与实际生产中
目标运动侦测算法:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|