技术知识查漏补缺!这可能是最全的图像相关知识总结

作者丨TroubleShooter@知乎(已授权)

来源丨https://zhuanlan.zhihu.com/p/587402704

编辑丨极市平台

注:本文记录笔者日常工作中接触到的图像相关知识,纯个人技术随笔,不作为讲解用。

图像的组成

图像的通道与深度

深度:将计算机中存储单个像素所用的bit位,称为图像的深度

例如:

通道:描述一个像素点,如果是灰度图,只须用一个数值来表示,就是单通道。如果一个像素点有RGB三种颜色来描述,就是三通道,如果用RGB+alpha来描述,就是4通道

曝光:接触光的多少

  1. 图片的内存大小:长* 宽* 一个像素所占内存的大小
  2. 一个像素所占内存的大小,称为色深(depth,是指一个像素用多少位表示)。例如Nokia老S40机器颜色数为4096色,即为2^12, 则一个像素所占的内存空间为1.5个字节(一个字节8位,1.5个字节,即为12位)。新S40机器颜色数位65536色,即为2^16, 则一个像素所占内存大小为2个字节。
  3. 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种)

  1. 腐蚀:cv2.erode
  2. 膨胀:cv2.dilate
  3. 开运算:先腐蚀,再膨胀(去毛刺)
  4. 闭运算:先膨胀,再腐蚀
  5. 梯度运算:膨胀-腐蚀(得到轮廓)
  6. 礼帽(tophat):原图像-开运算(得到毛刺)
  7. 黑帽(blackhat):闭运算-原图像(小的轮廓)

图像处理(9种)

  1. 图像转化:转化为灰度图,hsv图
  2. 二值化:cv2.threshold
  3. 平滑/滤波与梯度算子:

4. 直方图(2个):计算直方图,直方图均衡化

5. 几何操作:缩放,剪切,移位,旋转,镜像
cv2.getAffineTransform, cv2.wrapAffine

6. 特效(6个)
图像底板(255减法)
马赛克:用一个值来替换方框中所有的值
毛玻璃:用方框中随机一个值来替换方框中所有的值
图片融合:cv2.addWeighted
浮雕:相邻两个像素相减(突出边缘),再加上一个恒定值,例如150
油画:

7. 图片美化:
直方图均衡化
修补(cv2.inpaint,要用到mask)
亮度增强
磨皮美白(双边滤波)

8. 画线条,矩形,加文字

傅里叶变换的图像应用:

  1. 高频:像素值变化剧烈的地方,如边界
    低频:像素值变化缓慢的地方,如一片大海
  2. 低通滤波器:只保留低频,会使得图像模糊
    高通滤波器:只保留高频,会使得图像细节增强
  3. 通过傅里叶变换,可以将某一频率图像部分去除

直方图均衡化:

直方图特征:

直方图表示的是所选图片的灰度值分布的示意图。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]

如果图像以一维表示(如上图),进行转置操作,要先计算出行号和列号才行。

滤波:

图像,也可以理解为各种色彩波的叠加。

常见的几种滤波器:

  1. 方框滤波(box filter),中值滤波(median filter),均值滤波(mean filter),高斯滤波
  2. 用标准差为sigma的高斯滤波,进行2次滤波,等于用标准差为sqrt(2)* sigma的高斯滤波进行一次
  3. 二维高斯滤波可以转化为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: 做边缘保存

用高斯滤波去噪,会将边缘模糊掉,对高频细节的保护并不明显。

双边滤波:结合图像的空间临近度和像素值相似度的折衷方法。比高斯滤波多了一个高斯方差,在边缘附近,离的较远的像素不会过多的影响边缘上的像素值

卷积的作用:

引申:

梯度与方向导数:

  1. 方向导数是一个数,代表着沿着某一个方向的变化量
  2. 梯度是一个向量
  3. 方向导数达到最大时,此时的方向就是梯度方向,此时的方向导数,即为梯度的模

