图像的梯度
在经典的图像信号处理中经常遇到图像梯度的概念,然而对于数字图像而言,其采样空间是离散的,采样步长为单位长度,因此,如果建模需要用到图像梯度,在求解模型的过程中涉及到的数值计算过程就需要计算图像的数值梯度。
在经典的数值分析中,梯度的计算常常采用数值差分来替代,这里我们首先来回顾一下微积分中微分及梯度的概念,以及数值分析中如何去计算微分与梯度。
1. 极限及梯度的概念
在微积分中,极限的定义如下
∂
f
(
x
,
⋅
)
∂
x
=
lim
h
→
0
f
(
x
+
h
,
⋅
)
−
f
(
x
,
⋅
)
h
\frac{\partial f(x,\cdot)}{\partial x}=\lim_{h\rightarrow 0}\frac{f(x+h,\cdot)-f(x,\cdot)}{h}
∂x∂f(x,⋅)=h→0limhf(x+h,⋅)−f(x,⋅)
梯度是一个向量,梯度场是一个向量场概念,梯度变量计算出空间场中某一点在其小邻域内下降最快的方向,这里我们以日常生活中常见的三维空间场
f
(
x
,
y
,
z
)
f(x,y,z)
f(x,y,z)为例,定义其梯度如下
∇
f
(
x
)
=
[
∂
f
(
x
,
y
,
z
)
∂
x
,
∂
f
(
x
,
y
,
z
)
∂
y
,
∂
f
(
x
,
y
,
z
)
∂
x
]
\nabla f(x) = [\frac{\partial f(x,y,z)}{\partial x},\frac{\partial f(x,y,z)}{\partial y}, \frac{\partial f(x,y,z)}{\partial x}]
∇f(x)=[∂x∂f(x,y,z),∂y∂f(x,y,z),∂x∂f(x,y,z)]
2. 数值计算中的梯度计算
在数字计算机中只能处理离散的变量,在数值计算的体系下,常用数值微分来替代理论微分,数值微分根据微分的定义,数值微分常有三种有限差分的计算格式,分别是前向差分,后向差分,中心差分,它们的定义分别为
-
前向差分
∂ f ( x , y , z ) ∂ x ≈ f ( x + h , y , z ) − f ( x , y , z ) h \frac{\partial f(x,y,z)}{\partial x}\approx \frac{f(x+h,y,z)-f(x,y,z)}{h} ∂x∂f(x,y,z)≈hf(x+h,y,z)−f(x,y,z) -
后向差分
∂ f ( x , y , z ) ∂ x ≈ f ( x , y , z ) − f ( x − h , y , z ) h \frac{\partial f(x,y,z)}{\partial x}\approx \frac{f(x,y,z)-f(x-h,y,z)}{h} ∂x∂f(x,y,z)≈hf(x,y,z)−f(x−h,y,z) -
中心差分
∂ f ( x , y , z ) ∂ x ≈ f ( x + h , y , z ) − f ( x − h , y , z ) 2 h \frac{\partial f(x,y,z)}{\partial x}\approx \frac{f(x+h,y,z)-f(x-h,y,z)}{2h} ∂x∂f(x,y,z)≈2hf(x+h,y,z)−f(x−h,y,z)
中心差分的精度优于前向差分与后向差分,以上三种差分在图像处理中用得较多,更高精度的数值微分就不在本文的讨论范围以内了,感兴趣的读者,可以自行去查阅数值分析的相关章节。
数值计算中的梯度,则是采用上述三种有限差分中的一种差分计算方法,计算函数
f
(
x
,
y
,
z
)
f(x,y,z)
f(x,y,z)在三个方向上的差分,构成一个三维向量
[
∂
f
(
x
,
y
,
z
)
∂
x
,
∂
f
(
x
,
y
,
z
)
∂
y
,
∂
f
(
x
,
y
,
z
)
∂
z
]
[\frac{\partial f(x,y,z)}{\partial x},\frac{\partial f(x,y,z)}{\partial y},\frac{\partial f(x,y,z)}{\partial z}]
[∂x∂f(x,y,z),∂y∂f(x,y,z),∂z∂f(x,y,z)]
3. 图像的梯度
在日常使用的图像中,数字图像的采样间隔是均匀的,因此我们取 h = 1 h=1 h=1,因此对于图像而言,其有限差分计算格式为:
-
前向差分
∂ f ( x , y , z ) ∂ x ≈ f ( x + 1 , y , z ) − f ( x , y , z ) \frac{\partial f(x,y,z)}{\partial x}\approx {f(x+1,y,z)-f(x,y,z)} ∂x∂f(x,y,z)≈f(x+1,y,z)−f(x,y,z) -
后向差分
∂ f ( x , y , z ) ∂ x ≈ f ( x , y , z ) − f ( x − 1 , y , z ) \frac{\partial f(x,y,z)}{\partial x}\approx {f(x,y,z)-f(x-1,y,z)} ∂x∂f(x,y,z)≈f(x,y,z)−f(x−1,y,z) -
中心差分
∂ f ( x , y , z ) ∂ x ≈ f ( x + 1 , y , z ) − f ( x − 1 , y , z ) 2 \frac{\partial f(x,y,z)}{\partial x}\approx \frac{f(x+1,y,z)-f(x-1,y,z)}{2} ∂x∂f(x,y,z)≈2f(x+1,y,z)−f(x−1,y,z)
采用上述差分的其中一种,分别计算图像在 x x x方向及 y y y方向的差分,由此组成二维向量即为图像的梯度。
4. 代码实现
依据定义实现
function [gx, gy] = grad(im, diff_option)
% diff_option: 0---forward difference
% 1---backward difference
% 2---central difference
if diff_option == 0
gx = im([2:end, 1], :, :) - im;
gy = im(:, [2:end, 1], :) - im;
elseif diff_option == 1
gx = im - im([end, 1:end-1], :, :);
gy = im - im(:, [end, 1:end-1], :);
elseif diff_option == 2
gx = 0.5 * (im([2:end, 1], :, :) - im([end, 1:end-1], :, :));
gy = 0.5 * (im(:, [2:end, 1], :) - im(:, [end, 1:end-1], :));
else
error('diff_option not supported');
end
end
在通常的图像处理应用中,前向差分与后向差分区别不大,这里把它们合并成一种,另外借助于matlab内置的imfilter来实现
function [gx, gy] = grad_imfilter(im, diff_option)
% diff_option: 0---forward difference
% 1---backward difference
% 2---central difference
if diff_option == 0
h = [1, -1]';
elseif diff_option == 1
h = [1, -1]';
elseif diff_option == 2
h = [1, 0, -1] * 0.5;
else
error('diff_option not supported');
end
gx = imfilter(im, h, 'same', 'circular');
gy = imfilter(im, h', 'same', 'circular');
end
5. 图像梯度计算实例
以cameraman图片为例,计算其梯度
im = imread('cameraman.tif');
im = double(im);
[gx, gy] = grad(im, 2);
figure
subplot(131), imshow(abs(gx), []), title('grad x')
subplot(132), imshow(abs(gy), []), title('grad y')
subplot(133), imshow(sqrt(gx.^2+gy.^2), []), title('grad magitude')