回忆:二维梯度
梯度 = 图像 I(x,y)的偏导数向量 = [dI(x,y)/dx , dI(x,y)/dy]
梯度向量场表示最陡上升的方向和坡度(当考虑图像像素值为一个平面/高度图时)
数值导数
有限前向差分
有限后向差分
有限中心差分:更精准
例子:空间图像梯度
注意:从现在开始,我们将去掉常数因子1/2。我们在后面去除以它。
更具体地说
线性滤波器
一般流程:形成新图像,其像素是原始像素值的加权和,在每个点使用相同的权重集合
性质:输出是输入的一个线性函数;输出是输入的平移不变函数(即输入图像向左移动两个像素,输出也向左移动两个像素)
例子:平均滤波—邻域中像素的平均值
例子:高斯滤波—邻域中像素的加权平均值
例子:找一个导数—邻域中像素的加权平均值
注意:“线性滤波器”中的“线性”表示相邻像素值的线性组合
图像滤波
根据局部领域内像素的某些函数改变图像中的像素
线性滤波
最简单:线性滤波,通过领域内像素值的线性组合去替代每一个像素
线性组合的模块称为“卷积核”
将其视为权加权和 (核指定权重):
100+50+30+40+5*.5+10+10+11+7.5 = 7
当然,我们不想只在一个像素上执行这个操作,而是希望在整个图像上运行这个核”
卷积(二维)
给定一个核(模板)f和图像h,卷积 f * h 定义为
1)注意h(x, y)邻域的奇怪索引。结果就是 f 好像在与 h 组合之前顺时针旋转了180度一样
2)如果 f 有180度的对称性也没关系
3)加入没有关系,那就使用**互相关(cross correlation,图像矩阵和卷积核直接按位点乘,没有旋转180度后再做点乘)**代替
卷积例子
实际问题:边界处理
问题:我们如何处理核不能完全覆盖图像边界的那些像素?
不同的边界处理方法指定了不同的方法来定义图像以外像素的值
最简单的方法之一是补零,也就是我们在前面的例子中默认使用的
实际问题:边界处理
其他方法:
复制—每个图像以外的像素用图像中离它最近的像素值代替
实际问题:边界处理
其他方法:
反射—在边界处反射像素值(好像有一面小镜子)
实际问题:边界处理
其他方法:
环绕—当离开图像的右边框时,将环绕到左边框。类似地,当离开图像底部时,会在顶部重新输入。基本上,图像是一个大甜甜圈(或圆环)。
Matlab中的卷积
可以用conv和conv2,但可以用更新的版本:Imfilter(image,template{,option1,option2,…})
边界选项:常值,对称,复制,圆形
输出尺寸选项:和图像一样,或者全尺寸 (包括当mask在图像外的时候计算的部分值)
Corr或者conv选项:卷积旋转模板(我们之前所讨论的那样)。相关性没有进行旋转。
尝试在命令行中输入“help imfilter”了解更多细节
卷积的性质
交换律: f ∗ g = g ∗ f f * g = g * f f∗g=g∗f
结合律: ( f ∗ g ) ∗ h = f ∗ ( g ∗ f ) (f * g) * h = f * (g * f) (f∗g)∗h=f∗(g∗f)
分配律: ( f ∗ g ) ∗ h = f ∗ h + g ∗ h (f * g) * h = f * h + g * h (f∗g)∗h=f∗h+g∗h
线性: ( a f ∗ b g ) ∗ h = a f ∗ h + b g ∗ h (a f * b g) * h = a f * h + b g * h (af∗bg)∗h=af∗h+bg∗h
平移不变性: f ( x + t ) ∗ h = ( f ∗ h ) ( x + t ) f(x+t) * h = (f * h)(x+t) f(x+t)∗h=(f∗h)(x+t)
微分规则:
线性滤波
F (2m+1)x(2m+1) mask
例如
回到梯度…
有限差分滤波器
用卷积核计算有限差分
垂直边:
卷积:
水平边:
卷积: