参考:
(1) Matlab中gradient函数(梯度计算原理)_夏菠-CSDN博客_matlab求梯度函数
(2)数值梯度 - MATLAB gradient- MathWorks 中国
问题:matlab中求取gradient(F)函数求的是数值上的梯度,那具体是怎么计算的呢?
处理二维数据场景下,假设F为矩阵,
>> x=[6,9,3,4,0;5,4,1,2,5;6,7,7,8,0;7,8,9,10,0]
x =
6 9 3 4 0
5 4 1 2 5
6 7 7 8 0
7 8 9 10 0
>> [Fx,Fy]=gradient(x)
Fx =
3.0000 -1.5000 -2.5000 -1.5000 -4.0000
-1.0000 -2.0000 -1.0000 2.0000 3.0000
1.0000 0.5000 0.5000 -3.5000 -8.0000
1.0000 1.0000 1.0000 -4.5000 -10.0000
Fy =
-1.0000 -5.0000 -2.0000 -2.0000 5.0000
0 -1.0000 2.0000 2.0000 0
1.0000 2.0000 4.0000 4.0000 -2.5000
1.0000 1.0000 2.0000 2.0000 0
计算规则:
1)[Fx,Fy]=gradient(F),Fx为其水平方向上的梯度,Fy为其垂直方向上的梯度,Fx的第一列元素为原矩阵第二列与第一列元素之差,Fx的第二列元素为原矩阵第三列与第一列元素之差除以2,以此类推:Fx(i,j)=(F(i,j+1)-F(i,j-1))/2。
2)最后一列则为最后两列之差。
python 代码
#%% 计算梯度
x = np.arange(0,16)
array = x.reshape((4,4))
print(array)
# 求取梯度
Fx = np.zeros_like(array)
Fy = np.zeros_like(array)
hight,width = array.shape
if hight <2 or width <2:
raise Exception('矩阵的高度或宽度不合适,小于2')
Fx[:,0] = array[:,1]-array[:,0]
Fx[:,-1]= array[:,-1]-array[:,-2]
for xIdx in range(1,width-1):
Fx[:,xIdx] = (array[:,xIdx+1]- array[:,xIdx-1]) /2
print(Fx)
Fy[0,:] = array[1,:]-array[0,:]
Fy[-1,:]= array[-1,:]-array[-2,:]
for yIdx in range(1,hight-1):
Fy[yIdx,:] = (array[yIdx+1,:]- array[yIdx-1,:]) /2
print(Fy)
输出结果: