龙空技术网

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

极市平台 1502

前言:

现在同学们对“图像相似度算法java”都比较注重,各位老铁们都想要知道一些“图像相似度算法java”的相关资讯。那么小编同时在网上收集了一些关于“图像相似度算法java””的相关文章,希望兄弟们能喜欢,朋友们一起来了解一下吧!

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

来源丨

编辑丨极市平台

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

图像的组成图像的通道与深度

深度:将计算机中存储单个像素所用的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平滑/滤波与梯度算子:

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]

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

滤波:

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

常见的几种滤波器:方框滤波(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]图像压缩:

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

图像的边缘检测:

LoG算子:Laplacian of Gaussian算子

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

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

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

基于域变换的方法:

傅立叶---梅林变换

小波变换。

图像修复:面积比较小的,称为Inpainting面积大的叫做Image Completion图像超分:超级分辨率,Super Resolution

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

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

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

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

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

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特征描述子提出来,运行时间最快,比较常用与实际生产中

目标运动侦测算法:背景差分法光流法帧差法

标签: #图像相似度算法java