梯度的理解:

  1. 可理解为斜度。即曲面沿着某一个方向的倾斜程度(其实是方向导数)
  2. 表示某一函数在该点处的方向导数沿着该方向(梯度方向)取得最大值,即该函数沿着梯度方向,变化最快(变化率最大)
  3. 在图像领域中,梯度表示像素灰度值变化的速度

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函数将该变换 作用到图像上

投影变换:

几种变换的区别:

  1. 刚体变换:又叫等距变换,等于平移+旋转,3个自由度(旋转1个,平移2个)
    刚体运动,保证了同一个向量在各个坐标系下的长度和夹角都不会发生变化。这种变换叫做欧式变换。一个欧式变换,由一个旋转和一个平移两部分组成。
  2. 相似变换:刚体变换+缩放

有4个自由度,即旋转,x方向平移,y方向平移,缩放因子s
相似变换前后长度比,夹角保持不变(跟相似三角形类似)

3. 仿射变换:
通过一系列原子变换复合实现(5个):平移(tranlation),缩放(scale),旋转(rotate),翻转(flip),错切(shear)。
其中错切又分为水平错切(水平轴上的边不变)与垂直错切(垂直轴上的边不变)

其中变换矩阵的第三行必须是:0,0,1

  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中

  1. Mat m=Mat(2,3,CV_32FC(1)); //创建2*3 矩阵,F指float型,1是指单通道
  2. 也可以使用size类,注意:size的第一个参数为宽(即列数),第二个参数为高(行数),即如果创建2*3数组:
    Mat m=Mat(Size(3,2),CV_32FC(1));
    此时m.size()输出为3*2,即宽 * 高,宽是3,高是2,即2行3列
  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的过程。

  1. 相机外参R,t:从世界坐标系转换到相机坐标系。这一步是从三维点到三维点的转换
  2. 相机内参:从相机坐标系到图像坐标系,这一步是三维点到二维点的转换

(这一部分其实是跟图形学中正交变换和投影变换非常相关,放到图形学知识中再写)

常见的C++线性代数库:

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,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边缘检测

  1. 用高斯一阶偏导核对图像进行滤波,求出梯度图的幅值与方向
  2. 非极大值抑制:将“宽”的边缘变为“窄”的边缘
  3. 用高阈值先找到边缘,用低阈值再找出与边缘相连的边缘(去除伪边缘)

RANSAC:Random Sample Consensus

随机采样一致性:在一堆样本点中,随机取2个点做一条直线,同时设定一个阈值T,统计样本点到该直线的距离小于T的点的个数(内点), 反复迭代取样本点,做直线,找出内点最多的那条直线。

除此之外,还可以用RanSAC找匹配点。

霍夫变换:

  1. 直角坐标系中的一条直线y=ax+b,也可以写成b=-ax+y,此时当(x,y)固定时,b=-ax+y也是一条直线,只不过是在参数空间(霍夫空间)中
    即直角坐标系中的一条直线y=ax+b,对应霍夫空间中的一个点(a,b),同理霍夫空间上的一条直线b=-ax+y,对应于直角坐标系中的一个点(x,y)
  2. 直角坐标系两点确定一条直线,对应于霍夫空间中两条直线的交点;直角坐标系三点共线,对应于霍夫空间中三条直线的交点
  3. 由于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, 非局部平均。

原理:假设同一幅图像上,有很多相似的纹理,因此再有噪声的区域,可以通过某种方式情况下,将相似的纹理区域来替换噪声区域,从而达到较好的去噪效果,并且不太多的损失细节。

