计算SAVI出现TypeError: return arrays must be of ArrayType
问题根因
报错来自np.add()的参数误用:
- NumPy中
np.add(x1, x2)的作用是计算x1 + x2,函数的第三个位置参数是out,用来指定计算结果的输出存放对象,要求必须是NumPy数组类型 - 你写的
np.add(ir,r,c)本意是计算ir + r + c,但实际上把浮点数c=0.5传给了要求数组类型的out参数,直接触发了TypeError: return arrays must be of ArrayType错误。
另外原代码里savi = np.zeros(r.size)是冗余代码,后续计算赋值时会直接覆盖这个初始化的数组,没有实际作用。
修正方案
最推荐直接用原生算术运算符实现,可读性强,不会出现API参数记忆错误的问题,逻辑完全匹配SAVI公式:
import numpy as np # SAVI - Soil Adjusted Vegetation Index # 计算公式:SAVI = (ir - red) * (1 + c) / (ir + red + c) c = 0.5 ir = img[:, :, 0].astype('float') r = img[:, :, 2].astype('float') savi = (ir - r) * (1 + c) / (ir + r + c)
如果需要严格使用NumPy的算术函数实现,注意np.add单次仅支持两个操作数相加,需要嵌套调用,不要把待加常数错传给out参数:
savi = np.true_divide( np.multiply(np.subtract(ir, r), 1 + c), np.add(np.add(ir, r), c) )
内容的提问来源于stack exchange,提问作者Jawad
相关产品推荐
相关产品推荐

