多媒体技术--图像处理基础(二)-图像特征

这边主要记录一下图像处理中使用的特征,包括全局特征:直方图;局部特征:Harris角点,SURF,SIFT等

一、全局特征

1、常用的特征

  • 颜色直方图
  • 颜色矩(Color Moments)
  • 方向梯度直方图
  • VLAD :globalized local feature(全局化的局部特征)
颜色直方图

颜色直方图就是把像素值0-255分成多个bin,计算落在每个bin上的像素值的个数即可。
在这里插入图片描述
对于灰度图只要算一次,对于彩色图像,对每个通道做一次。

在这里插入图片描述

如上图:

  • 对于彩色的lena一种生成三个直方图,R、G、B三个通道;
  • 是颜色分布的数据表示
  • 当然两张完全不一样的图片可能会有一样的颜色分布;
  • 也就是说颜色梯度直方图没有那么具有区分度。

Matlab代码:

img1 = imread('lena.jpg');
r1  =im2double(img1(:,:,1))*256;
hr = hist(reshape(r1,[256*256,1]),32);
g1 = im2double(img1(:,:,2))*256;
hg = hist(reshape(g1,[256*256,1]),32);
b1 = im2double(img1(:,:,3))*256;
hb = hist(reshape(b1,[256*256,1]),32);
hist = [hr;hg;hb];
bar(hist)
 

结果图如下:
在这里插入图片描述

颜色空间

一张图片可以用各种颜色空间表示,如RGB、HSV、Lab等

颜色矩(color Moment)
  • 强度值分布(在一个通道上)被看作是一个统计变量
  • 我们可以计算它的矩(通常称为中心矩)
  • 可以用下面这个公式表示:
    在这里插入图片描述
  • 连接的时刻和来自不同块的时刻被串联起来;
  • 这很简单,但相当成功。
HOG:方向梯度直方图

在这里插入图片描述
计算图片的颜色梯度值,梯度是一个向量,里面有向量的方向(orientation)和长度(magnitude):
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

其实就是x方向和y方向上的偏导数,下面我们来讲一下如何求这个偏导数,我们可以把图片看成是一个函数f(x,y),当求导的时候dx = dy = 1,结果如下:

∂ I ( x , y ) ∂ x = I ( x , y ) − I ( x − 1 , y ) \frac{\partial I(x,y)}{\partial x} = I(x,y) - I(x-1,y) xI(x,y)=I(x,y)I(x1,y)

二阶导可以这么算:
∂ 2 I ( x , y ) ∂ x 2 = [ I ( x + 1 , y ) − I ( x , y ) ] − [ I ( x , y ) − I ( x − 1 , y ) ] = [ I ( x + 1 , y ) + I ( x − 1 , y ) ] − 2 ∗ I ( x , y ) \frac{\partial^2 I(x,y)}{\partial x^2} = [I(x+1,y) - I(x,y)] - [I(x,y) - I(x-1,y)] = [I(x+1,y) + I(x-1,y)] - 2* I(x,y) x22I(x,y)=[I(x+1,y)I(x,y)][I(x,y)I(x1,y)]=[I(x+1,y)+I(x1,y)]2I(x,y)

全局特征对比

在这里插入图片描述

二、局部特征

在局部特征中,图片的的边缘比内部重要,而角点又比边缘重要,所以很多方法在处理图像时提取的都是边界或者是角点的信息。

1、Harris角点

原理:
在这里插入图片描述
如上图,在a中,无论我向哪个方向移动,这个方框里的东西都会有变化,但是b和c有一个方向,我们只要沿着那个方向移动,这个片里面的东西是不变的,我们只需要对图片中每个边缘做一个方框移动操作,就能精确找到角点。
在这里插入图片描述

匹配每个能量的变化,w是刚刚说的方框,u和v是x和y的偏移。(具体公式推导请自行百度)

每个点的值为:
在这里插入图片描述
学习一个M,当一个点两个方向的特征值都很大的时候,认为这个点是一个角点:
在这里插入图片描述
在这里插入图片描述

对每个点计算出其Harris值后,利用非极大值抑制来选择局部最优的点

== Harris角点是在X-Y空间中计算的 ==
在这里插入图片描述
如上图,现在我们得到了角点,但是在做图像匹配的时候,我们一般都是使用点和其周围的局部特征,那么对于这个局部的大小应该怎么确定呢?

2、尺度不变特征

我们知道,对于一张图,可能会有许多不同的尺度,所以为了要使得得到的特征是尺度不变的,我们需要对不同尺度的图应用不同的局部区域半径。这里我们拿到一张图后,先对他进行不同高斯核的平滑操作,就会得到一系列的图,这些图其实我们可以认为就是不同尺度的。如下:
在这里插入图片描述

一开始我们在X-Y平面上做最大值选择,现在我们在该图的上下两个 σ \sigma σ上选最大值,选到的最大值我们就认为它是尺度不变的,因为它无论是在自己平面上还是金字塔上都是最大的。
在这里插入图片描述

那我们的目标就是找到一个函数表示,使得我们总能在某一个 σ \sigma σ处找到极值。这个函数拥有的峰值越少越好。
在这里插入图片描述

不幸的是,刚刚提到的Harris对于尺度变化是敏感的,而LOG是一个性能比较好的函数表示。LoG公式如下:
在这里插入图片描述

后来人们发现DOG是LOG的一个近似计算,而且DOG比LOG好计算很多,实际上这两个都被广泛应用。

尺度不变特征计算流程

1、在进行了不同 σ s \sigma s σs高斯平滑图片上求Harris角点;(这里可以看下图,对一个尺度的图片,一共做了三次平滑,然后再在这三个平面内找用LOG找Harris点)
2、对于相同的 σ s \sigma s σs建立LOG金字塔;
3、选择特征点,使得该特征点在Harris平面和LOG空间里都最大。
在这里插入图片描述

在这里插入图片描述

左边图是有圈的,这个圈就代表我们找到的局部区域,也就是我们在哪个 σ \sigma σ上得到最大值,这个 σ \sigma σ就作为圈的半径。

Hessian矩阵

在尺度不变特征中,Hessian是一种被广泛应用的特征:在SURF中被应用
在这里插入图片描述

Hessian矩阵作者提出来的时候还使用了积分图来加快计算速度。Hessian在做的时候也是一开始使用不同半径的高斯函数作用在原图上得到一个金字塔,然后再对图像求偏导。这边使用了一个trick,就是先在高斯核上求偏导,然后再做卷积,得到的结果是一样的。
在这里插入图片描述

对于给定的高斯核,他们直接把它二值化:
在这里插入图片描述
此时Hessian矩阵的行列式值近似为:

D e t ( H ) ≈ D x x ∗ D y y − 0.9 ∗ D x y 2 Det(H) \approx D_{xx}*D_{yy} - 0.9*D_{xy}^2 Det(H)DxxDyy0.9Dxy2

积分图计算如下:
在这里插入图片描述

也就是每个格子的值等于其左上角区域的值累加。

  • 积分图比原图大一行一列;
  • 积分图是为了加快卷积操作;
  • 使用积分图比Hessian快五倍;
  • 比DoG快三倍;
  • blocks分的越大,速度提升越显著

3、旋转不变特征

在这里插入图片描述
如上图,图像旋转了,但我们还是希望能得到正确的匹配。那如何解决这个问题呢,David等人提出的SIFT特征就能解决这个事情。
SIFT特征可以总结如下:

  • 对局部建立一个梯度直方图;
  • 把密度最高的那个方向作为这个局部区域的主方向;
  • 将这个局部区域旋转到这个主方向;
  • 通过不同旋转操作的各个区域现在看起来是一样的。

在这里插入图片描述

对于每个patch都计算自己的主方向。
Matlab代码:

clear;
img = imread('lena.jpg');
img1 = im2double(img(:,:,1))*256;
figure(1);
imshow(img);
sz = size(img1);
[dx,dy] = gradient(img1);
[X,Y] = meshgrid(1:1:sz(1),1:1:sz(1));
Y = flipud(Y);
figure(2);
quiver(X,Y,dx,dy,'LineWidth',1.9);
orient = atan2(dy,dx)+pi;
figure(3);
r = reshape(orient,[256*256,1]);
h =  hist(reshape(orient,[256*256,1]),32);
bar(h)