图像增强算法

  1. 直方图均衡化,拉普拉斯LOG,gamma 变换
  2. 图形增强,常见于对图像的亮度,对比度,饱和度,色调等进行调节,增加其清晰度,减少噪点。图像增强往往是多个算法的组合,一般流程为:图像去噪,增加清晰度(对比度),灰度化或者获取图像边缘特征(对图像进行卷积),二值化等等。图像增强方法不同,应用领域不同,事件中需要灵活掌握多张方法。
  3. 图像去噪:等同于低通滤波器(噪声是高频)
    增加清晰度:为高通滤波器
  4. 图像领域中,微分是锐化,积分是模糊

图像锐化:使灰度反差增强,使模糊图像变得清晰

图像模糊:图像收到平均运算或积分运算。

微分运算, 能够突出图像细节,使图像变得更加清晰,laplus是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。

图像增强:对数log变换

由于对数函数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率小,所以经过对数变换,图像较暗区域的对比度将有所提升,增强了图像的暗部细节。

图像增强:Gamma变换

主要用于图像的校正,增强图像对比度,适用于灰度过高或灰度过低的图片修正。对于对比度偏低,并且整体亮度偏高(相机过曝)情况下的图像,增强效果明显。

r值以1为分界,值越小,对低灰度部分的扩展作用就越强(此时类似于log变换);值越大,对图像高灰度部分的扩展作用就越强(此时类似于指数变换)。通过不同的r值,就可以增强低灰度(或者高灰度)部分细节的作用。

一种增强图像对比度的方法:

大的越大,小的越小(可以写一篇论文), 例如[10, 30]变为[-10, 50],可以用以下方法

  1. 求均值:(10+30)/2=20
  2. 求均值范围[10-20, 30-20] 即为[-10,10]
    乘系数,假设为2,即[-10, 10]* 2=[20, 20]
  3. 应用到原范围:[10,30]+[-20, 20]=[-10,50]

图像压缩:

图像压缩:svd,傅里叶变换,基变换(使用小波基与傅里叶基,JEEG使用的是傅里叶基)

图像的边缘检测:

LoG算子:Laplacian of Gaussian算子

先对图形做高斯滤波,然后再求Laplacian二阶导,最后检测滤波结果的零交叉(Zero crossing)可以获得图像或物体的边缘。

边缘检测最常见的几种方法:Sobel算子,Laplacian算子,Canny算子等

  1. Roberts算子(0的方向,即为边的方向)

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算法等

基于域变换的方法:

傅立叶---梅林变换

小波变换。

图像修复:

  1. 面积比较小的,称为Inpainting
  2. 面积大的叫做Image Completion

图像超分:超级分辨率,Super Resolution

基于插值的重建:传统方法

基于概率的重建:反投影,最大后验概率

基于机器学习与深度学习的重建

图像拼接(制作全景图片)常用算法:

就是找关键点的算法:SIFT, SURF, ORB,SuperPoint

SIFT:Scale-Invariant Feature Transform

尺度不变特征转换, 这是一种找关键点的方法。步骤如下:

  1. 构建多尺寸空间(DOG,高斯差分),检测极值点
  2. 利用插值等方法,通过上一步得到的多个极值点,求出关键点
  3. 生成特征描述点:利用直方图统计关键点邻域范围内的像素的梯度方向,求出关键点的主方向,构造描述子

提取尺寸不变区域--》归一化尺寸--》旋转归一化--》特征描述子(最终是:位置 128维向量)

SURF:Speed Up Robust Features

加速稳健特征(也是找关键点)。大致算法与SIFT相同,但比SIFT高效,利用Hessian矩阵的行列式作特征点检测,并用积分图加速运算。

是SIFT的变种,效果没有SIFT好,但速度更快。

ORB: Oriented FAST and Rotated BRIEF

基于FAST 和BRIEF特征描述子提出来,运行时间最快,比较常用与实际生产中

目标运动侦测算法:

  1. 背景差分法
  2. 光流法
  3. 帧差法
展开阅读全文

页面更新:2024-05-10

标签:图像   直方图   坐标系   算子   梯度   灰度   矩阵   函数   像素   方向   知识   技术

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top