对于lena结果如下:
在这里插入图片描述

值得注意的是,SIFT在将方向叠加时,并不是所有的方向都能准确落到一个bin上,所以需要对他进行分割叠加到最近的两个bin上,本文后面一些会仔细讲一个这个部分。

4、仿射变换不变性

仿射变换是由于拍照是视角不一样导致的。如下:
在这里插入图片描述
我们需要将不同形状和方向的椭圆归一化成半径一样的圆。

在这里插入图片描述

我们可以认为圆经过一系列的仿射变换后变成了椭圆区域。

仿射变换可以用Harris或者Hessian矩阵估计,主要流程:
在这里插入图片描述

  • 初始化T=E
  • 计算矩阵 M = H ( x , y , σ ) M = H(x,y,\sigma) M=H(x,y,σ)
  • 使用 M − 1 M^{-1} M1来归一化(x,y)周围的区域;
  • 检查 e 1 e 2 ≈ 1 \frac{e_1}{e_2}\approx 1 e2e11
  • T = T ∗ M − 1 T = T*M^{-1} T=TM1
  • 转到第二步,直到 e 1 e 2 \frac{e_1}{e_2} e2e1接近1

在这里插入图片描述

上图对于一张图片只选30个点,椭圆区域由Hessian矩阵估计,这样我们可以得到对应的椭圆区域。
在这里插入图片描述

5、翻转不变性(镜像不变)

在这里插入图片描述

SIFT对翻转操作是敏感的,所以当图片镜像后就匹配不出来了。
但是我们如何判断一个图片是否进行了翻转操作,这里提出了一个环形的方向梯度:

环形防线梯度定义:对于每个点的梯度,分解为圆心与这个点连接方向和垂直这个线方向的两个分量,然后将整张图所有切线方向的值直接累加,会得到一个值,若大于0我们认为是顺时针,小于0则是逆时针。如下图,若图像发生翻转变换时,m方向会相反,这里我们只需要计算出这个patch的环形方向梯度,若大于0则不变,若小于0则翻转。这是赵万磊老师提出的方法,感兴趣的可以去他的主页找这个论文。
在这里插入图片描述

6、SIFT特征点

SIFT特征提出后,被广泛应用在各个领域,后来一些任务上被深度特征代替,但是在图像拼接的应用还是使用的SIFT特征点。

预处理:

  • 将图片归一化成 2 d ∗ 2 d 2d *2d 2d2d
  • 计算每个patch的梯度

SIFT生成

  • 将一个patch又分成4*4的网格;
  • 对于每个格计算梯度直方图,这里直方图分成8个bin;
  • 然后将16个格的直方图连接起来,得到一个 8 ∗ 4 ∗ 4 8*4*4 844维的向量,这就是SIFT特征向量

在这里插入图片描述
当然我们一开始拿到的图片尺寸都是不一样的,所以还是需要对patch进行归一化操作,归一化操作如上。假设我们的归一化后的图T尺度是 40 ∗ 40 40*40 4040,这是我们的一个目标X是 10 ∗ 10 10*10 1010,这个时候我们在T上循环,在X上找能对上的值就可以了,这样可以保证T中每个点都有值。

在这里插入图片描述

说一下之前提到的每个点的方向不会都正好落在一个bin上,这个时候假设这个点的梯度方向为 θ \theta θ它的值介于 θ i \theta_i θi θ i + 1 \theta_{i+1} θi+1之间,这个点在 θ i \theta_i θi上的权重w由一下公式算出:
w = 1 − ∣ θ − θ i ∣ π 4 w =1 - \frac{|\theta - \theta_i|}{\frac{\pi}{4}} w=14πθθi
权重与这个点与bin的距离成反比,然后再把这个点的向量长度按权重分成两份,分别分给两个bin就可以了。
在这里插入图片描述

SIFT的一些应用

目标检测
在这里插入图片描述

SIFT的不足

1、没办法区分不同的纹理
在这里插入图片描述
2、只能匹配局部特征,没有全局效果,没有语义信息
在这里插入图片描述在这里插入图片描述
一些参考网站。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值